天天看點

openldap-2.4新主從配置詳細介紹(1)

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=&lt;csn&gt; andrid=&lt;rid&gt;。&lt;csn&gt;代表slave的目前同步狀态。 &lt;rid&gt;本地識别客戶伺服器中的使用者複本。它用來比對cookie與slapd.conf中定義的标示符。該&lt;rid&gt;必須有不超過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>"(&amp;(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,如需轉載請自行聯系原作者