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提供商。
圖片掛了,我不知道爲何,有時間我把圖片改一個連接吧
普通消費者配置
slave的配置相同,它能夠配置成常規的syncrepl模式,也能夠是delta-syncrepl模式。(如上的例子)
優勢
如今,您將有一個目錄的架構,提供了全部的單主複製的一致性保證,同時也提供了多主機複製的高可用性。
⑤、Syncrepl Proxy
(因爲字數限制,這一種會再寫一篇)
預告:(2中模式)
基於推的方式
基於拉的方式