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文件,(该配置文件之前最好备份下)
将注释掉的下面三行指令启用, 即将
1
2
3
|
modulepath
/usr/lib/openldap
modulepath
/usr/lib64/openldap
moduleload syncprov.la
|
三行前面的“#”删除掉。
2、LDAP SERVER1的配置
编辑/etc/openldap/slapd.conf文件,在文件结尾追加以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
|
注意:由于原文件中有下面这条指定
1
|
index objectClass
eq
,pres
|
所以当加入
1
|
index objectclass,entryCSN,entryUUID
eq
|
后会报错,提示objectclass已定义。所以我将原文件中的
1
|
index objectClass
eq
,pres
|
注释掉了,然后就不报错了。
3、LDAP SERVER2的配置
编辑/etc/openldap/slapd.conf文件,在文件结尾追加以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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目录中的文件,然后重新生成新的配置文件。删除就得配置缓存(暂且这么理解吧)
1
2
3
4
|
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服务
1
|
/etc/init
.d
/slapd
restart
|
附上其中一台服务器的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
[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
登录LDAP SERVER2,可以看到HR组已经同步过来了。表示双组同步没有问题。