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

#作者:朱雷

文章目录

  • 一、Syncrepl 复制简介
    • 1.1. 什么是复制模式
    • 1.2. 什么是 syncrepl同步复制
  • 二、Ldap环境部署
  • 三、配置复制类型
    • 3.1. 提供者端配置
    • 3.2. 消费者端配置
    • 3.3.启动服务
    • 3.4.测试同步是否生效
  • 四、总结

一、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-02.4.44192.168.1.129主节点/提供者端
ldap-12.4.44192.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=subschemachecking=offbindmethod=simplebinddn="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 可以双向操作
  • 可以随时添加消费者,而无需触及提供者的任何内容
  • 支持多提供商复制

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 内核网络协议栈中的 struct packet_type:以 ip_packet_type 为例

在 Linux 内核的网络协议栈中,struct packet_type 是一个核心数据结构,用于注册特定协议类型的数据包处理逻辑。它定义了如何处理特定协议的数据包,并通过协议类型匹配机制实现协议分发。本文将通过分析 ip_packet_type 的定义和作用,深入探讨其在网络协议栈中的重要性。 …

QT Sqlite数据库-教程001 创建数据库和表-下

【1】创建带名称的数据库 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord> QString path QDir::currentPath(); QApplication::addLibraryPath(pathQString("/release/plugins")); QPluginLoader loader…

Cannot find module ‘vue‘ or its corresponding type declarations

在使用vue3vite创建新的工程时&#xff0c;在新增.vue文件时会出现Cannot find module vue这个错误。 只需要我们在项目中的.d.ts文件中添加以下代码即可 declare module *.vue {import { defineComponent } from vue;const component: ReturnType<typeof defineComponent&…

SSRF打靶总结

文章目录 一. PortSwigger1、本地服务器的基本SSRF2、基本的目标不是漏洞机3、Referer标头的外带SSRF4、简单黑名单的SSRF黑名单绕过思路&#xff1a; 5、重定向的SSRF6. 简单的白名单SSRF白名单绕过思路&#xff1a; 二、BWAPP1. SSRF 文件包含漏洞 | 内网探测2. XXE -> S…

STL-函数对象

1.函数对象 1.1 概念 重载函数调用操作符的类&#xff0c;其对象被称为函数对象 函数对象使用重载的&#xff08;&#xff09;时&#xff0c;行为类似函数调用&#xff0c;也成为仿函数 本质&#xff1a;函数对象&#xff08;仿函数&#xff09;是一个类&#xff0c;不是一…

多线程(Java)

注&#xff1a;本文为本人学习过程中的笔记 1.导入 1.进程和线程 我们希望我们的程序可以并发执行以提升效率&#xff0c;此时引入了多进程编程。可是创建进程等操作开销太大&#xff0c;于是就将进程进一步拆分成线程&#xff0c;减少开销。进程与进程之间所涉及到的资源是…

在 Dev-C++中编译运行GUI 程序介绍(三)有趣示例一组

在 Dev-C中编译运行GUI程序介绍&#xff08;三&#xff09;有趣示例一组 前期见 在 Dev-C中编译运行GUI 程序介绍&#xff08;一&#xff09;基础 https://blog.csdn.net/cnds123/article/details/147019078 在 Dev-C中编译运行GUI 程序介绍&#xff08;二&#xff09;示例&a…

【高校主办】2025年第四届信息与通信工程国际会议(JCICE 2025)

重要信息 会议网址&#xff1a;www.jcice.org 会议时间&#xff1a;2025年7月25-27日 召开地点&#xff1a;哈尔滨 截稿时间&#xff1a;2025年6月15日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,Scopus 会议简介 JCICE 2022、JCICE 2023、JCICE 2…

【Linux】Linux 操作系统 - 03 ,初步指令结尾 + shell 理解

文章目录 前言一、打包和压缩二、有关体系结构 (考)面试题 三、重要的热键四、shell 命令及运行原理初步理解五、本节命令总结总结 前言 本篇文章 , 笔者记录的笔记内容包含 : 基础指令 、重要热键 、shell 初步理解 、权限用户的部分问题 。 内容皆是重要知识点 , 需要认真理…

Python: sqlite3.OperationalError: no such table: ***解析

出现该错误说明数据库中没有成功创建 reviews 表。以下是完整的解决方案: 步骤 1:创建数据库表 在插入数据前,必须先执行建表语句。请通过以下任一方式创建表: 方式一:使用 SQLite 命令行 bash 复制 # 进入 SQLite 命令行 sqlite3 reviews.db# 执行建表语句 CREATE T…

VSCode CLine 插件自定义配置使用 Claude 3.7 模型进行 AI 开发

一个互联网技术玩家&#xff0c;一个爱聊技术的家伙。在工作和学习中不断思考&#xff0c;把这些思考总结出来&#xff0c;并分享&#xff0c;和大家一起交流进步。 本文介绍如何在 Visual Studio Code (VSCode) 中安装和自定义配置 CLine 插件&#xff0c;并使用 Claude 3.7 模…

【VSCode配置】运行springboot项目和vue项目

目录 安装VSCode安装软件安装插件VSCode配置user的全局设置setting.jsonworkshop的项目自定义设置setting.jsonworkshop的项目启动配置launch.json 安装VSCode 官网下载 安装软件 git安装1.1.12版本&#xff0c;1.2.X高版本无法安装node14以下版本 nvm安装&#xff08;github…

linux shell编程之条件语句(二)

目录 一. 条件测试操作 1. 文件测试 2. 整数值比较 3. 字符串比较 4. 逻辑测试 二. if 条件语句 1. if 语句的结构 (1) 单分支 if 语句 (2) 双分支 if 语句 (3) 多分支 if 语句 2. if 语句应用示例 (1) 单分支 if 语句应用 (2) 双分支 if 语句应用 (3) 多分支 …

榕壹云在线商城系统:基于THinkPHP+ Mysql+UniApp全端适配、高效部署的电商解决方案

项目背景&#xff1a;解决多端电商开发的痛点 随着移动互联网的普及和用户购物习惯的碎片化&#xff0c;传统电商系统面临以下挑战&#xff1a; 1. 多平台适配成本高&#xff1a;需要同时开发App、小程序、H5等多端应用&#xff0c;重复开发导致资源浪费。 2. 技术依赖第三方…

神经动力学系统与计算及AI拓展

大脑&#xff0c;一个蕴藏在我们颅骨之内的宇宙&#xff0c;以活动脉动&#xff0c;如同由电信号和化学信号编织而成的交响乐&#xff0c;精巧地协调着思想、情感和行为。但是&#xff0c;这种复杂的神经元舞蹈是如何产生我们丰富多彩的精神生活的呢&#xff1f;这正是神经动力…

K8s常用基础管理命令(一)

基础管理命令 基础命令kubectl get命令kubectl create命令kubectl apply命令kubectl delete命令kubectl describe命令kubectl explain命令kubectl run命令kubectl cp命令kubectl edit命令kubectl logs命令kubectl exec命令kubectl port-forward命令kubectl patch命令 集群管理命…

本地化部署DeepSeek-R1蒸馏大模型:基于飞桨PaddleNLP 3.0的实战指南

目录 一、飞桨框架3.0&#xff1a;大模型推理新范式的开启1.1 自动并行机制革新&#xff1a;解放多卡推理1.2 推理-训练统一设计&#xff1a;一套代码全流程复用 二、本地部署DeepSeek-R1-Distill-Llama-8B的实战流程2.1 机器环境说明2.2 模型与推理脚本准备2.3 启动 Docker 容…

单片机方案开发 代写程序/烧录芯片 九齐/应广等 电动玩具 小家电 语音开发

在电子产品设计中&#xff0c;单片机&#xff08;MCU&#xff09;无疑是最重要的组成部分之一。无论是消费电子、智能家居、工业控制&#xff0c;还是可穿戴设备&#xff0c;小家电等&#xff0c;单片机的应用无处不在。 单片机&#xff0c;简而言之&#xff0c;就是将计算机…

【位运算】两整数之和

文章目录 371. 两整数之和解题思路&#xff1a;位运算 371. 两整数之和 371. 两整数之和 ​ 给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - &#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3示例 2&#xff1…

使用Python从零实现一个端到端多模态 Transformer大模型

嘿&#xff0c;各位&#xff01;今天咱们要来一场超级酷炫的多模态 Transformer 冒险之旅&#xff01;想象一下&#xff0c;让一个模型既能看懂图片&#xff0c;又能理解文字&#xff0c;然后还能生成有趣的回答。听起来是不是很像超级英雄的超能力&#xff1f;别急&#xff0c…