架构选择
本次配置是基于最基础的 Syncrepl
架构
OpenLdap 集群复制模式
v2.3
以前模式缺点
- slurpd守护进程是以推模式操作 : 主服务器推送变更的数据到从服务器 (不可靠)
- 对replog中的记录的次序极为敏感
- 很容易失去同步, 这时需要手工干预来从主目录重新同步从服务器数据库
- 如果一个从服务器长时间停机,replog可能变得太大以至于slurpd无法处理
- 只工作在推模式(也可以设置为拉模式,但是这种感觉类似于将master上的数据做了一个快捷连接到slave上)
需要停止和重新启动主服务器来增加从服务器 - 只支持单一主服务器复制(1台主对多从)
v2.4
后的同步功能
- 新版最大的功能就是实现了双向复制,即双主、多主模式,无论哪一台master宕机,都不会影响使用。可通过docker参数直接实现,但不符合公司所需要的同步架构,仅限于同一机房里使用。
- 新版主从配置有五种方式,这里只讲述最基本也是最简单的Syncrepl主从配置。
五种方式说明:
方式 | 说明 |
---|---|
Syncrepl |
该方式是 slave 服务器以拉的方式同步 master 的用户数据。该方式缺点:当你修改一个条目中的一个属性值(或大批量的万级别的某一属性值),它不是简单的同步过来这些属性,而是把修改的条目一起同步更新来。 |
Delta-syncrepl (优化建议*) |
比上一条多了个功能:基于日志同步 你在 master 每更改一条记录,肯定会产生一条日志,那么 slave 会通过你的 master 日志进行相应的修改,这就克服了上一条的缺点。 |
N-Way Multi-Master |
多主方式同步 LDAP 信息,Docker 可通过配置参数直接实现。 |
MirrorMode |
该方式是服务器互相推送信息的方式同步用户数据<br data-tomark-pass> MirrorMode 只支持 2 个主 master ( 2 个主 master 可以 +N 个 slave ),但是你如果非得加了 3 、4 台 master 后,那么其余的都只能从前 2 台 master 上获取数据,而不能将本身的数据推送过去。<br data-tomark-pass>如果你有类似需求,也可以使用这个方式。(比如,你企业分散点多,然后不希望都具有修改功能,可以使用它) |
Syncrepl Proxy (优化建议) |
代理同步<br data-tomark-pass>意思是将主 master 隐藏起来,而代理机上边通过 Syncrepl 从 master 主机以拉的方式同步 master 用户数据,当代理主机发生改变时,代理主机的 LDAP 又以推的方式将数据更新到下属的 slave LDAP 服务器上。slave LDAP 只有对代理 LDAP 服务器的读权限。 |
构建
跨域使用公网 ip
构建 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
构建 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
配置
配置主节点
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
配置从节点
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
验证
略。