LDAP - Replication

参考资料:

我在前几篇的文章里,有说明了一些 LDAP 的实做与应用,当然你也有可能依照本文 (I hope so :p) 建立了自己的 LDAP 环境。在你越来越依赖 LDAP 的时候,有可能会发现这一台 LDAP 伺服器似乎反应越来越慢,因为大家都一直去查寻或是更新,此时你可能会想要再建立一台 LDAP 的次要伺服器来专门服务查寻,而主要 LDAP 伺服器只要有更改就会同步到次要伺服器。

好了,我不多说,现在我就来示范如何建立一个 (或两个以上) 的 LDAP Replication Server。

建立 Replication Server

为什么我要反其道而行先建立好 Replication Server,其实这是个人习惯,因为 Master LDAP Server 是已知的资讯,而 Slave 却是待产生的,所以我想应该要先把这个东西先生出来才能继续设定。

当然了你必要安装套件才行,需要有的套件就如同 LDAP 入门 (new window) 一样,请参考一下吧。

在下面的示范我会建立 ldap2 和 ldap3 这两个 Replication Server,也就是有两个次要 LDAP 的查寻伺服器。

ldap2.l-penguin.idv.tw

为了效能,我们需要把 DB_CONFIG 这个档建 copy 一份到 LDAP 资料库的目录,以便参考。

0001
root # cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
设定 slapd.conf
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
root # vi /etc/openldap/slapd.conf
-------------------------------------------------------
# 设定 suffix、rootdn 及 rootpw。
suffix "dc=l-penguin,dc=idv,dc=tw"
rootdn "cn=ldap2,dc=l-penguin,dc=idv,dc=tw"
rootpw password

# 设定 updatedn, 一般和 rootdn 一样, 不过也可以设定一
# 具有修改权利的帐号。
updatedn  "cn=ldap2,dc=l-penguin,dc=idv,dc=tw"
# 设定主要 Master Server 的主机名称。
updateref ldap://ldap.l-penguin.idv.tw
-------------------------------------------------------
root #
现在,已经设定好 ldap2.l-penguin.idv.tw,再来就是第二部主机。

ldap3.l-penguin.idv.tw

第二部 Replication Server 和第一部 Replication Server 是一样的设定方法,我就一次做完。

0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
root # cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
root # vi /etc/openldap/slapd.conf
-------------------------------------------------------
# 设定 suffix、rootdn 及 rootpw。
suffix "dc=l-penguin,dc=idv,dc=tw"
rootdn "cn=ldap3,dc=l-penguin,dc=idv,dc=tw"
rootpw password

# 设定 updatedn, 一般和 rootdn 一样, 不过也可以设定一
# 具有修改权利的帐号。
updatedn  "cn=ldap3,dc=l-penguin,dc=idv,dc=tw"
# 设定主要 Master Server 的主机名称。
updateref ldap://ldap.l-penguin.idv.tw
-------------------------------------------------------
root #
好了,现在第二部 Replication Server 也设定好,也知道了 updatedn 和登入时的密码,现在就可以一同设定 Master Slave。

建立 Master Server

要让主要伺服器可以顺利同步到 Replication Server,Master Server 的设定很重要,如果设定不完全就会让同步失效。现在我们就来编辑 slapd.conf。

0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
root # vi /etc/openldap/slapd.conf
-----------------------------------------------------------
# 设定资料修改的差异档。
# 这个设定非常重要,请不要乎略。
replogfile /var/lib/ldap/openldap-master-replog

# 1. 设定第一个 Replication Server,并以 tls 来做传输。
# 2. 使用简易传输,使用 cn=ldap2,dc=l-penguin,dc=idv,dc=tw
#    和 password 来做帐号密码验证。
replica host=ldap2.l-penguin.idv.tw:389
        suffix="dc=l-penguin,dc=idv,dc=tw"
        binddn="cn=ldap2,dc=l-penguin,dc=idv,dc=tw"
        credentials=password
        bindmethod=simple
        tls=yes

# 1. 设定第二个 Replication Server,并以 tls 来做传输。
# 2. 使用简易传输,使用 cn=ldap3,dc=l-penguin,dc=idv,dc=tw
#    和 password 来做帐号密码验证。
replica host=ldap3.l-penguin.idv.tw:389
        suffix="dc=l-penguin,dc=idv,dc=tw"
        binddn="cn=ldap3,dc=l-penguin,dc=idv,dc=tw"
        credentials=password
        bindmethod=simple
        tls=yes
-----------------------------------------------------------
root #

请注意,你应该要先做好 DNS 的对应 (ldap2.l-penguin.idv.tw 及 ldap3.l-penguin.idv.tw),否则怎么样都会无法同步到。

你可以选择是否要以 tls 来做资料传输,我建议最好使用,因为很难确定资料在同步的时候是否有人有意窃听。

好了,现在要做一件很重要的事,那就是把 Master Server 的资料全部都复制一份到 Replication Server 才行,请记得这个时候应该要停止任何的更新动作,以免 Master、Slave 的资料不一致。

资料复制

Dump Master Server Data

在此我使用 slapcat 来做资料 dump,并使用 scp 传送到两台 Replication Server。

0001
0002
0003
0004
root # slapcat -b "dc=l-penguin,dc=idv,dc=tw" -l ldap.l-penguin.idv.tw.ldif
root # scp ldap.l-penguin.idv.tw.ldif steven@ldap2.l-penguin.idv.tw:~/
root # scp ldap.l-penguin.idv.tw.ldif steven@ldap3.l-penguin.idv.tw:~/
Restore Data

现在两台 Replication Server 都有了完整的资料,那么马上就来还原。

0001
root # slapadd -l ~steven/ldap.l-penguin.idv.tw.ldif
现在万事具备,只欠东风,而这个东风就是要启动 LDAP Server,现在就马上来重新启动吧。

启动 LDAP 并做验证

当设定好 LDAP 之后,记得要重新启动,并且 Master 和 Slave 都要启动才行。

重新启动 ldap.l-penguin.idv.tw。

0001
0002
0003
0004
0005
0006
0007
0008
root # service ldap restart
Stopping slapd:                                            [  OK  ]
Stopping slurpd:                                           [  OK  ]
Checking configuration files for slapd:  config file testing succeeded
                                                           [  OK  ]
Starting slapd:                                            [  OK  ]
Starting slurpd:                                           [  OK  ]
root #
请注意,一旦主要伺服器设定了 replica 选项,那么 ldap 就启动 slurpd 来做同步更新。

重新启动 ldap2 及 ldap3。

0001
0002
0003
0004
0005
0006
root # service ldap restart
Stopping slapd:                                            [  OK  ]
Checking configuration files for slapd:  config file testing succeeded
                                                           [  OK  ]
Starting slapd:                                            [  OK  ]
root #
也许你会迫不及待想要看看 Replication Server 的资料是否真的全部汇入。
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
root # ldapsearch -x -b "ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw"
# extended LDIF
#
# LDAPv3
# base <ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# user, login, l-penguin.idv.tw
dn: ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw
ou: user
objectClass: organizationalUnit

# c293831287, user, login, l-penguin.idv.tw
dn: cn=c293831287,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw
uid: c293831287
cn: c293831287
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: aHJDMjkzODMxMjg3
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 600
gidNumber: 510
homeDirectory: /home/c293831287
gecos: Nicole Coon

# d197700415, user, login, l-penguin.idv.tw
dn: cn=d197700415,ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw
uid: d197700415
cn: d197700415
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: aHJEMTk3NzAwNDE1
shadowLastChange: 11108
shadowMax: 99999
shadowWarning: 7
shadowFlag: 0
loginShell: /bin/bash
uidNumber: 601
gidNumber: 510
homeDirectory: /home/d197700415
gecos: Sheri Hussey
~ 哇塞! 资料太多了, 以下略过 :D ~
root #
当然你现在可以相信资料已全部汇入。

修改 Master 资料并检查是否同步

在此我使用在 LDAP 入门 (new window) 时所提的 ldapbrowser 这个工具来做示范。

现在这位 廖佑绮 小姐的 sn 值是 N/A,现在我来把她重新设定。

现在马上来看看另外两部的变化:

你可以在两台 Replication Server 上看到是否以 TLS 方式传输。

0001
0002
0003
0004
0005
0006
0007
root # cat ldap.log | grep 'tls'
Feb 24 03:32:31 ldap2 slapd[1772]: conn=6 fd=14 TLS established tls_ssf=256 ssf=256
Feb 24 03:34:31 ldap2 slapd[1843]: conn=0 fd=14 TLS established tls_ssf=256 ssf=256
Feb 26 23:30:09 ldap2 slapd[1696]: conn=1 fd=22 TLS established tls_ssf=256 ssf=256
Feb 26 23:33:36 ldap2 slapd[1776]: conn=1 fd=16 TLS established tls_ssf=256 ssf=256
root #
设定以 SSL 方式传输

当然以上在传输的时候已经使用 TLS 方式来修改资料,当然你也可以设定使用 SSL 来对整个过程都使用 SSL 的加密方式传输。

设定 Master Server:

0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
root # vi /etc/openldap/slapd.conf
---------------------------------------------------------
# 使用 uri 项目来指定传输方式。或酗]不再使用 tls 了。
replica uri=ldaps://ldap2.l-penguin.idv.tw:636
        suffix="dc=l-penguin,dc=idv,dc=tw"
        binddn="cn=ldap2,dc=l-penguin,dc=idv,dc=tw"
        credentials=password
        bindmethod=simple

# 使用 uri 项目来指定传输方式。或酗]不再使用 tls 了。
replica uri=ldaps://ldap3.l-penguin.idv.tw:389
        suffix="dc=l-penguin,dc=idv,dc=tw"
        binddn="cn=ldap3,dc=l-penguin,dc=idv,dc=tw"
        credentials=password
        bindmethod=simple
---------------------------------------------------------
root #
设定 Replication Server:
0001
0002
0003
0004
0005
0006
root # vi /etc/openldap/slapd.conf
---------------------------------------------------------
# 使用 ssl 方式传输。
updateref ldaps://ldap.l-penguin.idv.tw
---------------------------------------------------------
root #
好了,经过以上设定之后,你就可以全程使用 SSL 来传输。

若要使用 ldaps 方式来做完全的加密传输,那么你应该要设定伺服器的 CA 凭证才可以,要设定 CA 凭证可以参考 LDAP - LDAP with TLS/SSL (new window) 的文件。我在这里就不再说明。

设定平衡负载

当你有两台以上的次要 LDAP 服务时,可能会想要分散流量到两台主机,此时你可以使用 DNS 的循环调渡方式来解决流量问题。

若要使用 DNS 的方式,请参考 bind - DNS 设定 (new window)

Last modified: 02/26/2007


首页