OpenLDAP篇-OpenLDAP主从及高可用05

1、OpenLDAP主从/主主

1.1 主从/主主基本概念

Openldap使⽤Syncrepl同步机制来实现主从复制、双主复制

主从复制(Single Master Replication ),⼀主⼀从

  • 主节点是唯⼀可以处理写操作的节点。写操作包括数据的新增、修改和删除。其次,所有的更改都必须先在主节点完成,然后再同步给从节点。
  • 从服务器是主节点的只读副本。它只能处理读操作,⽐如查找⽤户信息或者验证⽤户身份。它不允许更改数据,只能从主服务器同步最新的数据。

双主复制(Multi-Master Replication):

  • 在双主复制模式下,两台服务器都可以同时处理 读 和 写 操作。
  • 这些服务器之间会相互进⾏数据同步,确保每台服务器上的数据都保持⼀致。

1.2 主从/主主环境准备

主从复制架构

系统 地址 主机名 ⻆⾊
RockyLinux9.x 10.0.0.101 ldap-master01.oldxu.net Openldap主节点
RockyLinux9.x 10.0.0.102 ldap-master02.oldxu.net Openldap从节点

双主复制架构

系统 地址 主机名 ⻆⾊
RockyLinux9.x 10.0.0.101 ldap-master01.oldxu.net Openldap主节点
RockyLinux9.x 10.0.0.102 ldap-master02.oldxu.net Openldap主节点

1.3 配置时间同步

两台服务器必须保证时间⼀致,不然时间不⼀致会造成双主同步失败

sed -e 's|^#mirrorlist=|mirrorlist=|g' \
    -e 's|^baseurl=https://mirrors.aliyun.com/rockylinux|#baseurl=http://dl.rockylinux.org/$contentdir|g' \
    -i.bak \
    /etc/yum.repos.d/rocky*.repo
    
yum install epel-release
[root@ldap-master01 ~]# yum install ntpsec -y
[root@ldap-master01 ~]# ntpdate ntp.aliyun.com
[root@ldap-master02 ~]# yum install ntpsec -y
[root@ldap-master02 ~]# ntpdate ntp.aliyun.com

2、部署OpenLDAP从节点

2.1 部署概述

OpenLDAP 从节点不需要进⾏复杂的配置,因为数据条⽬都是从 主节点 同步过来的。但它任需要完成以下⼏步骤:

  • 1、在从节点上安装 OpenLDAP 服务。
  • 2、导⼊OpenLDAP所需要的schema,以及sudo schema。
  • 3、复制主节点的TLS证书,并且将证书应⽤到从节点上;
  • 4、配置与主节点相同的基础域、以及RootDN
  • 5、加载memberOf插件,如果不配置该插件同步⽤户的属性会出错(如果主节点没有使⽤该插件可不配置)
  • 6、配置从节点的⽇志功能,在同步失败时,可以通过⽇志分析错误的原因。

2.2 安装OpenLDAP

[root@ldap-master02 ~]# yum install openldap-servers openldap-clients -y
[root@ldap-master02 ~]# systemctl enable slapd --now
Created symlink /etc/systemd/system/openldap.service → /usr/lib/systemd/system/slapd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/slapd.service → /usr/lib/systemd/system/slapd.service.

2、导⼊Schema(如果主节点使⽤了sudo,也需要导⼊sudo的ldif)

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/share/doc/sudo/schema.olcSudo

2.3 配置TLS证书

[root@ldap-master02 ~]# scp root@ldap-master01.oldxu.net:/etc/openldap/certs/* /etc/openldap/certs/
[root@ldap-master02 ~]# chown ldap.ldap /etc/openldap/certs/ldapserver.{crt,key}
[root@ldap-master02 ~]# ll /etc/openldap/certs/
总⽤量 8
-rw-r--r-- 1 ldap ldap 1489 10⽉ 7 04:17 ldapserver.crt
-rw------- 1 ldap ldap 1704 10⽉ 7 04:17 ldapserver.key

3、为Openldap应⽤TLS证书

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/ldapserver.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldapserver.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldapserver.key
EOF

4、检查配置是否⽣效

[root@ldap-master02 ~]# cat /etc/openldap/slapd.d/cn\=config.ldif |grep olcTLS
olcTLSCACertificateFile: /etc/openldap/certs/ldapserver.crt
olcTLSCertificateFile: /etc/openldap/certs/ldapserver.crt
olcTLSCertificateKeyFile: /etc/openldap/certs/ldapserver.key

2.4 设置LDAP基础域

1、配置数据库的根域

ldapadd -Y EXTERNAL -H ldapi:// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=oldxu,dc=net
EOF

2、配置LDAP的root DN为 cn=admin,dc=oldxu,dc=net ,并设定对应的密码为 123456

ldapadd -Y EXTERNAL -H ldapi:// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=oldxu,dc=net
-
add: olcRootPW
olcRootPW: {SSHA}E/9X7SeOgptdzIaxBHtn+N+Yv1bVHBD3
EOF

2.5 配置memberOf插件

1、加载 memberof overlay、refint overlay 模块

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: memberof.la
olcModuleLoad: refint.la
olcModulePath: /usr/lib64/openldap
EOF

2、将 memberof overlay 应⽤到数据库中

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
EOF

3、将 refint overlay 应⽤到数据库中

ldapadd -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcOverlay={1}refint,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof member manager owner
EOF

4、检查模块以及配置是否都成功加载

ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL -Q "(objectClass=olcModuleList)" # 模块
ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL -Q "(olcOverlay=*)" # 配置

2.6 配置ldap⽇志功能

1、开启⽇志,并将⽇志级别设置为 sync 和 stats,仅记录同步相关的信息和统计数据。

ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: sync stats
EOF

2、将⽇志信息写⼊⾄ /var/log/ldap.log ⽂件中

echo "local4.* /var/log/ldap.log" >> /etc/rsyslog.conf
systemctl restart rsyslog

3、重启ldap服务

systemctl restart slapd

3、OpenLDAP主从复制

3.1 主从复制操作步骤

1、配置主节点(Master)

  • 1、加载 syncprov.la 模块。并启⽤同步功能。
  • 2、使⽤ cn=config 配置⽅式来修改主服务器的设置,启⽤数据同步协议 (Syncrepl)。

2、配置从节点(Slave)

  • 1、加载 syncprov.la 模块,并启⽤同步功能
  • 2、在从服务器上,设置主节点的连接信息,以及如何进⾏数据同步。

3.2 加载syncprov同步模块

注意:同步模块在Master以及Slave节点上都需要加载,并配置,因此如下操作在 Master和Slave上都必须执⾏。

1、加载 syncprov.la 模块

ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov.la
EOF

2、检查 syncprov.la 模块是否加载成功

[root@ldap-master02 ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=module{0},cn=config
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib64/openldap
olcModuleLoad: {0}memberof.la
olcModuleLoad: {1}refint.la
olcModuleLoad: {2}syncprov.la

3.3 启⽤syncprov数据同步

1、将数据同步协议应⽤到数据中。

[root@ldap-master02 ~]# ldapadd -Y EXTERNAL -H ldapi:/// << EOF
dn: olcOverlay=syncprov,olcDatabase={2}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
EOF

参数含义:

  • olcOverlay: syncprov : 表示启⽤数据同步。
  • olcSyncProvCheckpoint 100 10 : 配置同步检查频率,每进⾏ 100 次写操作或10分钟,都会创建⼀个同步检查点 ,确保同步状态在较⻓时间未发⽣写操作时仍然保持⼀致。
  • olcSyncProvSessionlog 100 : 表示最多存储最近 100 条修改记录, 会话⽇志⽤于增量同步。当从服务器断线重连时,它可以从会话⽇志中快速 获取最近的更改,⽽不需要重新同步整个数据库。有助于提⾼同步效率,尤其是当从服务器频繁断开和重新连接时。

2、查询 syncprov overlay 是否已经在数据库上启⽤

[root@ldap-master02 ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL -Q "(olcOverlay=*)"
...
dn: olcOverlay={2}syncprov,olcDatabase={2}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {2}syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100

3.4 配置从节点同步规则

1、在从节点上配置同步规则:

[root@ldap-master02 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncrepl: rid=001
  provider=ldap://ldap-master01.oldxu.net
  type=refreshAndPersist
  searchbase="dc=oldxu,dc=net"
  bindmethod=simple
  binddn="cn=admin,dc=oldxu,dc=net"
  credentials=123456
  schemachecking=on
  retry="5 10 300 +"
  tls_reqcert=allow
EOF

参数含义:

  • olcSyncrepl :⽤来指定同步进程的唯⼀标识,并且每个服务器上的rid都必须唯⼀。
  • provider : 这是主服务器的 URL,表示从服务器要从哪个主服务器同步数据。
  • type :表示同步类型, RefreshOnly (定期全量同步)和 RefreshAndPersist (实时增量同步)
  • searchbase : 这是从服务器要同步的起始位置。
  • bindmethod : simple 表示使⽤,⽤户名密码进⾏身份认证。
  • binddn :主服务器上的⽤户DN,这个 DN 必须存在,并且有完整读取主服务器上数据的权限。
  • credentials :主服务器上的⽤户DN密码
  • schemachecking : 启⽤schema检查,确保数据的⼀致性。
  • retry="5 10 300 +" :定义从服务器在连接失败后如何重试 ,第⼀次重试间隔5秒、第⼆次10秒,接下来300秒,+表示⽆限次重试 </font>
  • tls_reqcert=allow : 从节点尝试验证主节点证书。如果验证失败(例如证书⽆效或过期),仍然允许建⽴同步连接。

2、使⽤ ldapsearch 检查配置结果

[root@ldap-master02 ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b "olcDatabase={2}mdb,cn=config"
dn: olcDatabase={2}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {2}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=oldxu,dc=net
olcRootDN: cn=admin,dc=oldxu,dc=net
olcRootPW: {SSHA}E/9X7SeOgptdzIaxBHtn+N+Yv1bVHBD3
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcSyncrepl: {0}rid=001 provider=ldap://ldap-master01.oldxu.net type=refreshAn
 dPersist searchbase="dc=oldxu,dc=net" bindmethod=simple binddn="cn=admin,dc=o
 ldxu,dc=net" credentials=123456 schemachecking=on retry="5 10 300 +" tls_reqc
 ert=allow
 ...

3.5 测试并验证主从同步

⽅法1:创建⽤户,检查两端是否都存在

# 1、在主服务器上添加新条⽬
[root@ldap-master01 ~]# ldapadd -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 <<EOF
dn: cn=testuser,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: testuser
sn: user
EOF
# 2、检查从服务器是否同步该条⽬
[root@ldap-master02 ~]# ldapsearch -x -LLL -H ldap://ldap-master02.oldxu.net -b "dc=oldxu,dc=net" "cn=testuser"
dn: cn=testuser,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: testuser
sn: user

⽅法2:刚才同步了条⽬,检查从⽇志

[root@ldap-master02 ~]# tail -f /var/log/ldap.log
# 这条⽇志表示从服务器正在执⾏同步操作,rid=001 是同步关系的唯⼀标识符。
ldap-master02 slapd[30159]: do_syncrep2: rid=001 cookie=rid=001,csn=20241119115843.614286Z#000000#000#000000
# 这是同步的 cookie,包含了同步的状态,特别是 CSN,⽤于标识主服务器上最新的更改。这个CSN 表示这是⼀次增量同步,因为它只同步了⾃上次同步后发⽣的变化。
ldap-master02 slapd[30159]: syncrepl_message_to_entry: rid=001 DN: cn=test
user,dc=oldxu,dc=net, UUID: 5e795a68-3ab9-103f-8647-5114823d4f8f
ldap-master02 slapd[30159]: syncrepl_entry: rid=001 LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_ADD) csn=20241119115843.614286Z#000000#000#000000
ldap-master02 slapd[30159]: syncrepl_entry: rid=001 be_search (0)
ldap-master02 slapd[30159]: syncrepl_entry: rid=001 cn=testuser,dc=oldxu,dc=net
ldap-master02 slapd[30159]: slap_queue_csn: queueing 0x7f98b4120d10 20241119115843.614286Z#000000#000#000000
ldap-master02 slapd[30159]: slap_graduate_commit_csn: removing 0x7f98b4120d10 20241119115843.614286Z#000000#000#000000
# be_add:表示在从服务器正在执⾏的操作为 添加条⽬ (add)。
ldap-master02 slapd[30159]: syncrepl_entry: rid=001 be_add cn=testuser,dc=oldxu,dc=net (0)
ldap-master02 slapd[30159]: slap_queue_csn: queueing 0x7f98b4135530 20241119115843.614286Z#000000#000#000000
ldap-master02 slapd[30159]: slap_graduate_commit_csn: removing 0x7f98b4135530 20241119115843.614286Z#000000#000#000000

⽅法3:对⽐主从服务器之间的条⽬数量

# 主服务器条⽬
[root@ldap-master01 ~]# ldapsearch -x -LLL -b "dc=oldxu,dc=net" contextCSNdn: dc=oldxu,dc=net
contextCSN: 20241119115843.614286Z#000000#000#000000
# 从服务器条⽬
[root@ldap-master02 ~]# ldapsearch -x -LLL -b "dc=oldxu,dc=net" contextCSNdn: dc=oldxu,dc=net
contextCSN: 20241119115843.614286Z#000000#000#000000

⽅法4:主可以写⼊数据,从不能写⼊数据,可以使⽤ Ldapadmin 图形⼯具演示

[root@ldap-master02 ~]# ldapadd -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 <<EOF
dn: cn=testuser,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: testuser
sn: user
EOF
adding new entry "cn=testuser,dc=oldxu,dc=net"
ldap_add: Server is unwilling to perform (53) 
        additional info: shadow context; no update referral
# 该错误通常表示您正在尝试向一个只读的复制副本(shadow context)添加条目,而该副本不允许直接修改。

4、OpenLDAP双主复制

4.1 双主复制配置步骤

1、主节点1(原Master节点)

  • 1、配置ServerID, 以便系统能够区分不同的服务器
  • 2、加载 syncprov.la 模块,启⽤同步功能。
  • 3、使⽤ cn=config 配置⽅式来修改主服务器的设置,启⽤ 数据同步协议(Syncrepl)
  • 4、使⽤ cn=config 配置⽅式来修改主服务器的设置,启⽤ 镜像模式 Mirror Mode ,确保主服务器可以处理写操作。
  • 5、在主节点1上,指定从主节点2上同步数据。

2、主节点2(原Slave节点)

  • 1、配置ServerID, 以便系统能够区分不同的服务器
  • 2、加载 syncprov.la 模块,启⽤同步功能。
  • 3、使⽤ cn=config 配置⽅式来修改主服务器的设置,启⽤ 数据同步协议(Syncrepl)。
  • 4、使⽤ cn=config 配置⽅式来修改主服务器的设置,启⽤ 镜像模式 Mirror Mode ,确保主服务器可以处理写操作。
  • 5、在主节点2上,指定从主节点1上同步数据。

4.2 配置节点的ServerID

1、 在 Master01 节点上,配置 serverID :

[root@ldap-master01 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 1
EOF

2、 在 Master02 节点上,配置 serverID :

[root@ldap-master02 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 2
EOF

4.3 加载syncprov同步模块

注意:同步模块在Master01、Master02 上都需要加载,并配置,因此如下操作在Master01和Master02节点上都必须执⾏。

1、加载 syncprov.la 模块

ldapmodify -Y EXTERNAL -H ldapi:/// << EOF
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov.la
EOF

2、检查 syncprov.la 模块是否加载成功

[root@ldap-master01 ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=module{0},cn=config
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib64/openldap
olcModuleLoad: {0}memberof.la
olcModuleLoad: {1}refint.la
olcModuleLoad: {2}syncprov.la

4.4 启⽤syncprov数据同步

1、将数据同步协议应⽤到数据中。

ldapadd -Y EXTERNAL -H ldapi:/// << EOF
dn: olcOverlay=syncprov,olcDatabase={2}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
EOF

参数含义:

  • olcOverlay: syncprov : 表示启⽤数据同步。
  • olcSyncProvCheckpoint 100 10 : 配置同步检查频率,每进⾏ 100 次写操作或10分钟,都会创建⼀个同步检查点 ,确保同步状态在较⻓时间未 发⽣写操作时仍然保持⼀致。
  • olcSyncProvSessionlog 100 : 表示最多存储最近 100 条修改记录, 会话⽇志⽤于增量同步。当从服务器断线重连时,它可以从会话⽇志中快速 获取最近的更改,⽽不需要重新同步整个数据库。有助于提⾼同步效率,尤其是当从服务器频繁断开和重新连接时。

2、查询 syncprov overlay 是否已经在数据库上启⽤

ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" -LLL -Q "(olcOverlay=*)"

4.5 配置双主同步SyncRepl

在Master01节点上,添加同步配置,指向到Master02

[root@ldap-master01 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncrepl: rid=002
  provider=ldap://ldap-master02.oldxu.net
  type=refreshAndPersist
  searchbase="dc=oldxu,dc=net"
  bindmethod=simple
  binddn="cn=admin,dc=oldxu,dc=net"
  credentials=123456
  schemachecking=on
  retry="5 10 300 +"
  tls_reqcert=allow
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF


# 检查配置
[root@k8s-master31 ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b "olcDatabase={2}mdb,cn=config"
dn: olcDatabase={2}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {2}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=oldxu,dc=net
olcRootDN: cn=admin,dc=oldxu,dc=net
olcRootPW: {SSHA}sHbtQDiqVcMXP4hZCXZ2567+qmRrt7el
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcSyncrepl: {0}rid=002 provider=ldap://ldap-master02.oldxu.net type=refreshAn
 dPersist searchbase="dc=oldxu,dc=net" bindmethod=simple binddn="cn=admin,dc=o
 ldxu,dc=net" credentials=123456 schemachecking=on retry="5 10 300 +" tls_reqc
 ert=allow
olcMultiProvider: TRUE
...

在Master02节点上(原Slave节点),添加同步配置,指向到Master01

(该节点 如果在此前主从中配置过,仅添加 olcMirrorMode: TRUE 字段即可, olcSyncrepl可不配置)

[root@ldap-master02 ~]# cat <<EOF | ldapmodify -Y EXTERNAL -H ldapi:///
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncrepl: rid=001
 provider=ldap://ldap-master01.oldxu.net
 type=refreshAndPersist
 searchbase="dc=oldxu,dc=net"
 bindmethod=simple
 binddn="cn=admin,dc=oldxu,dc=net"
 credentials=123456
 schemachecking=on
 retry="5 10 300 +"
 tls_reqcert=allow
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF

# 只添加olcMirrorMode
[root@ldap-master02 ~]# cat <<EOF | ldapmodify -Y EXTERNAL -H ldapi:///
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcMirrorMode
olcMirrorMode: TRUE
EOF

# 检查配置
[root@ldap-master02 ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b "olcDatabase={2}mdb,cn=config"
dn: olcDatabase={2}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {2}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=oldxu,dc=net
olcRootDN: cn=admin,dc=oldxu,dc=net
olcRootPW: {SSHA}E/9X7SeOgptdzIaxBHtn+N+Yv1bVHBD3
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcSyncrepl: {0}rid=001 provider=ldap://ldap-master01.oldxu.net type=refreshAn
 dPersist searchbase="dc=oldxu,dc=net" bindmethod=simple binddn="cn=admin,dc=o
 ldxu,dc=net" credentials=123456 schemachecking=on retry="5 10 300 +" tls_reqc
 ert=allow
olcMultiProvider: TRUE
...

4.6 验证双主同步SyncRepl

1、在master01节点,添加条⽬,然后检查master02是否存在

# 在master01创建⼀个条⽬
[root@ldap-master01 ~]# ldapadd -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 <<EOF
dn: cn=testuser2,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: testuser2
sn: testuser2
EOF
# 检查master02节点是否同步该条⽬
[root@ldap-master02 ~]# ldapsearch -x -LLL -H ldap://ldap-master02.oldxu.net -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=testuser2"
dn: cn=testuser2,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: testuser2
sn: testuser2

2、在master02节点,修改条⽬,然后检查master01是否也发⽣变化

# 在master02上修改条⽬
[root@ldap-master02 ~]# ldapmodify -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 <<EOF
dn: cn=testuser2,dc=oldxu,dc=net
changetype: modify
replace: sn
sn: UpdatedTest-master
EOF
# 检查master01是否更随着修改了
[root@ldap-master01 ~]# ldapsearch -x -LLL -H ldap://ldap-master01.oldxu.net -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=testuser2"
dn: cn=testuser2,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master
sn: UpdatedTest-master

3、在master02节点,删除条⽬,然后检查master01是否也删除了

[root@ldap-master02 ~]# ldapdelete -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 "cn=testuser2,dc=oldxu,dc=net"
[root@ldap-master01 ~]# ldapsearch -x -LLL -H ldap://ldap-master01.oldxu.net -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=testuser2"

4.7 测试双主同步可⽤性

测试双主模式的可⽤性,我们可以通过以下⽅式来验证:

1、模拟⼀台节点宕机:假设我们暂时关闭其中⼀台主服务器,看看另⼀台服务器是否还能正常⼯作。

2、在正常的节点上操作:在运⾏的节点上新增⼀些数据,⽐如添加⼀个新⽤户,确保它能正常写⼊数据库。

3、恢复宕机的主节点:重新启动这台宕机的节点,检查它是否会⾃动从另⼀台服务器获取刚刚添加的数据。

1、停⽌ master01节点的ldap服务

[root@ldap-master01 ~]# systemctl stop slapd

2、在 master02节点上添加⼀个新的条⽬

[root@ldap-master02 ~]# ldapadd -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 <<EOF
dn: cn=testuser3,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: testuser3
sn: testuser3
EOF

3、恢复故障的master01节点

[root@ldap-master01 ~]# systemctl start slapd

4、然后在 master01节点上 上搜索 testuser3 ,确认它是否同步了 master02节点上变化的数据

[root@ldap-master02 ~]# ldapsearch -x -LLL -H ldap://ldap-master01.oldxu.net -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=testuser3"

5、OpenLDAP⾼可⽤

5.1 ⾼可⽤⽅案介绍

前⾯我们已经配置了双主模式,两台服务器可以相互的同步数据,这确实能够提⾼系统的可⽤性。但对于客户端来说,直接连接两台服务器并不现实,因为客户端通常只能连接⼀个固定的地址/域名来访问LDAP服务。因此,想要实现双主模式的⾼可⽤,可以选择如下两种⽅案来实现:

⽅案1:使⽤Haproxy负载均衡

  • ⽅案描述:在两台 OpenLDAP 服务前⾯部署⼀个 HAProxy 负载均衡器,客户端只需要连接到 HAProxy 的地址即可。
  • ⼯作原理:HAProxy 会将客户端的请求分发到后端的任意⼀台 OpenLDAP服务器上。如果其中⼀台服务器发⽣故障,HAProxy 会⾃动检测并停⽌将流量发送到故障节点,并将请求转发到正常节点。

优点:

  • 负载分担:两台服务器可以同时处理请求,从⽽提⾼系统性能和资源利⽤率。
  • ⽆感切换:当⼀台服务器故障时,客户端不会感知到变化,服务仍然可⽤。
  • 限制:如果 HAProxy 本身发⽣故障,那么整个 OpenLDAP 服务将不可⽤, 因此还需要考虑Haproxy的⾼可⽤,但会带来额外的成本。
  • 适⽤场景:适合⾼并发场景,要求两台服务器能同时进⾏⼯作。

⽅案2:使⽤Keepalived提供虚拟VIP

  • ⽅案描述: 使⽤ Keepalived 为两台 OpenLDAP 节点⽣成⼀个虚拟的IP地址。客户端只需要连接这个虚拟IP地址即可。
  • ⼯作原理:两台服务器中只有⼀台服务器会绑定虚拟 IP(称为主节点)。当主节点宕机时,Keepalived 会⾃动将虚拟 IP 切换到另⼀台服务器(称为备节点),以确保服务的可⽤性。
  • 优点:
    • 简单易⽤:客户端只需要配置⼀个固定的虚拟 IP 地址,⽆需了解后端的 服务器情况。
    • 快速故障切换:主节点发⽣故障时,Keepalived 会在⼏秒钟内完成虚拟IP 的漂移,客户端⽆感知。
  • 限制:只有⼀台服务器会⼯作,另⼀台服务器处于备⽤状态,⽆法同时处理请求,资源利⽤率较低。
  • 适⽤场景:适合对性能要求不⾼,但对系统稳定性和故障切换要求⾼的场景。

5.2 Haproxy实现LDAP⾼可⽤

1、安装Haproxy

yum install haproxy openldap-clients -y

2、配置Haproxy

[root@ldap-ha ~]# vim /etc/haproxy/haproxy.cfg
# --------------ldap-----------------------------
frontend ldap
 bind *:389 # ldap默认端⼝
 mode tcp # 使⽤ TCP 模式
 use_backend ldap_servers
backend ldap_servers
 mode tcp
 balance roundrobin
 server ldap1 10.0.0.101:389 check
 server ldap2 10.0.0.102:389 check
# --------------ldaps-----------------------------
frontend ldaps
 bind *:636 # ldaps 默认端⼝
 mode tcp # 使⽤ TCP 模式
 use_backend ldaps_servers
backend ldaps_servers
 mode tcp
 balance roundrobin
 server ldaps1 10.0.0.101:636 check
 server ldaps2 10.0.0.102:636 check

3、添加⼀个新的条⽬

ldapadd -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 <<EOF
dn: cn=test-master01,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master01
sn: test-master01
EOF

4、验证能否通过VIP地址连接ldap,并查询到该条⽬

# ⾮tls
[root@ldap-ha ~]# ldapsearch -x -LLL -H ldap://ldap-ha.oldxu.net:389 -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=test-master01"
dn: cn=test-master01,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master01
sn: test-master01
# tls(客户端需要有对应的证书,否则会报错)
[root@ldap-ha ~]# ldapsearch -x -LLL -H ldaps://ldap-ha.oldxu.net:636 -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=test-master01"
dn: cn=test-master01,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master01
sn: test-master01

5、模拟主节点故障,验证地址漂移后能否继续使⽤ldap

[root@ldap-master01 ~]# systemctl stop slapd.service

6、测试可⽤性

# ⾮tls
[root@ldap-ha ~]# ldapsearch -x -LLL -H ldap://ldap-ha.oldxu.net:389 -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=test-master01"
dn: cn=test-master01,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master01
sn: test-master01
# tls
[root@ldap-ha ~]# ldapsearch -x -LLL -H ldaps://ldap-ha.oldxu.net:636 -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=test-master01"
dn: cn=test-master01,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master01
sn: test-master01

5.3 Keepalived实现LDAP⾼可⽤

1、两台Master节点都需要安装 Keeplaived

[root@ldap-master01 ~]# yum install keepalived -y
[root@ldap-master02 ~]# yum install keepalived -y

2、Master01配置

[root@ldap-master01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id master01
}
# 定义检测
vrrp_script check_ldap {
 # ⼀条指令或者⼀个脚本⽂件,需要对应命令或脚本的执⾏结果,返回0(成功)或⾮0(失败),keepalived以此为依据判断其监控的服务状态
script "pidof slapd >/dev/null"
interval 5 # 指定脚本执⾏的间隔()
timeout 2 # 指定脚本执⾏的超时时间
weight -150 # 当监控服务不存活则动态降权,确保Backup能接管成功
fall 2 # 判定服务异常的检查次数
rise 3 # 判定服务正常的检查次数
}
vrrp_instance VI_1 {
     state MASTER
     interface eth0
     virtual_router_id 50
     priority 200
     advert_int 1
     authentication {
     auth_type PASS
     auth_pass 1111
 }
 virtual_ipaddress {
 10.0.0.99
 }
  # 调⽤脚本
  track_script {
  check_ldap
  }
}
[root@ldap-master01 ~]# systemctl restart keepalived

3、Master02配置

[root@ldap-master02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id master02
}
vrrp_instance VI_1 {
 state BACKUP
 interface eth0
 virtual_router_id 50
 priority 100
 advert_int 1
 authentication {
 auth_type PASS
 auth_pass 1111
 }
 virtual_ipaddress {
 10.0.0.99
 }
}
[root@ldap-master02 ~]# systemctl restart keepalived

4、添加⼀个新的条⽬

ldapadd -x -D "cn=admin,dc=oldxu,dc=net" -w 123456 <<EOF
dn: cn=test-master02,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master02
sn: test-master02
EOF

5、验证能否通过VIP地址连接ldap,并查询到该条⽬

# ⾮tls
[root@ldap-client01 ~]# ldapsearch -x -LLL -H ldap://ldap-vip.oldxu.net:389 -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=test-master02"
dn: cn=test-master04,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master02
sn: test-master02
# tls
[root@ldap-client01 ~]# ldapsearch -x -LLL -H ldaps://ldap-vip.oldxu.net:636 -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=test-master02"
dn: cn=test-master04,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master02
sn: test-master02

6、模拟主节点故障,验证地址漂移后能否继续使⽤ldap

[root@ldap-master01 ~]# systemctl stop slapd.service

7、继续通过VIP地址,查询刚才创建的⽤户(会发现完全不影响)

[root@ldap-master01 ~]# ldapsearch -x -LLL -H ldap://ldap-vip.oldxu.net:389 -D "cn=admin,dc=oldxu,dc=net" -w 123456 -b "dc=oldxu,dc=net" "cn=test-master02"
dn: cn=test-master02,dc=oldxu,dc=net
objectClass: inetOrgPerson
cn: test-master02
sn: test-master02
posted @ 2025-08-15 14:35  broadviews  阅读(431)  评论(2)    收藏  举报