Konfiguracja replikacji Multi-Master w OpenDJ

Głównym powodem mojej migracji usług katalogowych z OpenLDAP do OpenDJ jest własnie mechanizm replikacji, a raczej jego niezbyt przewidywalne działanie w OpenLDAP. Dopóki w katalogu znajdowało się mniej niż 5 tys. entry to nie miałem powodów do narzekań. Problemy zaczęły się gdy wrzuciłem do katalogu LDAP około 40 tys. wpisów. W dodatku, co ciekawe problemy zwykle występują przy masowym usuwaniu a nie dodawaniu entry.

Wszyscy znani mi fachowcy zajmujący się LDAPem, kiedy zacząłem wypytywać o możliwe przyczyny stwierdzili jednomyślnie, że znane są im problemy z replikacją w OpenLDAP przy liczbie entry idącej w dziesiątki tysięcy. Na pytanie jak rozwiązać ten problem usłyszałem, że OpenLDAPa stosują dla małej ilości, tak do 5 tys. entry, powyżej tego instalują DSEE, OpenDS lub OpenDJ.

Ponieważ DSEE przestało być darmowe po przejęciu firmy SUN przez Oracle, to zdecydowałem się na instalację OpenDJ jako następcę serwera OpenDS, tworzonego przez ludzi, którzy po części odeszli z Oracle po przejęciu.

Replikacja posłuży zapewnieniu wysokiej dostępności (HA) usług katalogowych, dlatego też bliźniaczy serwer LDAP skonfiguruję na innym serwerze, w przeznaczonym do tego kontenerze. Po instalacji i ustawieniu środowiska rozpakowałem archiwum z serwerem OpenDJ i zainstalowałem go analogicznie jak w opisie instalacji (link poniżej).

Do konfiguracji dołożyłem możliwość importu zaszyfrowanych haseł (patrz: opis konfiguracji), wgrałem także odpowiednie schematy oraz indeksy (patrz: linki pod artykułem). Innymi słowy, zadbałem o to, aby konfiguracja obu LDAPów była taka sama. Czas na konfigurację replikacji multi-master.

Najpierw należy zadbać o to, aby system widział obie nazwy serwerów LDAP. Najlepiej dopisać je do /etc/hosts. To jest bardzo ważne i bez tego można się spotkać z różnymi dziwnymi problemami, które nawet trudno z tym powiązać. Radzę więc zrobić to od razu, nawet jeśli będziecie używać explicite adresów IP.

root@ldapdj2:/data/var/OpenDJ-2.4.3# vi /etc/hosts
#
# Internet host table
#
::1     localhost
127.0.0.1      localhost loghost
192.168.1.45   ldapdj1
192.168.1.46   ldapdj2 

Oba serwery OpenDJ muszą działać, wtedy uruchamiamy program konfiguracyjny, zrobię to interaktywnie:

root@ldapdj2:~# /data/var/OpenDJ-2.4.3/bin/dsreplication
What do you want to do?

    1)  Enable Replication
    2)  Disable Replication
    3)  Initialize Replication on one Server
    4)  Initialize All Servers
    5)  Pre External Initialization
    6)  Post External Initialization
    7)  Display Replication Status
    8)  Purge Historical

    c)  cancel

Enter choice: 1


>>>> Specify server administration connection parameters for the first server

Directory server hostname or IP address [ldapdj2]: ldapdj1

Directory server administration port number [4444]: 

How do you want to trust the server certificate?

    1)  Automatically trust
    2)  Use a truststore
    3)  Manually validate

Enter choice [3]: 

Global Administrator User ID, or bind DN if no Global Administrator is defined
[admin]: cn=dirmgr

Password for user 'cn=dirmgr': 

Server Certificate:

User DN  : CN=ldapdj1, O=Administration Connector Self-Signed Certificate
Validity : From 'Mon Jul 11 12:20:17 CEST 2011'
             To 'Wed Jul 10 12:20:17 CEST 2013'
Issuer   : CN=ldapdj1, O=Administration Connector Self-Signed Certificate


Do you trust this server certificate?

    1)  No
    2)  Yes, for this session only
    3)  Yes, also add it to a truststore
    4)  View certificate details

Replication port for the first server (the port must be free) [8989]: 

Do you want replication to use encrypted communication when connecting to
replication port 8989 on the first server? (yes / no) [no]: 



>>>> Specify server administration connection parameters for the second server

Directory server hostname or IP address [ldapdj2]: 

Directory server administration port number [4444]: 

Global Administrator User ID, or bind DN if no Global Administrator is defined
[admin]: cn=dirmgr

Password for user 'cn=dirmgr': 
Replication port for the second server (the port must be free) [8989]: 

Do you want replication to use encrypted communication when connecting to
replication port 8989 on the second server? (yes / no) [no]: 

You must choose at least one base DN to be replicated.
Replicate base DN dc=domain,dc=tld? (yes / no) [yes]: 

Establishing connections ..... Done.
Checking registration information ..... Done.
Configuring Replication port on server ldapdj1:4444 ..... Done.
Configuring Replication port on server ldapdj2:4444 ..... Done.
Updating replication configuration for baseDN dc=domain,dc=tld on server ldapdj1:4444 ..... Done.
Updating replication configuration for baseDN dc=domain,dc=tld on server ldapdj2:4444 ..... Done.
Updating registration configuration on server ldapdj1:4444 ..... Done.
Updating registration configuration on server ldapdj2:4444 ..... Done.
Updating replication configuration for baseDN cn=schema on server ldapdj1:4444 ..... Done.
Updating replication configuration for baseDN cn=schema on server ldapdj2:4444 ..... Done.
Initializing registration information on server ldapdj2:4444 with the contents of server ldapdj1:4444 ..... Done.
Initializing schema on server ldapdj2:4444 with the contents of server ldapdj1:4444 ..... Done.

Replication has been successfully enabled.  Note that for replication to work you must initialize the contents of the base DN's that are being replicated (use dsreplication initialize to do so).

See /var/tmp/opends-replication-3358902381985550693.log for a detailed log of
this operation.

Trzeba podać dane serwera źródłowego i docelowego dla replikacji i dane Globalnego Administratora, lub użytkownika mającego uprawnienia do konfiguracji tegoż. Sprawdzam status replikacji (OpenDJ/bin mam w ścieżce):

root@ldapdj2:~# dsreplication 
What do you want to do?

    1)  Enable Replication
    2)  Disable Replication
    3)  Initialize Replication on one Server
    4)  Initialize All Servers
    5)  Pre External Initialization
    6)  Post External Initialization
    7)  Display Replication Status
    8)  Purge Historical

    c)  cancel

Enter choice: 7


>>>> Specify OpenDS LDAP connection parameters

Directory server hostname or IP address [ldapdj2]: ldapdj1

Directory server administration port number [4444]: 

How do you want to trust the server certificate?

    1)  Automatically trust
    2)  Use a truststore
    3)  Manually validate

Enter choice [3]: 1

Global Administrator User ID [admin]: 

Password for user 'admin': 

dc=domain,dc=tld - Replication Enabled
========================================
Server       : Entries : M.C. (1) : A.O.M.C. (2) : Port (3) : Security (4)
-------------:---------:----------:--------------:----------:-------------
ldapdj1:4444 : 43746   : 0        : N/A          : 8989     : Disabled
ldapdj2:4444 : 1       : 0        : N/A          : 8989     : Disabled

[1] The number of changes that are still missing on this server (and that have been applied to at least one of the other servers).
[2] Age of oldest missing change: the date on which the oldest change that has not arrived on this server was generated.
[3] The port used to communicate between the servers whose contents are being replicated.
[4] Whether the replication communication through the replication port is encrypted or not.

W źródłowym katalogu LDAP jest 43746 entry a w docelowym tylko jeden (bazowy), pora zainicjalizować ldapdj2 danymi z ldapdj1. Ważne aby dobrze określić kierunek, żeby się nie okazało, że zamiast w obu mieć 43 tys. wpisów to w obu mamy po jednym 😉

root@ldapdj2:~# dsreplication 
What do you want to do?

    1)  Enable Replication
    2)  Disable Replication
    3)  Initialize Replication on one Server
    4)  Initialize All Servers
    5)  Pre External Initialization
    6)  Post External Initialization
    7)  Display Replication Status
    8)  Purge Historical

    c)  cancel

Enter choice: 3


>>>> Specify server administration connection parameters for the source server

Directory server hostname or IP address [ldapdj2]: ldapdj1

Directory server administration port number [4444]: 

How do you want to trust the server certificate?

    1)  Automatically trust
    2)  Use a truststore
    3)  Manually validate

Enter choice [3]: 3

Global Administrator User ID [admin]: 

Password for user 'admin': 

Server Certificate:

User DN  : CN=ldapdj1, O=Administration Connector Self-Signed Certificate
Validity : From 'Mon Jul 11 12:20:17 CEST 2011'
             To 'Wed Jul 10 12:20:17 CEST 2013'
Issuer   : CN=ldapdj1, O=Administration Connector Self-Signed Certificate


Do you trust this server certificate?

    1)  No
    2)  Yes, for this session only
    3)  Yes, also add it to a truststore
    4)  View certificate details

Enter choice [2]: 


>>>> Specify server administration connection parameters for the destination
server

Directory server hostname or IP address [ldapdj2]: 

Directory server administration port number [4444]: 

You must choose at least one base DN to be initialized.
Initialize base DN dc=domain,dc=tld? (yes / no) [yes]: 

Initializing the contents of a base DN removes all the existing contents of
that base DN.  Do you want to remove the contents of the selected base DN's on
server ldapdj2:4444 and replace them with the contents of server ldapdj1:4444?
(yes / no) [yes]: 


Initializing base DN dc=domain,dc=tld with the contents from ldapdj1:4444:
0 entries processed (0 % complete).
4843 entries processed (11 % complete).
12823 entries processed (29 % complete).
30104 entries processed (68 % complete).
43373 entries processed (99 % complete).
43740 entries processed (99 % complete).
Base DN initialized successfully.

See /var/tmp/opends-replication-1031665462980592921.log for a detailed log of
this operation.

Sprawdzam status replikacji:

root@ldapdj2:~# dsreplication status  


>>>> Specify OpenDS LDAP connection parameters

Directory server hostname or IP address [ldapdj2]: 

Directory server administration port number [4444]: 

Global Administrator User ID [admin]: 

Password for user 'admin': 
The Certificate presented by the server ldapdj1:4444 could not be trusted.
Possible reasons for this error:
-The Certificate Authority that issued the certificate is not recognized (this
is the case of the self-signed certificates).
-The server's certificate is incomplete due to a misconfiguration.
-The server's certificate has expired.
-There is a time difference between the server machine clock and the local
machine clock.
Before accepting this certificate, you should examine the server's certificate
carefully.

Server Certificate:

User DN  : CN=ldapdj1, O=Administration Connector Self-Signed Certificate
Validity : From 'Mon Jul 11 12:20:17 CEST 2011'
             To 'Wed Jul 10 12:20:17 CEST 2013'
Issuer   : CN=ldapdj1, O=Administration Connector Self-Signed Certificate


Do you trust this server certificate?

    1)  No
    2)  Yes, for this session only
    3)  Yes, also add it to a truststore
    4)  View certificate details

Enter choice [2]: 

dc=domain,dc=tld - Replication Enabled
========================================
Server       : Entries : M.C. (1) : A.O.M.C. (2) : Port (3) : Security (4)
-------------:---------:----------:--------------:----------:-------------
ldapdj1:4444 : 43746   : 0        : N/A          : 8989     : Disabled
ldapdj2:4444 : 43746   : 0        : N/A          : 8989     : Disabled

[1] The number of changes that are still missing on this server (and that have been applied to at least one of the other servers).
[2] Age of oldest missing change: the date on which the oldest change that has not arrived on this server was generated.
[3] The port used to communicate between the servers whose contents are being replicated.
[4] Whether the replication communication through the replication port is encrypted or not.

„That’s all folks” jak to zwykle pokazuje się na końcu kreskówki o Króliku Bugsie 🙂 Replikacja jest skonfigurowana i zainicjalizowana. Każda zmiana w jednym z serwerów będzie zaraz odwzorowana w drugim.

Może Ci się również spodoba

Dodaj komentarz