openldap-2.4版本主从配置


PS:最近在搞ldap,当正在进行主从配置的时候,发现装的2.4.23版本的竟然没有slurpd这个守护进程的开启命令。然后上网搜了一下,原来2.4版本以后对主从、主主等模式做了大的改进。然后翻看官方的文档,将这些记录了下来。当然此文带有严重的本人理解色彩,所以如果出错,请见谅!能指出最好。


OpenLdap v2.3之前的同步复制缺点:


slurpd守护进程是以推模式操作 : 主服务器推送变更的数据到从服务器  (不可靠)
对replog中的记录的次序极为敏感
很容易失去同步, 这时需要手工干预来从主目录重新同步从服务器数据库
如果一个从服务器长时间停机,replog可能变得太大以至于slurpd无法处理
只工作在推模式(也可以设置为拉模式,但是这种感觉类似于将master上的数据做了一个快捷连接到slave上)
需要停止和重新启动主服务器来增加从服务器
只支持单一主服务器复制(1台主对多从)


OpenLDAP v2.4之后的同步功能:


PS:新版最大的功能就是实现了双向复制,即双主、多主模式,无论哪一台master宕机,都不会影响使用。


新版主从配置有五中方式,这里只讲述最基本也是最简单的Syncrepl主从配置、MirrorMode镜像模式N-Way Multi-Master(多主)三种方式。



Syncrepl

该方式是slave服务器以拉的方式同步master的用户数据

  该方式缺点:当你修改一个条目中的一个属性值(or大批量的万级别的某1属性值),它不是简单的同步过来这些属性,而是把修改的条目一起同步更新来。

Delta-syncrepl

比上一条多了个功能:基于日志同步:

    你在master每更改1条记录,肯定会产生1条日志,那么slave会通过你的master日志进行相应的修改,这就克服了上一条的缺点。

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种,1、通过配置文件,当开启syncrepl引擎后会到master拉数据;2、从主服务器备份数据,复制到slave。当从备份数据初始化的时候,不必担心数据老,因为syncrepl会自动进行校验,然后进行相应的修改、同步。(当复制一个大规模的“条录”,建议从备份初始化)

  1、配置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

 2、配置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

  1、配置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

  2、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

第2、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中配置了第一、第二消费,它会复制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提供商。

  wKiom1PQbRDDbM0BAAEzaaQiqOI802.jpg

图片挂了,我不知道为什么,有时间我把图片改一个链接吧

普通消费者配置

slave的配置相同,它可以配置成常规的syncrepl模式,也可以是delta-syncrepl模式。(如上的例子)


优点

现在,您将有一个目录的架构,提供了所有的单主复制的一致性保证,同时也提供了多主机复制的高可用性。


⑤、Syncrepl Proxy

(由于字数限制,这一种会再写一篇)

预告:(2中模式)

基于推的方式

基于拉的方式