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

浙公网安备 33010602011771号