1、實驗環境說明
用於做OpenLDAP同步的兩臺機器的IP分別爲: 192.168.1.35(Master), 192.168.1.36(Slave)
操作系統: CentOS 6.5 x64 , 並且已經安裝好 OpenLDAP ,其管理員爲 cn=Manager,dc=test,dc=com, 管理員密碼: ldap
實驗環境: VMware Workstation , 可以先安裝好 Master, 然後直接克隆一個鏡像作爲 Slave
OpenLDAP 安裝配置請參考: OpenLDAP安裝與基本配置
2、實驗目的
爲了避免單點故障,通常都會採用雙機環境。使用OpenLDAP複製同步功能,保持Master 與 Slave 的數據一致性。
Ldap Master : 提供所有的更新、修改
Ldap Slave : 提供給各種應用(jira, zabbix, svn ...)調用
配置過程相當坎坷。
生產環境中,ldap server都部署2臺,做主從配置,這樣可以提供目錄服務的高可用性,兩臺ldap服務器之間自動同步數據。配置openldap主從結構,或許網上會有很多的文章或者博客介紹,但是絕大部分都是基於2.3的版本,注意2.3的主從配置是不適用於2.4的,所以如果要使用openldap2.4配置主從結構,在搜索的時候要注意。然而,即使百度了也會發現,網上只有寥寥幾篇關於 openldap 2.4的主從配置文檔,而且還都是淺嘗輒止,當然,文章的作者可能已經對配置神而明之了,但是讀者看了之後絕對會“暈而乎之”的,大多數的高手就甩給你一個slapd.conf針對replication的配置,然後就沒有然後了。沒轍,爲了能get這個技能,只有×××了,Google了一下,其實有用的也就是官方的administrator手冊,看手冊是最能理解replication是怎麼一回事兒的,但是前提是你有耐心,而且英語可以還不能較真(因爲裏面的句子真心覺得翻譯起來不是那麼回事兒),好吧,原來Google上關於這方面的文檔也不是很多,最後也只能看官方手冊,然後自己動手了。
3、實現原理
其實現原理如下圖,當在主服務器上更新數據時,該更新通過更新日誌記錄,並將更新複製到從服務器上。當在從服務器上更新數據時,該更新請求將重定向給主服務器,然後主服務器將更新數據複製到從服務器。
4、配置過程(syncrepl 模式)
注意:在進行下面的操作前,請先確保你的OpenLDAP 已經正常安裝。
4.1 OpenLDAP 前期配置準備
同步數據初始化
在Master 與 Slave 上都執行,清除LDAP數據庫的數據:
# ldapdelete -x -D "cn=Manager,dc=test,dc=com" -w ldap -r "dc=test,dc=com"# 準備 ldif 數據# cat /tmp/base.ldif dn: dc=test,dc=com dc: testobjectClass: topobjectClass: domain dn: ou=People,dc=test,dc=com ou: People objectClass: topobjectClass: organizationalUnit dn: ou=Group,dc=test,dc=com ou: Group objectClass: topobjectClass: organizationalUnit# 分別在 Master, Slave 導入# ldapadd -x -D "cn=Manager,dc=test,dc=com" -w ldap -f /tmp/base.ldif
4.2 主服務器(Master)配置
1、首先停止 slapd 服務
# service slapd stop
2、編輯 /etc/openldap/slapd.conf配置文件
# cp /etc/openldap/slapd.conf /etc/openldap/slapd.conf.bak# vim /etc/openldap/slapd.confmodulepath /usr/lib/openldap modulepath /usr/lib64/openldap moduleload syncprov.la index entryCSN,entryUUID eq overlay syncprov syncprov-checkpoint 100 10 syncprov-sessionlog 100
注:這裏對slapd.conf文件所做的修改如下:
1)取消了modulepath /usr/lib/openldap, modulepath /usr/lib64/openldap 之前的註釋
2)取消了moduleload syncprov.la之前的註釋
3)在index nisMapName,nisMapEntry eq,pres,sub 這一行之後添加如下內容:
# master replia server start
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
3、配置好,重點來了!!!
你直接啓動ldap(/etc/init.d/slapd start)是不讀新的配置的,以我暫且的測試結果來講是發現這麼個情況的!
所以,要這樣
#刪除就得配置緩存(暫且這麼理解吧), 如果生產環境,建議先備份rm -rf /etc/openldap/slapd.d/*#測試# slaptest -u#生成新的slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/chown -R ldap:ldap /etc/openldap/slapd.d/#如果前面2條命令都是 succeeded, 就可以重啓slapd服務了#最後一步,重啓slapd服務,至此主節點的配置完成。service slapd restart
4.3 從服務器(Slave)配置
1、首先停止 slapd 服務
# service slapd stop
2、編輯 /etc/openldap/slapd.conf配置文件
# cp /etc/openldap/slapd.conf /etc/openldap/slapd.conf.bak# vim /etc/openldap/slapd.confmodulepath /usr/lib/openldap modulepath /usr/lib64/openldap moduleload syncprov.la index entryCSN,entryUUID eq syncrepl rid=123 provider=ldap://192.168.1.35:389 type=refreshOnly retry="5 5 300 5" interval=00:00:01:00 searchbase="dc=test,dc=com" filter="(objectClass=*)" scope=sub attrs="*" schemachecking=off bindmethod=simple binddn="cn=Manager,dc=test,dc=com" credentials=ldap
注:這裏對slapd.conf文件所做的修改如下:
1)取消了modulepath /usr/lib/openldap,modulepath /usr/lib64/openldap之前的註釋
2)取消了moduleload syncprov.la之前的註釋
3)在index nisMapName,nisMapEntry eq,pres,sub這一行之後添加如下內容:
# slave replica statement start
syncrepl rid=123 provider=ldap://192.168.1.35:389
type=refreshOnly
interval=00:00:01:00
searchbase="dc=test,dc=com"
scope=sub
attrs="*"
schemachecking=off
bindmethod=simple
binddn="cn=Manager,dc=test,dc=com"
credentials=123456
3、配置好,重點來了!!!
你直接啓動ldap(/etc/init.d/slapd start)是不讀新的配置的,以我暫且的測試結果來講是發現這麼個情況的!
所以,要這樣
#刪除就得配置緩存(暫且這麼理解吧), 如果生產環境,建議先備份rm -rf /etc/openldap/slapd.d/*#測試# slaptest -u#生成新的slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/chown -R ldap:ldap /etc/openldap/slapd.d/#如果前面2條命令都是 succeeded, 就可以重啓slapd服務了#最後一步,重啓slapd服務,至此主節點的配置完成。service slapd restart
4.4 測試數據同步
1、在 Master 上準備測試數據,添加一個新用戶
# cat /tmp/passwd.ldif dn: uid=ldap,ou=People,dc=test,dc=com uid: ldap cn: LDAP User objectClass: account objectClass: posixAccount objectClass: topobjectClass: shadowAccount userPassword: {crypt}!!shadowLastChange: 17334 loginShell: /sbin/nologin uidNumber: 55 gidNumber: 55 homeDirectory: /var/lib/ldap gecos: LDAP User
2、然後在 Master 導入
# ldapadd -x -D "cn=Manager,dc=test,dc=com" -w ldap -f /tmp/passwd.ldif
3、在Master和Slave上面分別查詢
# ldapsearch -x -H ldap://192.168.1.35 -b "dc=test,dc=com" |grep uid=ldapdn: uid=ldap,ou=People,dc=test,dc=com# ldapsearch -x -H ldap://192.168.1.36 -b "dc=test,dc=com" |grep uid=ldapdn: uid=ldap,ou=People,dc=test,dc=com
4、在Master 和 Slave 上查看同步日誌記錄
# tail -f /var/log/ldap.log
要點1 在配置數據複製前 保證主備初始化數據的一致
2 停掉主服務器 更改主服務器的配置文件
3 停掉備服務器 更改備服務器的配置文件
4 重起 主備服務器進程
5 驗證同步