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架构,对于优秀的架构还需学习构建。

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