我实施了一对 openldap 代理,运行几个元数据库来合并和过滤 AD DC 群集。当一个服务无法运行时,客户端会在两个机器之间进行故障转移,我遇到了一些问题。一个例子是,当中央 syslog 服务器关闭并且 slapd 无法向其发送日志时,因此虽然 TCP 套接字已打开,但该进程不会响应,因为它正在等待先清除 syslog 消息的积压。在这里,我本来希望客户端无法连接到第二台服务器,但事实并非如此,尽管它们报告说它们正在连接到该服务器:
2011-10-10T11:45:01.220367+01:00 gibsvlin-mkt-product worker_nscd: nss_ldap: could not search LDAP server - Server is unavailable
2011-10-10T11:45:01.231725+01:00 gibsvlin-mkt-product worker_nscd: nss_ldap: could not search LDAP server - Server is unavailable
2011-10-10T11:45:01.235354+01:00 gibsvlin-mkt-product worker_nscd: nss_ldap: could not search LDAP server - Server is unavailable
2011-10-10T11:45:01.242156+01:00 gibsvlin-mkt-product worker_nscd: nss_ldap: reconnected to LDAP server ldap://10.5.10.117:389/
2011-10-10T11:45:01.248505+01:00 gibsvlin-mkt-product worker_nscd: nss_ldap: could not search LDAP server - Server is unavailable
因此,我们看到备份服务器的“重新连接到”消息,但它似乎实际上没有从中得到任何东西。如果我暂停出现问题的虚拟机,那么就无法进行 TCP 连接,然后一切都会顺利地故障转移。
感觉故障逻辑中有一个微妙之处可以解决这个问题,但我无法很好地调整它,假设这是解决方案。匹配的客户端 ldap.conf 内容如下:
scope sub
ldap_version 3
nss_base_passwd dc=domain,dc=local?sub?&(uidNumber=*)
nss_base_group dc=domain,dc=local?sub?&(gidNumber=*)
nss_initgroups_ignoreusers root,ldap,dbus,xfs,haldaemon,nscd,nocpulse
bind_timelimit 1
timelimit 5
idle_timelimit 5
nss_reconnect_tries 3
nss_reconnect_sleeptime 1
nss_reconnect_maxconntries 3
bind_policy soft
uri ldap://10.3.110.117:389/ ldap://10.5.10.117:389/
base dc=bwinparty,dc=local
nss_initgroups backlink
pam_login_attribute uid
ssl no
奇怪的是,当 nscd 等连接到第二台服务器时,我们无法登录。以前 bind_timelimit 和 timelimit 都是 5,对我来说,这意味着如果时间绑定用尽,那么在整个时间限制窗口内就没有时间做其他事情了。不过,这项调整并没有带来任何改进。