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

openldap-2.4版本主從配置
node


PS:最近在搞ldap,當正在進行主從配置的時候,發現裝的2.4.23版本的居然沒有slurpd這個守護進程的開啓命令。而後上網搜了一下,原來2.4版本之後對主從、主主等模式作了大的改進。而後翻看官方的文檔,將這些記錄了下來。固然此文帶有嚴重的本人理解色彩,因此若是出錯,請見諒!能指出最好。數據庫


OpenLdap v2.3以前的同步複製缺點:bash


slurpd守護進程是以推模式操做 : 主服務器推送變動的數據到從服務器  (不可靠)
對replog中的記錄的次序極爲敏感
很容易失去同步, 這時須要手工干預來從主目錄從新同步從服務器數據庫
若是一個從服務器長時間停機,replog可能變得太大以致於slurpd沒法處理
只工做在推模式(也能夠設置爲拉模式,可是這種感受相似於將master上的數據作了一個快捷鏈接到slave上)
須要中止和從新啓動主服務器來增長從服務器
只支持單一主服務器複製(1臺主對多從)


OpenLDAP v2.4以後的同步功能:
服務器


PS:新版最大的功能就是實現了雙向複製,即雙主、多主模式,不管哪一臺master宕機,都不會影響使用。
cookie


新版主從配置有五中方式,這裏只講述最基本也是最簡單的Syncrepl主從配置、MirrorMode鏡像模式N-Way Multi-Master(多主)三種方式。session



Syncrepl

該方式是slave服務器以拉的方式同步master的用戶數據架構

  該方式缺點:當你修改一個條目中的一個屬性值(or大批量的萬級別的某1屬性值),它不是簡單的同步過來這些屬性,而是把修改的條目一塊兒同步更新來。less

Delta-syncrepl

比上一條多了個功能:基於日誌同步:ide

    你在master每更改1條記錄,確定會產生1條日誌,那麼slave會經過你的master日誌進行相應的修改,這就克服了上一條的缺點。lua

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種,一、經過配置文件,當開啓syncrepl引擎後會到master拉數據;二、從主服務器備份數據,複製到slave。當從備份數據初始化的時候,沒必要擔憂數據老,由於syncrepl會自動進行校驗,而後進行相應的修改、同步。(當複製一個大規模的「條錄」,建議從備份初始化)

  一、配置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

 二、配置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

  一、配置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

  二、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

第二、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中配置了第1、第二消費,它會複製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中模式)

基於推的方式

基於拉的方式

相關文章
相關標籤/搜索