В какой-то момент понадобилось старую схему LDAP с одиноким сервисом переделать в что-то более надежное и устойчивое, способное выдерживать сбои и держать большую нагрузку. После недолгих изысканий было принято решение реализовать схему мастер-мастер. Удобство данной схемы в равноценности всех серверов в реплике и возможность вносить изменения на любом сервере. Устанавливать буду на сервера с Debian Linux тут это довольно просто делается. Конфиги будут хранится в самом LDAP и тоже будут реплицироваться между серверами. Сервера будут server1.prod.local и server2.prod.local. Итак, поехали.
Устанавливаем необходимые пакеты
apt-get install slapd ldap-utils
Далее начинаем прописывать конфиги, конфиги будут храниться в самом LDAP так что будем все конфигурить через ldiff с помощью команды
ldapmodify -Y EXTERNAL -H ldapi:/// -f 1.ldiff
На обоих серверах прописываем ID – ServerID (у каждого сервера свой) следующим ldiff
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 1
Добавляем пароль для сервиса репликации конфигов на обоих серверах
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: jcb8332jf30
Включаем модуль для репликации syncprov на обоих серверах
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {1}syncprov.la
На обоих серверах прописываем сервера с которыми у нас будет проходить репликация
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 1 ldap://server1.prod.local
olcServerID: 2 ldap://server2.prod.local
Добавляем оверлей на обоих серверах чтобы пошла репликация
dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
Включаем репликацию конфигов, это тоже делаем на обоих серверах
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldap://server1.prod.local binddn="cn=admin,cn=config"
bindmethod=simple credentials=ck3u8gj3
searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=002 provider=ldap://server2.prod.local binddn="cn=admin,cn=config"
bindmethod=simple credentials=ck3u8gj3
searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
Теперь репликация конфигов работает и все остальные действия можно выполнять на одном из серверов.
Далее нужно включить репликацию для нашей основной базы где у нас содержаться или будут содержаться все данные, база у нас пусть называется prod.
Для начала создадим пользователя для репликации, т.к. создаваться он должен в самой базе, то создавать его надо командой
ldapmodify -vvvvv -D "cn=admin,dc=prod" -W -H ldapi:/// -f sync.diff
dn: cn=sync,dc=prof
changetype: add
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: sync
description: Syncrepl user for mirrormode operation
userPassword: {SSHA}n+8YKycr9Q/GpuCf4sDfSOQ+zg3csv3Ae
Прописываем тем же способом acl
dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=proxy,dc=prod" read by dn="cn=manager,dc=prod" write by dn="cn=sync,dc=prod" read by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=prod" write by * read
Включаем репликацию
dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcSyncrepl
olcSyncrepl: rid=003 provider=ldap://server1.prod.local bindmethod=simple binddn="cn=sync,dc=fs" credentials=vkj48gfj searchbase="dc=prod" schemachecking=on type=refreshAndPersist retry="5 5 300 5" timeout=1
olcSyncRepl: rid=004 provider=ldap://server1.prod.local binddn="cn=sync,dc=prod" bindmethod=simple credentials=vkj48gfj searchbase="dc=prod" schemachecking=on type=refreshAndPersist retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
Добавляем индексы на нужные поля
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: objectClass eq
olcDbIndex: cn eq
olcDbIndex: gidNumber eq
olcDbIndex: memberUid eq
olcDbIndex: uid eq
olcDbIndex: uidNumber eq
olcDbIndex: uniqueMember eq
olcDbIndex: accessTo eq
olcDbIndex: entryUUID eq
После этого нужно выключить сервер slapd (/etc/init.d/slapd stop) и выполнить команду
slapindex
Которая создаст необходимые индексы для базы. И включить сервер. Это надо сделать на обоих серверах
Добавляем лимиты чтобы все работало без ошибок даже при большом количестве полей
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcLimits
olcLimits: dn.exact="cn=sync,dc=prod" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
-
add: olcSizeLimit
olcSizeLimit: 10000
-
replace: olcDbConfig
olcDbConfig: {0}set_cachesize 0 209715200 1
olcDbConfig: {1}set_lk_max_objects 1024000
olcDbConfig: {2}set_lk_max_locks 10240
olcDbConfig: {3}set_lk_max_lockers 10240
В целом конфигурация основных моментов закончена, репликация баз где конфиги и базы где хранятся данные уже работает.
Настраиваем бекап, бекап делается через простой скриптик
backup.sh
#!/bin/sh
YMD=`date +%Y.%m.%d-%HHours`;
slapcat > /etc/ldap/ldap.ldiff;
cd /root/ldap-backup/files;
tar c /etc/ldap/ >$YMD-server1-ldap-etc.tar; gzip $YMD-server1-ldap-etc.tar;
В случае необходимости восстановиться из бекапа делаем это так
restore.sh
#!/bin/sh
/etc/init.d/slapd stop;
rm /var/lib/ldap/*;
rm /root/ldap-backup/etc -rf;
slapadd -l /root/ldap-backup/etc/ldap/ldap.ldiff;
chown openldap:openldap /var/lib/ldap -R
/etc/init.d/slapd start;
Добавил статью про настройку TLS для соединения с LDAP