LDAP的主从同步从2.4版本以后有了很大的改动,新版本的主从同步有5中模式:


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服务器的读权限。


MirrorMode配置

用的比较多的模式可能是MirrorMode

在测试环境中,我只研究了MirrorMode模式的配置,下面是具体的操作过程。

1、首先安装两台openldap服务器,要求配置一样,即域名、管理员账号、密码完全一样。

如果不清楚如何安装,可以参考前面的文档CentOS6.5部署LDAP Server


环境:

LDAP SERVER1 172.16.42.136

LDAP SERVER2 172.16.42.137


域名:beyond.org   

管理员账号:admin

密码:123456

注意:在做主主同步配置前,确保两台服务器时间一致。并确保两台LDAP服务器的slapd服务正常启动,并且能用phpLDAPadmin管理工具正常登陆。


mirromode配置

1、编辑两台机器上的/etc/openldap/slapd.conf文件,(该配置文件之前最好备份下)

将注释掉的下面三行指令启用, 即将

modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
moduleload syncprov.la

三行前面的“#”删除掉。


2、LDAP SERVER1的配置

编辑/etc/openldap/slapd.conf文件,在文件结尾追加以下内容

index objectclass,entryCSN,entryUUID eq
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
serverID    1
syncrepl      rid=123
              provider=ldap://172.16.42.137
              bindmethod=simple
              binddn="cn=admin,dc=beyondh,dc=org"
              credentials=123456
              searchbase="dc=beyondh,dc=org"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"
mirrormode on

注意:由于原文件中有下面这条指定

index objectClass         eq,pres

所以当加入

index objectclass,entryCSN,entryUUID eq

后会报错,提示objectclass已定义。所以我将原文件中的

index objectClass         eq,pres

注释掉了,然后就不报错了。


3、LDAP SERVER2的配置

编辑/etc/openldap/slapd.conf文件,在文件结尾追加以下内容

index  objectClass,entryCSN,entryUUID eq
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
serverID    2
syncrepl      rid=123
              provider=ldap://172.16.42.136
              bindmethod=simple
              binddn="cn=admin,dc=beyondh,dc=org"
              credentials=123456
              searchbase="dc=beyondh,dc=org"
              schemachecking=on
              type=refreshAndPersist
              retry="60 +"
mirrormode on

可以看到,两台服务器上serverID不一样,provider配置的是对方的IP地址,其他配置完全一致


注意:修改了配置文件,别以为重启服务器就好了,你需要删除原slapd.d目录中的文件,然后重新生成新的配置文件。删除就得配置缓存(暂且这么理解吧)

rm -rf /etc/openldap/slapd.d/*
#生成新的
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
chown -R ldap.ldap /etc/openldap/slapd.d

启动slapd服务

/etc/init.d/slapd restart


附上其中一台服务器的配置文件

[root@localhost openldap]# cat slapd.conf | egrep -v "^$|^#"
include         /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/duaconf.schema
include         /etc/openldap/schema/dyngroup.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/java.schema
include         /etc/openldap/schema/misc.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/openldap.schema
include         /etc/openldap/schema/ppolicy.schema
include         /etc/openldap/schema/collective.schema
allow bind_v2
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
moduleload syncprov.la
TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password
database config
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
        by * none
database monitor
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
        by dn.exact="cn=Manager,dc=my-domain,dc=com" read
        by * none
database        bdb
suffix          "dc=beyondh,dc=org"
checkpoint      1024 15
rootdn          "cn=admin,dc=beyondh,dc=org"
rootpw {SSHA}dA8Pvv20Tr4rMM99dVtRmp6tYwh8OrKs
directory       /var/lib/ldap
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub
loglevel  296
cachesize 1000
index objectclass,entryCSN,entryUUID eq  
overlay syncprov  
syncprov-checkpoint 100 10  
syncprov-sessionlog 100  
 
serverID    1  
syncrepl      rid=123  
              provider=ldap://172.16.42.137
              bindmethod=simple  
              binddn="cn=admin,dc=beyondh,dc=org"  
              credentials=123456 
              searchbase="dc=beyondh,dc=org"  
              schemachecking=on 
              type=refreshAndPersist  
              retry="60 +"  
mirrormode on


验证:

登录LDAP SERVER1,创建一个组HR

wKioL1jUhROBcvHIAAFXNHnKUzk813.png

登录LDAP SERVER2,可以看到HR组已经同步过来了。表示双组同步没有问题。

wKiom1jUhSGQMgz7AAFbDzlCaqA413.png


参考链接:

http://www.tuicool.com/articles/7FfQZbr

http://407711169.blog.51cto.com/6616996/1529506

http://www.iyunv.com/thread-158662-1-1.html