我正在尝试同步 ldap 从服务器和主服务器。主服务器使用 openldap 2.3.43-12,从服务器使用 openldap 2.4.23。我复制了 /var/lib/ldap 中的文件,启动了服务器,然后出现以下错误:
Oct 22 16:16:41 xe-ldap-slave1 slapd[12111]: bdb(dc=mydomaine,dc=fr): Program version 4.7 doesn't match environment version 4.4
Oct 22 16:16:41 xe-ldap-slave1 slapd[12111]: bdb_db_open: database "dc=mydomaine,dc=fr" cannot be opened, err -30971. Restore from backup!
Oct 22 16:16:41 xe-ldap-slave1 slapd[12111]: bdb(dc=mydomaine,dc=fr): txn_checkpoint interface requires an environment configured for the transaction subsystem
Oct 22 16:16:41 xe-ldap-slave1 slapd[12111]: bdb_db_close: database "dc=mydomaine,dc=fr": txn_checkpoint failed: Invalid argument (22).
Oct 22 16:16:41 xe-ldap-slave1 slapd[12111]: backend_startup_one (type=bdb, suffix="dc=mydomaine,dc=fr"): bi_db_open failed! (-30971)
Oct 22 16:16:41 xe-ldap-slave1 slapd[12111]: bdb_db_close: database "dc=mydomaine,dc=fr": alock_close failed
我已经使用了db_upgrade命令来升级新的从属服务器上的数据库文件,但是启动slapd时仍然出现同样的错误。
主服务器是 Centos 5.5 32 位和 openldap 2.3.43-12 从属服务器是 Centos 6.3 64 位和 openldap 2.4.23 一切都使用 yum 安装。
当从属服务器比主服务器更新时,从 ldap 主服务器和从属服务器同步数据库文件的正确方法是什么?
我按照 84104 的建议操作,但在从属服务器上收到错误
syncrepl 配置
syncrepl rid=003
provider=ldaps://ldap0.lan.myserver.net:636
bindmethod=simple
binddn="cn=syncuser,dc=mydomaine,dc=fr"
scope=sub
attrs="*"
credentials=some_password
searchbase="dc=mydomaine,dc=fr"
logbase="cn=accesslog"
logfilter="(&(objectClass=auditWriteObject)(reqResult=0))"
schemachecking=on
type=refreshAndPersist
retry="60 +"
syncdata=accesslog
该 syncrepl 配置在其他从属服务器上运行良好。
以下是从服务器上的错误:
Oct 23 18:28:30 xe-ldap-slave1 slapd[1415]: slap_client_connect: URI=ldaps://ldap0.lan.myserver.com:636 DN="cn=syncuser,dc=mydomaine,dc=fr" ldap_sasl_bind_s failed (-1)
Oct 23 18:28:30 xe-ldap-slave1 slapd[1415]: do_syncrepl: rid=003 rc -1 retrying
以下是主服务器上的错误:
Oct 23 18:29:30 ldap0 slapd[15265]: conn=201 fd=35 ACCEPT from IP=192.168.150.100:47690 (IP=0.0.0.0:636)
Oct 23 18:29:30 ldap0 slapd[15265]: conn=201 fd=35 closed (TLS negotiation failure)
我可以使用配置为从新的从属服务器同步的用户在主服务器上进行 ldap 搜索。
ldapsearch -LLL -x -H ldaps://192.168.150.99:636 -x -W -b dc=mydomaine,dc=fr-D"cn=syncuser,dc=mydomaine,dc=fr"
答案1
LDAP 复制下syncrepl
非常强大。服务器不必是同一版本,它们只需相互理解即可。(正确的多主机需要 2.4.X,但据我所知,这不是您要问的。)
"The consumer replica can be constructed from a consumer-side or a provider-side backup at any synchronization status."
在这种情况下最值得注意的是,syncrepl
可以在具有以下功能的服务器上创建适当的副本:绝不之前已通过任何方法同步过。
该怎么办:
- 停止副本
slapd
/var/lib/ldap
删除(除DB_CONFIG
)的内容- 确保您的
syncrepl
或olcsyncrepl
指令正确 - 启动副本
slapd
- 等待副本同步
注意:使用某些覆盖(例如 memberof)将导致您丢失(覆盖)副本上的operational attributes
creatorsName
和createTimestamp
,但除此之外,一切都将保持不变。
答案2
我认为你应该在主服务器和从服务器上运行相同的版本。
如果您确实想要这种方式,请以 LDIF 格式传输数据:slapcat 和 slapadd 可用于转储和恢复数据库。这些是离线实用程序,因此请在使用前停止 ldap 服务器。
编辑:据我记得,复制是脆弱的,我并不是说使用相同的版本是强制性的,只是建议这样做。
db_upgrade 直接修改 slapd 先前创建的文件。最终结果可能没问题。