PS:最近在搞ldap,當正在進行主從配置的時候,發現裝的2.4.23版本的竟然沒有slurpd這個守護程序的開啟指令。然後上網搜了一下,原來2.4版本以後對主從、主主等模式做了大的改進。然後翻看官方的文檔,将這些記錄了下來。當然此文帶有嚴重的本人了解色彩,是以如果出錯,請見諒!能指出最好。
OpenLdap v2.3之前的同步複制缺點:
slurpd守護程序是以推模式操作 : 主伺服器推送變更的資料到從伺服器 (不可靠)
對replog中的記錄的次序極為敏感
很容易失去同步, 這時需要手工幹預來從主目錄重新同步從伺服器資料庫
如果一個從伺服器長時間停機,replog可能變得太大以至于slurpd無法處理
隻工作在推模式(也可以設定為拉模式,但是這種感覺類似于将master上的資料做了一個快捷連接配接到slave上)
需要停止和重新啟動主伺服器來增加從伺服器
隻支援單一主伺服器複制(1台主對多從)
OpenLDAP v2.4之後的同步功能:
PS:新版最大的功能就是實作了雙向複制,即雙主、多主模式,無論哪一台master當機,都不會影響使用。
新版主從配置有五中方式,這裡隻講述最基本也是最簡單的Syncrepl主從配置、MirrorMode鏡像模式N-Way Multi-Master(多主)三種方式。
Syncrepl
該方式是slave伺服器以拉的方式同步master的使用者資料
該方式缺點:當你修改一個條目中的一個屬性值(or大批量的萬級别的某1屬性值),它不是簡單的同步過來這些屬性,而是把修改的條目一起同步更新來。
Delta-syncrepl
比上一條多了個功能:基于日志同步:
你在master每更改1條記錄,肯定會産生1條日志,那麼slave會通過你的master日志進行相應的修改,這就克服了上一條的缺點。
N-Way Multi-Master
多主方式同步LDAP資訊
MirrorMode
該方式是伺服器互相推送資訊的方式同步使用者資料
MirrorMode隻支援2個主master(2個主master可以+N個slave),但是你如果非得加了3 、4 台master後,那麼其餘的都隻能從前2台master上擷取資料,而不能将本身的資料推送過去。
如果你有類似需求,也可以使用這個方式。(比如,你企業分散點多,然後不希望都具有修改功能,可以使用它)
Syncrepl Proxy
代理同步。
意思是将主master隐藏起來,而代理機上邊通過Syncrepl從master主機以拉的方式同步master使用者資料,當代理主機發生改變時,代理主機的LDAP又以推的方式将資料更新到下屬的slave LDAP伺服器上。slave LDAP 隻有對代理LDAP伺服器的讀權限。
OpenLDAP v2.4 同步功能例子:
①、Syncrepl
由于syncrepl為拉取模式(到master拉資料),是以配置檔案配置slave端的slapd.conf檔案即可。初始化操作2種,1、通過配置檔案,當開啟syncrepl引擎後會到master拉資料;2、從主伺服器備份資料,複制到slave。當從備份資料初始化的時候,不必擔心資料老,因為syncrepl會自動進行校驗,然後進行相應的修改、同步。(當複制一個大規模的“條錄”,建議從備份初始化)
1、配置master端LDAP
上文說了,有五種同步模式,是以需要首先定義一種,另外還需要定義 contextCSN(應該是做同步狀态比對) 和session log。 下面是一個例子:
1
2
3
4
5
6
7
8
9
<code>database bdb</code>
<code>suffix </code><code>dc</code><code>=Example,</code><code>dc</code><code>=com</code>
<code>rootdn </code><code>dc</code><code>=Example,</code><code>dc</code><code>=com</code>
<code>directory </code><code>/var/ldap/db</code>
<code>index objectclass,entryCSN,entryUUID </code><code>eq</code>
<code>overlay syncprov</code>
<code>syncprov-checkpoint 100 10 </code><code>#contextCSN</code>
<code>syncprov-sessionlog 100 </code><code>#session log</code>
2、配置slave端LDAP
10
11
12
13
14
15
16
17
18
<code>database hdb</code>
<code>syncrepl rid=123</code>
<code> </code><code>provider=ldap:</code><code>//provider</code><code>.example.com:389</code>
<code> </code><code>type</code><code>=refreshOnly</code>
<code> </code><code>interval=01:00:00:00</code>
<code> </code><code>searchbase=</code><code>"dc=example,dc=com"</code>
<code> </code><code>filter=</code><code>"(objectClass=organizationalPerson)"</code>
<code> </code><code>scope=sub</code>
<code> </code><code>attrs=</code><code>"cn,sn,ou,telephoneNumber,title,l"</code>
<code> </code><code>schemachecking=off</code>
<code> </code><code>bindmethod=simple</code>
<code> </code><code>binddn=</code><code>"cn=syncuser,dc=example,dc=com"</code>
<code> </code><code>credentials=secret</code>
在這個例子中,slave會連接配接到ldap://provider.example.com:389進行同步,他将使用simple認證(passwd secret)來驗證并捆綁cn=syncuser,dc=example,dc=com。
PS:注意slave是使用讀寫權限到master中進行同步的!
master 的 slapd服務不需要重新開機。contextCSN會根據需要自動生成。它可能最初包含在LDIF檔案中,在變成的情況下産生,或者在slave第一次連接配接master進行同步的時候産生。如果LDIF檔案在被加載時不包含contextCSN時,-w 應與slapadd一起使用,以使它産生。這樣會使slave第一次進行同步的反應更快。
該cookie是一個逗号分隔的name = value的清單。 目前支援的syncrepl的cookie字段arecsn=<csn> andrid=<rid>。<csn>代表slave的目前同步狀态。 <rid>本地識别客戶伺服器中的使用者複本。它用來比對cookie與slapd.conf中定義的标示符。該<rid>必須有不超過3位小數。 在指令行中的cookie将覆寫存儲在使用者副本資料庫同步的cookie。
②、Delta-syncrepl
更改master的slapd.conf:(輕忽複制粘貼,比對配置進行相應添加)
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<code># Give the replica DN unlimited read access. This ACL needs to be</code>
<code># merged with other ACL statements, and/or moved within the scope</code>
<code># of a database. The "by * break" portion causes evaluation of</code>
<code># subsequent rules. See slapd.access(5) for details.</code>
<code>access to *</code>
<code>by dn.base=</code><code>"cn=replicator,dc=symas,dc=com"</code> <code>read</code>
<code>by * </code><code>break</code>
<code># Set the module path location</code>
<code>modulepath </code><code>/opt/symas/lib/openldap</code>
<code># Load the hdb backend</code>
<code>moduleload back_hdb.la</code>
<code># Load the accesslog overlay</code>
<code>moduleload accesslog.la</code>
<code>#Load the syncprov overlay</code>
<code>moduleload syncprov.la</code>
<code># Accesslog database definitions</code>
<code>suffix cn=accesslog</code>
<code>directory </code><code>/db/accesslog</code>
<code>rootdn cn=accesslog</code>
<code>index default </code><code>eq</code>
<code>index entryCSN,objectClass,reqEnd,reqResult,reqStart</code>
<code>syncprov-nopresent TRUE</code>
<code>syncprov-reloadhint TRUE</code>
<code># Let the replica DN have limitless searches</code>
<code>limits dn.exact=</code><code>"cn=replicator,dc=symas,dc=com"</code> <code>time</code><code>.soft=unlimited </code><code>time</code><code>.hard=unlimited size.soft</code>
<code># Primary database definitions</code>
<code>suffix </code><code>"dc=symas,dc=com"</code>
<code>rootdn </code><code>"cn=manager,dc=symas,dc=com"</code>
<code>## Whatever other configuration options are desired</code>
<code># syncprov specific indexing</code>
<code>index entryCSN </code><code>eq</code>
<code>index entryUUID </code><code>eq</code>
<code># syncrepl Provider for primary db</code>
<code>syncprov-checkpoint 1000 60</code>
<code># accesslog overlay definitions for primary db</code>
<code>overlay accesslog</code>
<code>logdb cn=accesslog</code>
<code>logops writes</code>
<code>logsuccess TRUE</code>
<code># scan the accesslog DB every day, and purge entries older than 7 days</code>
<code>logpurge 07+00:00 01+00:00</code>
<code>limits dn.exact=</code><code>"cn=replicator,dc=symas,dc=com"</code> <code>time</code><code>.soft=unlimited </code><code>time</code><code>.hard=unlimited site</code>
2、slave配置
<code># Replica database configuration</code>
<code>## Whatever other configuration bits for the replica, like indexing</code>
<code>## that you want</code>
<code># syncrepl specific indices</code>
<code># syncrepl directives</code>
<code>syncrepl rid=0</code>
<code> </code><code>provider=ldap:</code><code>//ldapmaster</code><code>.symas.com:389</code>
<code> </code><code>binddn=</code><code>"cn=replicator,dc=symas,dc=com"</code>
<code> </code><code>searchbase=</code><code>"dc=symas,dc=com"</code>
<code> </code><code>logbase=</code><code>"cn=accesslog"</code>
<code> </code><code>logfilter=</code><code>"(&(objectClass=auditWriteObject)(reqResult=0))"</code>
<code> </code><code>schemachecking=on</code>
<code> </code><code>type</code><code>=refreshAndPersist</code>
<code> </code><code>retry=</code><code>"60 +"</code>
<code> </code><code>syncdata=accesslog</code>
<code> </code>
<code># Refer updates to the master</code>
<code>updateref ldap:</code><code>//ldapmaster</code><code>.symas.com</code>
上述配置是假定你已經在你的資料庫中定義一個複制的辨別(綁定master),此外,所有的資料庫(primary, replica, and the accesslog storage database)還應該适當調整,以滿足您的需求(DB_CONFIG檔案)。
③N-Way Multi-Master
對于下面的例子中,我們将使用3個主節點。
配置資料庫資訊如下:
<code>dn: cn=config</code>
<code>objectClass: olcGlobal</code>
<code>cn: config</code>
<code>olcServerID: 1</code>
<code>dn: olcDatabase={0}config,cn=config</code>
<code>objectClass: olcDatabaseConfig</code>
<code>olcDatabase: {0}config</code>
<code>olcRootPW: secret</code>
第2、3台LDAPserver差別olcServerID :
<code>olcServerID: 2</code>
以下的配置設定syncrepl(3台master都需要配置,用來互相同步)
<code>dn: cn=module,cn=config</code>
<code>objectClass: olcModuleList</code>
<code>cn: module</code>
<code>olcModulePath: </code><code>/usr/local/libexec/openldap</code>
<code>olcModuleLoad: syncprov.la</code>
現在我們啟動第一個master節點(替換掉以下配置中的$URL1/$URL2/* 為實際的ldap urls)
<code>changetype: modify</code>
<code>replace: olcServerID</code>
<code>olcServerID: 1 $URI1</code>
<code>olcServerID: 2 $URI2</code>
<code>olcServerID: 3 $URI3</code>
<code>dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config</code>
<code>changetype: add</code>
<code>objectClass: olcOverlayConfig</code>
<code>objectClass: olcSyncProvConfig</code>
<code>olcOverlay: syncprov</code>
<code>add: olcSyncRepl</code>
<code>olcSyncRepl: rid=001 provider=$URI1 binddn=</code><code>"cn=config"</code> <code>bindmethod=simple</code>
<code> </code><code>credentials=secret searchbase=</code><code>"cn=config"</code> <code>type</code><code>=refreshAndPersist</code>
<code> </code><code>retry=</code><code>"5 5 300 5"</code> <code>timeout=1</code>
<code>olcSyncRepl: rid=002 provider=$URI2 binddn=</code><code>"cn=config"</code> <code>bindmethod=simple</code>
<code>olcSyncRepl: rid=003 provider=$URI3 binddn=</code><code>"cn=config"</code> <code>bindmethod=simple</code>
<code>-</code>
<code>add: olcMirrorMode</code>
<code>olcMirrorMode: TRUE</code>
現在啟動了Master,并且在LDIF中配置了第一、第二消費,它會複制cn=config。你現在已經有了N路-多主機的資料庫配置。
我們接下來還需要複制資料,不僅僅是配置資訊,是以添加到主機(所有的消費隊列/mater會同步這個配置)。此外,還需要替換掉所有的${}為你适當的環境配置資訊。
<code>dn: olcDatabase={1}$BACKEND,cn=config</code>
<code>objectClass: olc${BACKEND}Config</code>
<code>olcDatabase: {1}$BACKEND</code>
<code>olcSuffix: $BASEDN</code>
<code>olcDbDirectory: .</code><code>/db</code>
<code>olcRootDN: $MANAGERDN</code>
<code>olcRootPW: $PASSWD</code>
<code>olcLimits: dn.exact=</code><code>"$MANAGERDN"</code> <code>time</code><code>.soft=unlimited </code><code>time</code><code>.hard=unlimited size.soft=unlimit</code>
<code>olcSyncRepl: rid=004 provider=$URI1 binddn=</code><code>"$MANAGERDN"</code> <code>bindmethod=simple</code>
<code> </code><code>credentials=$PASSWD searchbase=</code><code>"$BASEDN"</code> <code>type</code><code>=refreshOnly</code>
<code> </code><code>interval=00:00:00:10 retry=</code><code>"5 5 300 5"</code> <code>timeout=1</code>
<code>olcSyncRepl: rid=005 provider=$URI2 binddn=</code><code>"$MANAGERDN"</code> <code>bindmethod=simple</code>
<code>olcSyncRepl: rid=006 provider=$URI3 binddn=</code><code>"$MANAGERDN"</code> <code>bindmethod=simple</code>
<code>dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config</code>
注意:你的所有master時鐘必須同步!
注意:正如slapd-config中,URLs配置( inolcSyncRepl)必須是從哪些URLs複制資料的位址。這些必須與slapd端口監聽的位址一樣。否則slapd可能會嘗試從自身複制,造成循環。
④、MirrorMode
第一個步驟是配置syncrepl
MirrorMode node 1:
<code># Global section</code>
<code>serverID 1</code>
<code># database section</code>
<code># syncrepl directive</code>
<code>syncrepl rid=001</code>
<code> </code><code>provider=ldap:</code><code>//ldap-sid2</code><code>.example.com</code>
<code> </code><code>binddn=</code><code>"cn=mirrormode,dc=example,dc=com"</code>
<code> </code><code>credentials=mirrormode</code>
<code>mirrormode on</code>
MirrorMode node 2:
<code>serverID 2</code>
<code> </code><code>provider=ldap:</code><code>//ldap-sid1</code><code>.example.com</code>
原理很簡單,每個MirrorMode節點的設定完全一樣,不同之處在于serverID都是獨一無二的,每個消費者指向到其他伺服器。
故障轉移配置
通常這樣有2中選擇:1.硬體代理/負載平衡或專用的代理軟體;2.使用備用LDAP代理作為syncrepl提供商。
圖檔挂了,我不知道為什麼,有時間我把圖檔改一個連結吧
普通消費者配置
slave的配置相同,它可以配置成正常的syncrepl模式,也可以是delta-syncrepl模式。(如上的例子)
優點
現在,您将有一個目錄的架構,提供了所有的單主複制的一緻性保證,同時也提供了多主機複制的高可用性。
⑤、Syncrepl Proxy
(由于字數限制,這一種會再寫一篇)
預告:(2中模式)
基于推的方式
基于拉的方式
本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1529506,如需轉載請自行聯系原作者