Docker下OpenLdap 主從複製說明
一、概述
本次是以需要的OpenLdap主從模式架構,實現公司本地(主)與A區機房(從)的信息同步模式。其中,需要的是公司本地OpenLdap中特定的獨立域同步到經開區機房,而非完全主從。踩了好多坑,又是與SVN升級一起搞的,所以真的難
二、OpenLdap 簡介
1.1.什麼是OpenLdap
OpenLDAP 是一款輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP),跨平臺的標準互聯網協議。屬於開源集中賬號管理架構的實現,且支持衆多系統版本,被廣大互聯網公司所採用。
LDAP 具有兩個國家標準,分別是X.500 和LDAP。OpenLDAP 是基於X.500 標準的,而且去除了X.500 複雜的功能並且可以根據自我需求定製額外擴展功能。
OpenLDAP 默認以Berkeley DB 作爲後端數據庫,Berkeley DB 數據庫主要以散列的數據類型進行數據存儲,如以鍵值對的方式進行存儲。Berkeley DB 是一類特殊的數據庫,主要用於搜索、瀏覽、更新查詢操作,一般對於一次寫入數據、多次查詢和搜索有很好的效果。Berkeley DB 數據庫是面向查詢進行優化,面向讀取進行優化的數據庫。Berkeley DB 不支持事務型數據庫(MySQL、MariDB、Oracle 等)所支持的高併發的吞吐量以及複雜的事務操作。(/var/lib/ldap/*)
OpenLDAP 目錄中的信息是按照樹形結構進行組織的,具體信息存儲在條目(entry)中,條目可以看成關係數據庫中的表記錄,條目是具有區別名(Distinguished Name,DN)的屬性(attribute),DN 是用來引用條目,DN 相當於關係數據庫(Oracle/MySQL)中的主鍵(primary key),是唯一的。屬性由類型(type)和一個或者多個值(value)組成,相當於關係數據庫中字段的概念。
2.2.OpenLdap有什麼用
具體就不說了,就是賬號同一管理分配的工具。
三、架構選擇
OpenLdap 集羣複製模式
v2.3以前模式缺點
- slurpd守護進程是以推模式操作 : 主服務器推送變更的數據到從服務器 (不可靠)
- 對replog中的記錄的次序極爲敏感
- 很容易失去同步, 這時需要手工干預來從主目錄重新同步從服務器數據庫
- 如果一個從服務器長時間停機,replog可能變得太大以至於slurpd無法處理
- 只工作在推模式(也可以設置爲拉模式,但是這種感覺類似於將master上的數據做了一個快捷連接到slave上)
- 需要停止和重新啓動主服務器來增加從服務器
- 只支持單一主服務器複製(1臺主對多從)
v2.4後的同步功能
新版最大的功能就是實現了雙向複製,即雙主、多主模式,無論哪一臺master宕機,都不會影響使用。可通過docker參數直接實現,但不符合公司所需要的同步架構,僅限於同一機房裏使用。
新版主從配置有五種方式,這裏只講述最基本也是最簡單的Syncrepl主從配置。
五種方式說明:
Syncrepl | 該方式是slave服務器以拉的方式同步master的用戶數據 該方式缺點:當你修改一個條目中的一個屬性值(or大批量的萬級別的某1屬性值),它不是簡單的同步過來這些屬性,而是把修改的條目一起同步更新來。 |
Delta-syncrepl (優化建議*) |
比上一條多了個功能:基於日誌同步: 你在master每更改1條記錄,肯定會產生1條日誌,那麼slave會通過你的master日誌進行相應的修改,這就克服了上一條的缺點。 |
N-Way Multi-Master | 多主方式同步LDAP信息,Docker可通過配置參數直接實現。 |
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服務器的讀權限。 |
四、構建
架構如圖:
跨域使用公網ip
4.1.構建Docker下基礎OpenLdap容器
# OpenLdap容器生成腳本 vim openldap.sh -------------------------------------------------------------- #!/bin/bash NAME=openldap PASS=adm1n if [ `docker ps -a|grep $NAME|wc -l` -gt 0 ];then docker rm -f $NAME fi docker run \ --env LDAP_ORGANISATION="Aorise Inc." \ --env LDAP_DOMAIN="aorisetest.com" \ --env LDAP_BASE_DN="dc=aorisetest,dc=com" \ --env LDAP_ADMIN_PASSWORD="$PASS" \ --env LDAP_CONFIG_PASSWORD="conf1g" \ --env LDAP_READONLY_USER="false" \ --env LDAP_RFC2307BIS_SCHEMA="false" \ --env LDAP_BACKEND="mdb" \ --env LDAP_TLS="false" \ --volume /var/lib/ldap:/var/lib/ldap \ --volume /etc/ldap/slapd.d:/etc/ldap/slapd.d \ -v /mnt/sdb/ldap/conffile/:/home/ldap/conffile \ -p 389:389 \ --name $NAME --detach osixia/openldap:1.3.0 -------------------------------------------------------------- /var/lib/ldap:數據文件存放路徑 /etc/ldap/slapd.d:配置文件存放路徑 /home/ldap/conffile:自定義配置文件存放路徑 sh openldap.sh |
4.2.構建Docker下基礎PHPLdapAdmin容器
# PHPLdapAdmin容器生成腳本 vim phpldapadmin.sh -------------------------------------------------------------- #!/bin/bash LDAPHOST=192.168.1.21 NAME=phpldapadmin if [ `docker ps -a|grep $NAME|wc -l` -gt 0 ];then docker rm -f $NAME fi docker run -p 443:443 \ --env PHPLDAPADMIN_LDAP_HOSTS=$LDAPHOST \ --name $NAME \ --detach osixia/phpldapadmin:latest -------------------------------------------------------------- 443:本機映射端口 PHPLDAPADMIN_LDAP_HOSTS:LDAP對應主機 sh phpldapadmin.sh |
五、配置
5.1.配置主節點
cd /mnt/sdb/ldap/conffile # 生成syncprov模塊 vim mod_syncprov模塊.ldif --------------------------------------------------------------- dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleload: syncprov.la --------------------------------------------------------------- docker exec openldap ldapadd -Y EXTERNAL -H ldapi:/// -f /home/ldap/conffile/mod_syncprov.ldif # 生成syncprov配置 vim syncprov.ldif --------------------------------------------------------------- dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpCheckpoint: 100 10 olcSpSessionLog: 100 --------------------------------------------------------------- docker exec openldap ldapadd -Y EXTERNAL -H ldapi:/// -f /home/ldap/conffile/syncprov.ldif |
5.2.配置從節點
cd /mnt/sdb/ldap/conffile # 生成syncrepl配置 # 由於Syncrepl爲拉取模式。當要複製一個大規模的數據條錄時,建議從主LDAP備份數據,複製到從LDAP上。當從備份數據初始化的時候,不必擔心數據老,因爲syncrepl會自動進行校驗,然後進行相應的修改、同步。 vim syncrepl.ldif --------------------------------------------------------------- dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=002 provider=ldap://192.168.1.21:389/ bindmethod=simple binddn="cn=admin,dc=aorisetest,dc=com" credentials=adm1n searchbase="cn=pm,dc=aorisetest,dc=com" scope=sub schemachecking=on type=refreshAndPersist retry="5 5 300 +" attrs="*,+" --------------------------------------------------------------- provider:主服務器 bindmethod:綁定協議 binddn:管理員用戶,登錄dn credentials:管理用戶密碼,登錄密碼 searchbase:選擇要同步的獨立域,根節點 scope:設置所有的條目匹配 schemachecking:設置同步更新時間檢測 type:同步模式爲(refreshOnly:同步模式爲拉,拒絕修改) retry:同步更新重試次數和時間剛開始的5秒重試5次,以後每300秒重試一次 attrs:複製全部屬性 docker exec openldap ldapadd -Y EXTERNAL -H ldapi:/// -f /home/ldap/conffile/syncrepl.ldif |
六、同步模式檢查參考
1:主節點pm域外創域不同步
無變化
2:主節點pm域內創用戶同步
功能實現,獨立域同步成功
七、總結
本次只是配置了最基礎的Syncrepl架構,對於優秀的架構還需學習構建。