С протоколами X.500 я не знаком, поэтому могу рассаказать то, что знаю о LDAP, точнее о реализации LDAP от OpenLDAP. По механизму отсылок. В OpenLDAP можно настроить так называемые общие отсылки, а также делегирование полномочий. Общие отсылки будут возвращаться клиенту, когда, во-первых, сервер не может удовлетворить запрос клиента путём поиска в своих DIT, а во вторых, сервер настроен на возврат таких отсылок (иначе он будет возвращать ошибку). Обычно общие отсылки настраиваются на вышестоящий (глобальный) сервер, теоретически способный удовлетворить запрос клиента. Например, сервер обслуживает DIT с суффиксом dc=dep1,dc=mycompany,dc=ru и настроен на возврат общей отсылки с URL ldap://global-ldap.mycompany.ru . Тогда при поступлении запроса от клиента с базой поиска, отличной от dc=dep1,dc=mycompany,dc=ru, например dc=dep2,dc=mycompany,dc=ru или dc=mycompany,dc=org , клиенту будет возвращена отсылка на ldap://global-ldap.mycompany.ru . Таких отсылок можно настроить несколько на одном сервере, клиенту будут возвращаться все.
Делегирование полномочий -- противоположная ситуация, когда вышестоящий сервер делегирует полномочия по обслуживанию части своего DIT нижестоящему. Например, сервер, обслуживающий DIT с суффиксом dc=mycompany,dc=ru при поступлении запроса с базой поиска dc=dep1,dc=mycompany,dc=ru возвращает клиенту отсылку с URL того сервера, который обслуживает данный участок DIT. Делегирование полномочий реализуется с помощью так называемых именованных отсылок, то есть специальных записей в DIT с объектным классом referral, в атрибуте ref которого находится URL соостветствующего нижестоящего сервера. Пример:
dn: dc=dep1,dc=mycompany,dc=ru
objectClass: referral
objectClass: extensibleObject
dc: dep1
ref: ldap://dep1-ldap.mycompany.ru/dc=dep1,dc=mycompany,dc=ru
Такие записи добавляются и редактируются вручную. Чтобы при обращении к записи не возвращалась отсылка, клиент при запросе должен использовать элемент управления ManageDsaIT (параметр -M в консольных утилитах OpenLDAP). Именованные отсылки описаны в RFC 3296.
Есть, наконец, такая штука, как сцепление, то есть соответствующим образом настроенный сервер вместо возвращения клиенту отсылки сам выполняет запрос к следующему серверу и, возможно, к следующему и т.д. по цепочке, пока не получит результат, и этот результат вернётся клиенту.
Про механизм отсылок можно почитать в RFC 3296 (
http://www.rfc-editor.org/rfc/rfc3296.txt), в руководстве администратора OpenLDAP (
http://pro-ldap.ru/tr/admin24/referrals.html), и в учебнике LFRS (
http://www.zytrax.com/books/ldap/ch7/referrals.html -- перевод скоро будет).
Надеюсь, я ответил на большинство Ваших вопросов по отсылкам, кроме, наверное, этого:
- Как сервер LDAP возвращает ответ, если часть запроса выполняется на текущем сервере, а для остального его надо отослать к другому серверу.
Честно говоря, ответа на него я не знаю, надо проверять.
Теперь о репликации. В OpenLDAP используется протокол LDAP Content Synchronization (RFC 4533). Этот RFC имеет статус экспериментального и выдвинут самими разработчиками OpenLDAP, поэтому у меня нет никакой уверенности, что он поддерживается другими реализациями LDAP-серверов. Стоит сказать, что механизм репликации в OpenLDAP сам по себе интересен и реализован довольно хорошо. Существуют и другие RFC по теме репликации (RFC 3384, RFC 4373), но они имеют статус информационных, и я не знаю, реализованы ли они где-нибудь. Про репликацию, кроме RFC, можно почитать ещё в руководстве администратора OpenLDAP (
http://pro-ldap.ru/tr/admin24/replication.html), и в учебнике LFRS (
http://www.zytrax.com/books/ldap/ch7/index.html -- перевод, опять же, скоро будет опубликован).
Теперь про неудобства и костыли. Несомненно, они есть у любой программы. Многое зависит от проектирования каталога, что в свою очередь, зависит от тех задач, которые Вы планируете решать с его помощью. Если говорить в целом -- OpenLDAP вполне зрелый продукт, пригодный для эксплуатации в промышленных масштабах. А чтобы обсуждать детали, ставьте более конкретные вопросы.
Егор