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

openldap-2.4版本主從配置


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。 下面是一個例子:

database bdb
suffix dc=Example,dc=com
rootdn dc=Example,dc=com
directory /var/ldap/db
index objectclass,entryCSN,entryUUID eq

overlay syncprov
syncprov-checkpoint 100 10         #contextCSN
syncprov-sessionlog 100            #session log

 2、配置slave端LDAP

database hdb
suffix dc=Example,dc=com
rootdn dc=Example,dc=com
directory /var/ldap/db
index objectclass,entryCSN,entryUUID eq

syncrepl rid=123
        provider=ldap://provider.example.com:389
        type=refreshOnly
        interval=01:00:00:00
        searchbase="dc=example,dc=com"
        filter="(objectClass=organizationalPerson)"
        scope=sub
        attrs="cn,sn,ou,telephoneNumber,title,l"
        schemachecking=off
        bindmethod=simple
        binddn="cn=syncuser,dc=example,dc=com"
        credentials=secret

    在這個例子中,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

  1、配置master端LDAP

  更改master的slapd.conf:(輕忽複製粘貼,比對配置進行相應添加)

# Give the replica DN unlimited read access. This ACL needs to be
# merged with other ACL statements, and/or moved within the scope
# of a database. The "by * break" portion causes evaluation of
# subsequent rules. See slapd.access(5) for details.
access to *
by dn.base="cn=replicator,dc=symas,dc=com" read
by * break

# Set the module path location
modulepath /opt/symas/lib/openldap

# Load the hdb backend
moduleload back_hdb.la

# Load the accesslog overlay
moduleload accesslog.la

#Load the syncprov overlay
moduleload syncprov.la

# Accesslog database definitions
database hdb
suffix cn=accesslog
directory /db/accesslog
rootdn cn=accesslog
index default eq
index entryCSN,objectClass,reqEnd,reqResult,reqStart

overlay syncprov
syncprov-nopresent TRUE
syncprov-reloadhint TRUE

# Let the replica DN have limitless searches
limits dn.exact="cn=replicator,dc=symas,dc=com" time.soft=unlimited time.hard=unlimited size.soft

# Primary database definitions
database hdb
suffix "dc=symas,dc=com"
rootdn "cn=manager,dc=symas,dc=com"

## Whatever other configuration options are desired
# syncprov specific indexing
index entryCSN eq
index entryUUID eq

# syncrepl Provider for primary db
overlay syncprov
syncprov-checkpoint 1000 60

# accesslog overlay definitions for primary db
overlay accesslog
logdb cn=accesslog
logops writes
logsuccess TRUE
# scan the accesslog DB every day, and purge entries older than 7 days
logpurge 07+00:00 01+00:00

# Let the replica DN have limitless searches
limits dn.exact="cn=replicator,dc=symas,dc=com" time.soft=unlimited time.hard=unlimited site

  2、slave配置

# Replica database configuration
database hdb
suffix "dc=symas,dc=com"
rootdn "cn=manager,dc=symas,dc=com"

## Whatever other configuration bits for the replica, like indexing
## that you want

# syncrepl specific indices
index entryUUID eq

# syncrepl directives
syncrepl rid=0
        provider=ldap://ldapmaster.symas.com:389
        bindmethod=simple
        binddn="cn=replicator,dc=symas,dc=com"
        credentials=secret
        searchbase="dc=symas,dc=com"
        logbase="cn=accesslog"
        logfilter="(&(objectClass=auditWriteObject)(reqResult=0))"
        schemachecking=on
        type=refreshAndPersist
        retry="60 +"
        syncdata=accesslog
        
# Refer updates to the master
updateref ldap://ldapmaster.symas.com


上述配置是假定你已經在你的數據庫中定義一個複製的標識(綁定master),此外,所有的數據庫(primary, replica, and the accesslog storage database)還應該適當調整,以滿足您的需求(DB_CONFIG文件)。


③N-Way Multi-Master

  對於下面的例子中,我們將使用3個主節點。


  配置數據庫信息如下:

dn: cn=config
objectClass: olcGlobal
cn: config
olcServerID: 1

dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootPW: secret

第2、3臺LDAPserver區別olcServerID :

dn: cn=config
objectClass: olcGlobal
cn: config
olcServerID: 2

dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcRootPW: secret


以下的配置設置syncrepl(3臺master都需要配置,用來互相同步)

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/local/libexec/openldap
olcModuleLoad: syncprov.la

現在我們啓動第一個master節點(替換掉以下配置中的$URL1/$URL2/* 爲實際的ldap urls)

dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 $URI1
olcServerID: 2 $URI2
olcServerID: 3 $URI3

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=$URI1 binddn="cn=config" bindmethod=simple
    credentials=secret searchbase="cn=config" type=refreshAndPersist
    retry="5 5 300 5" timeout=1
olcSyncRepl: rid=002 provider=$URI2 binddn="cn=config" bindmethod=simple
    credentials=secret searchbase="cn=config" type=refreshAndPersist
    retry="5 5 300 5" timeout=1
olcSyncRepl: rid=003 provider=$URI3 binddn="cn=config" bindmethod=simple
    credentials=secret searchbase="cn=config" type=refreshAndPersist
    retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE

現在啓動了Master,並且在LDIF中配置了第一、第二消費,它會複製cn=config。你現在已經有了N路-多主機的數據庫配置。


我們接下來還需要複製數據,不僅僅是配置信息,所以添加到主機(所有的消費隊列/mater會同步這個配置)。此外,還需要替換掉所有的${}爲你適當的環境配置信息。

dn: olcDatabase={1}$BACKEND,cn=config
objectClass: olcDatabaseConfig
objectClass: olc${BACKEND}Config
olcDatabase: {1}$BACKEND
olcSuffix: $BASEDN
olcDbDirectory: ./db
olcRootDN: $MANAGERDN
olcRootPW: $PASSWD
olcLimits: dn.exact="$MANAGERDN" time.soft=unlimited time.hard=unlimited size.soft=unlimit
olcSyncRepl: rid=004 provider=$URI1 binddn="$MANAGERDN" bindmethod=simple
    credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly
    interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcSyncRepl: rid=005 provider=$URI2 binddn="$MANAGERDN" bindmethod=simple
    credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly
    interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcSyncRepl: rid=006 provider=$URI3 binddn="$MANAGERDN" bindmethod=simple
    credentials=$PASSWD searchbase="$BASEDN" type=refreshOnly
    interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={1}${BACKEND},cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

注意:你的所有master時鐘必須同步!

注意:正如slapd-config中,URLs配置( inolcSyncRepl)必須是從哪些URLs複製數據的地址。這些必須與slapd端口監聽的地址一樣。否則slapd可能會嘗試從自身複製,造成循環。


④、MirrorMode


第一個步驟是配置syncrepl


MirrorMode node 1:

# Global section
serverID 1
# database section

# syncrepl directive
syncrepl rid=001
        provider=ldap://ldap-sid2.example.com
        bindmethod=simple
        binddn="cn=mirrormode,dc=example,dc=com"
        credentials=mirrormode
        searchbase="dc=example,dc=com"
        schemachecking=on
        type=refreshAndPersist
        retry="60 +"
        
mirrormode on


MirrorMode node 2:

# Global section
serverID 2
# database section

# syncrepl directive
syncrepl rid=001
        provider=ldap://ldap-sid1.example.com
        bindmethod=simple
        binddn="cn=mirrormode,dc=example,dc=com"
        credentials=mirrormode
        searchbase="dc=example,dc=com"
        schemachecking=on
        type=refreshAndPersist
        retry="60 +"
        
mirrormode on


原理很簡單,每個MirrorMode節點的設置完全一樣,不同之處在於serverID都是獨一無二的,每個消費者指向到其他服務器。


故障轉移配置

 通常這樣有2中選擇:1.硬件代理/負載平衡或專用的代理軟件;2.使用備用LDAP代理作爲syncrepl提供商。

  wKiom1PQbRDDbM0BAAEzaaQiqOI802.jpg

圖片掛了,我不知道爲什麼,有時間我把圖片改一個鏈接吧

普通消費者配置

slave的配置相同,它可以配置成常規的syncrepl模式,也可以是delta-syncrepl模式。(如上的例子)


優點

現在,您將有一個目錄的架構,提供了所有的單主複製的一致性保證,同時也提供了多主機複製的高可用性。


⑤、Syncrepl Proxy

(由於字數限制,這一種會再寫一篇)

預告:(2中模式)

基於推的方式

基於拉的方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章