Docker下OpenLdap 主從複製說明

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架構,對於優秀的架構還需學習構建。

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