LDAP高效数据同步:Syncrepl复制模式实战指南

#作者:朱雷

文章目录

一、Syncrepl 复制简介

1.1. 什么是复制模式

OpenLDAP有各种配置选项可用于创建复制目录。在以前的版本中,复制是指主服务器和一定数量的从属服务器。主服务器接受来自其他客户端的目录更新,而从属服务器仅接受来自(单个)主服务器的更新。复制结构定义严格,任何特定数据库只能充当一个角色,即主服务器或从属服务器。OpenLDAP 2.4 引入的另一个术语是多主服务器。由于 OpenLDAP 现在支持多种复制拓扑,这些术语已被弃用,取而代之的是提供者/多提供者和消费者。

提供者可以接受外部写入操作并使其可供消费者检索,消费者向提供者请求复制更新。与严格定义的主/从关系不同,提供者/消费者角色非常灵活,消费者收到的复制更新可以由该消费者进一步传播到其他服务器,因此消费者也可以同时充当提供者。此外,消费者不必是实际的LDAP服务器,它可能只是一个 LDAP客户端。

1.2. 什么是 syncrepl同步复制

Syncrepl 使用 LDAP 内容同步协议(简称 LDAP Sync)作为消费者同步协议。LDAP Sync 提供状态复制,支持基于拉取和基于推送的同步,并且不强制使用历史记录存储。在基于拉取的复制中,消费者会定期轮询提供者以获取更新。在基于推送的复制中,消费者会实时监听提供者发送的更新。由于该协议不需要历史记录存储,因此提供者不需要维护它收到的任何更新日志。

Syncrepl 通过维护和交换同步 cookie 来跟踪复制内容的状态。由于 syncrepl 消费者和提供者维护其内容状态,消费者可以轮询提供者内容以执行增量同步,方法是请求使消费者与提供者内容保持最新状态所需的条目。Syncrepl 还通过维护复制状态实现了对消费者的方便管理。消费者数据库可以从处于任何同步状态的消费者端或提供者端备份构建。Syncrepl 可以自动重新同步消费者数据库,使其与当前提供者内容保持最新状态。

1.2.1 同步方式

• refreshOnly

基于拉取的同步,其中不需要跟踪消费者服务器,也不维护任何历史信息。提供程序处理定期轮询请求所需的信息包含在请求本身的同步 cookie 中。为了优化基于拉取的同步,syncrepl 利用 LDAP 同步协议的当前阶段及其删除阶段,而不是依靠频繁的完全重新加载

在同步结束时,提供方会向消费者发送一个同步cookie,作为同步完成后消费者副本的状态指示。消费者在向提供方请求下一次增量同步时,会出示收到的cookie。

• refreshAndPersist

基于推送的同步。提供程序跟踪已请求持久搜索的消费者服务器,并在提供程序复制内容被修改时向它们发送必要的更新

当使用refreshAndPersist同步时,提供程序会在刷新阶段结束时发送同步 cookie,方法是发送带有 refreshDone=TRUE 的 Sync Info 消息。它还会将同步 cookie 附加到在同步搜索的持久阶段生成的SearchResultEntry消息中。在持久阶段,提供程序还可以在需要更新消费者端状态指示器时随时发送包含同步 cookie 的 Sync Info 消息。

二、Ldap环境部署

主机node 版本 IP 备注
ldap-0 2.4.44 192.168.1.129 主节点/提供者端
ldap-1 2.4.44 192.168.1.130 从节点/消费者端

三、配置复制类型

3.1. 提供者端配置

复制代码
[root@localhost ~]# egrep -v '^$|#' /usr/local/etc/openldap/slapd.conf
include		/usr/local/etc/openldap/schema/corba.schema
include		/usr/local/etc/openldap/schema/core.schema
include		/usr/local/etc/openldap/schema/cosine.schema
include		/usr/local/etc/openldap/schema/duaconf.schema
include		/usr/local/etc/openldap/schema/dyngroup.schema
include		/usr/local/etc/openldap/schema/inetorgperson.schema
include		/usr/local/etc/openldap/schema/java.schema
include		/usr/local/etc/openldap/schema/misc.schema
include		/usr/local/etc/openldap/schema/nis.schema
include		/usr/local/etc/openldap/schema/openldap.schema
include		/usr/local/etc/openldap/schema/pmi.schema
include		/usr/local/etc/openldap/schema/ppolicy.schema
pidfile		/usr/local/var/run/slapd.pid
argsfile	/usr/local/var/run/slapd.args
logfile	        /usr/local/var/slapd.log
database	mdb
maxsize		1073741824
suffix		"dc=zltest,dc=com"
rootdn		"cn=admin,dc=zltest,dc=com"
rootpw		{SSHA}qKw4zhjOu7o+fpSCOUuMMnviWRavEdK0
directory	/usr/local/var/openldap-data
# 添加索引
index objectclass,entryCSN,entryUUID eq
# 配置同步
overlay syncprov
# 自上次检查点以来已过去<ops>次操作或超过<minutes>时间,则执行新的检查点
syncprov-checkpoint 2 1
syncprov-sessionlog 100
# 非增量同步模式为FALSE
syncprov-reloadhint FALSE
syncprov-nopresent FALSE

3.2. 消费者端配置

复制代码
[root@localhost ~]# egrep -v '^$|#' /usr/local/etc/openldap/slapd.conf
include		/usr/local/etc/openldap/schema/corba.schema
include		/usr/local/etc/openldap/schema/core.schema
include		/usr/local/etc/openldap/schema/cosine.schema
include		/usr/local/etc/openldap/schema/duaconf.schema
include		/usr/local/etc/openldap/schema/dyngroup.schema
include		/usr/local/etc/openldap/schema/inetorgperson.schema
include		/usr/local/etc/openldap/schema/java.schema
include		/usr/local/etc/openldap/schema/misc.schema
include		/usr/local/etc/openldap/schema/nis.schema
include		/usr/local/etc/openldap/schema/openldap.schema
include		/usr/local/etc/openldap/schema/pmi.schema
include		/usr/local/etc/openldap/schema/ppolicy.schema
pidfile		/usr/local/var/run/slapd.pid
argsfile	/usr/local/var/run/slapd.args
logfile	        /usr/local/var/slapd.log
database	mdb
maxsize		1073741824
suffix		"dc=zltest,dc=com"
rootdn		"cn=admin,dc=zltest,dc=com"
rootpw		{SSHA}qKw4zhjOu7o+fpSCOUuMMnviWRavEdK0
directory	/usr/local/var/openldap-data
index objectclass,entryCSN,entryUUID eq
syncrepl rid=123        #必须不超过 3 位十进制数字
    provider=ldap://192.168.1.129:389  # 提供者得地址
    type=refreshOnly                 #同步类型拉取
    retry="5 5 300 5"                 #重试时间和次数
    interval=00:00:02:00 # 每2分钟一次执行轮询 ( refreshOnly ) 同步模式
    searchbase="dc=zltest,dc=com"
    scope=sub
    schemachecking=off
    bindmethod=simple
    binddn="cn=admin,dc=zltest,dc=com"
    credentials={SSHA}qKw4zhjOu7o+fpSCOUuMMnviWRavEdK0
updateref ldap://192.168.1.129:389      #可写转发到提供者

使用slaptest 检测提供者和消费者的配置文件:

复制代码
[root@localhost ~]# slaptest -u -f /usr/local/etc/openldap/slapd.conf
config file testing succeeded

3.3.启动服务

在提供者端服务器和消费者端服务器分别启动服务

复制代码
/usr/local/libexec/slapd
[root@localhost openldap]# netstat -luntp|grep slapd
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      5895/slapd          
tcp6       0      0 :::389                  :::*                    LISTEN      5895/slapd

3.4.测试同步是否生效

3.4.1.创建新用户文件

在提供者端创建一个新用户test1文件

复制代码
[root@ldap-0 openldap]# cat test_user.ldif 
#dn: ou=oa,dc=zltest,dc=com
#ou: oa
#objectclass: organizationalUnit
dn: cn=test1,ou=oa,dc=zltest,dc=com
ou: oa
cn: test1
sn: test1
objectclass: inetOrgPerson
objectclass: organizationalPerson
userPassword:: e1NTSEF9eTZZVktFUmMraG0vcFZYTkVVbzBFcDJyZlQ0MWxUM1g=

3.4.2.添加新用户:

复制代码
[root@ldap-0 openldap]# ldapadd -x -D 'cn=admin,dc=zltest,dc=com' -W -f test_user.ldif 
Enter LDAP Password: 
adding new entry "cn=test1,ou=oa,dc=zltest,dc=com"

3.4.3.检查新创建用户

查看提供者端添加的新用户:

复制代码
[root@ldap-0 openldap]# ldapsearch -x -b 'dc=zltest,dc=com' '(cn=test1)'
# extended LDIF
#
# LDAPv3
# base <dc=zltest,dc=com> with scope subtree
# filter: (cn=test1)
# requesting: ALL
#

# test1, oa, zltest.com
dn: cn=test1,ou=oa,dc=zltest,dc=com
ou: oa
cn: test1
sn: test1
objectClass: inetOrgPerson
objectClass: organizationalPerson
userPassword:: e1NTSEF9eTZZVktFUmMraG0vcFZYTkVVbzBFcDJyZlQ0MWxUM1g=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

3.4.4.消费者端检查新用户

等几分钟在消费者端查询新添加的用户账号:

复制代码
[root@ldap-1 ~]# ldapsearch -x -b 'dc=zltest,dc=com' '(cn=test1)'
# extended LDIF
#
# LDAPv3
# base <dc=zltest,dc=com> with scope subtree
# filter: (cn=test1)
# requesting: ALL
#

# test1, oa, zltest.com
dn: cn=test1,ou=oa,dc=zltest,dc=com
ou: oa
cn: test1
sn: test1
objectClass: inetOrgPerson
objectClass: organizationalPerson
userPassword:: e1NTSEF9eTZZVktFUmMraG0vcFZYTkVVbzBFcDJyZlQ0MWxUM1g=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

可以看到已经同步成功。

四、总结

Syncrepl同步复制优缺点:

优点

  • Syncrepl 是自同步的,可以从任何状态的消费者数据库开始,从完全空到完全同步,它都会自动做正确的事情来实现和维持同步
  • 它对变化发生的顺序完全不敏感
  • 它保证消费者和提供商内容之间的融合,无需人工干预
  • 无论消费者与提供商失去联系多久,它都可以重新同步
  • Syncrepl 可以双向操作
  • 可以随时添加消费者,而无需触及提供者的任何内容
  • 支持多提供商复制

缺点

基于对象的复制机制,当提供端上复制对象中的任何属性值发生更改时,每个消费者都会获取并处理完整的更改对象,包括复制期间更改和未更改的属性值。这种方法的一个优点是,当单个对象发生多项更改时,无需保留这些更改的精确顺序;只有条目的最终状态才是重要的。但是,当使用模式涉及对多个对象的单次更改时,这种方法可能会有缺点。

相关推荐
开着拖拉机回家4 个月前
【Ambari】使用 Knox 进行 LDAP 身份认证
大数据·hadoop·gateway·ambari·ldap·knox
余生H6 个月前
ToB项目身份认证AD集成(完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法介绍
javascript·windows·typescript·node.js·身份认证·ldap·windowsad
FreeBuf_9 个月前
LDAPWordlistHarvester:基于LDAP数据的字典生成工具
ldap·密码安全·账户安全·字典生成
散一世繁华,颠半世琉璃9 个月前
LDAP技术解析:打造安全、高效的企业数据架构
database·ldap
刘大猫.10 个月前
Centos7.9安装openldap
openldap·ldap·安装openldap·openldap客户端·openldap服务端
刘大猫.1 年前
java: 无法访问org.springframework.ldap.core.LdapTemplate
java·开发语言·spring boot·openldap·ldap
G皮T1 年前
【大数据】利用 Apache Ranger 管理 Amazon EMR 中的数据权限
大数据·aws·ranger·ldap·身份验证
极小狐1 年前
极狐GitLab 如何配置多个 LDAP?
gitlab·ldap
OceanWaves19931 年前
centos 7.6 安装 openldap 2.5.17
openldap·ldap