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.pswp.cn/pingmian/76438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76438.shtml
英文地址,請注明出處:http://en.pswp.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…