目录
- 1 LDAP 高可用
- 1.1 介绍
- 1.2 安装
- 1、环境
- 2、全量数据同步
- 3、配置LDAP的HA
- 4、测试
- 总结
1 LDAP 高可用
1.1 介绍
LDAP的主从同步模式有5种:
MirrorMode为ldap ha比较主流的一种模式,本文基于MirrorMode模式进行部署。
如果想要主从LDAP是同一个IP,也就是在高可用的基础上实现负载均衡,可以通过安装Keepalived来实现。
1.2 安装
配置OpelLdap HA要满足如下前提条件:
1、两台服务器之间要保持时钟同步
2、软件包版本一致
3、节点之间域名可以相互解析
4、完全一样的配置及目录树信息(除了server id和provider不同外)
5、两台服务器均已完成LDAP。如果没有安装,可以参考文章:Ubuntu下安装LDAP , openldap的简介、安装
1、环境
主:172.16.1.202 ldap.localdomain.com
从:172.16.1.201 ldapslave.localdomain.com
# 以下在两个服务器上都要执行
# 1、将静态主机名添加到每个服务器以确保它们是可解析的
cat /etc/hosts
172.16.1.202 ldap.localdomain.com
172.16.1.201 ldapslave.localdomain.com
# 2、NTP同步 主从之间的时间同步非常重要
### 有自己的NTP之后使用ntpdate命令即可
### 注意:ntp 和 chrony 不能同时使用
apt install chrony -y
cat > /etc/chrony/chrony.conf << EOF
confdir /etc/chrony/conf.d
pool ntp.aliyun.com iburst
pool ntp.tencent.com iburst
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
maxupdateskew 1.0
rtcsync
makestep 1 -1
leapsectz Asia/Shanghai
bindcmdaddress 127.0.0.1
EOF
systemctl restart chrony.service
systemctl enable chrony.service
##配置时区
timedatectl set-timezone Asia/Shanghai
date
# 3、安装,为了解决安装后出现的关于时区的问题
sudo apt-get install language-pack-en
2、全量数据同步
在配置HA模式之前可以使用此步骤进行全量信息同步。也可以不执行此步骤,配置完HA之后会自动同步
# 在主服务器上执行
## 1、复制配置文件
### 在主服务器上运行以下命令以创建 OpenLDAP 数据库的副本:
slapcat -b cn=config -l openldap-config.ldif
## 或者
slapcat -n 0 -l openldap-config.ldif
### 创建 OpenLDAP 数据的备份
slapcat -n 1 -l openldap-data.ldif
## 或者
slapcat -l openldap-data.ldif
### 将配置文件复制到消费者服务器
scp {openldap-data.ldif,openldap-config.ldif} root@ip:/root/ldap
# 在从服务器上执行
## 2、恢复配置
### 将 LDAP 数据库和数据复制到使用者后,就可以恢复它们了。确保 LDAP 配置目录为空。
rm -rf /etc/ldap/slapd.d/*
rm -rf /var/lib/ldap/*
### 恢复 LDAP 数据库:
cd /root/ldap && sudo slapadd -b cn=config -l openldap-config.ldif -F /etc/ldap/slapd.d/
# 或者
cd /root/ldap && sudo slapadd -n 0 -l openldap-config.ldif -F /etc/ldap/slapd.d/
### 恢复 OpenLDAP 数据:
cd /root/ldap && sudo slapadd -n 1 -l openldap-data.ldif -F /etc/ldap/slapd.d/
### 设置配置文件的正确文件所有权:
sudo chown -R openldap:openldap /etc/ldap/slapd.d/ /var/lib/ldap/
## 重启服务
systemctl restart slapd
3、配置LDAP的HA
### 需要在两个服务器上都执行
# 1、添加syncprov 模块
## 首先确认模块可用
sudo slapcat -n 0 | grep -i modulepath
##### 输出
olcModulePath: /usr/lib/ldap
cat >> mod_syncprov.ldif << EOF
dn:cn=module,cn=config
objectClass:olcModuleList
cn:module
olcModulePath:/usr/lib/ldap/
olcModuleLoad:syncprov.la
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
##### 执行后输出:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=module{0},cn=config"
# 2、配置syncprov复制设置
cat >> syncprov-options.ldif << EOF
dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpNoPresent: TRUE
olcSpCheckpoint: 100 10
olcSpSessionlog: 100
EOF
### 将更改应用到数据库:
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov-options.ldif
###### 输出
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={1}mdb,cn=config"
# 3、启用数据库索引
## 启用entryUID和entryCSN索引以提高数据库性能和扫描速度。
cat >> indexing.ldif <<EOF
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryCSN eq
-
add: olcDbIndex
olcDbIndex: entryUUID eq
EOF
# 将配置应用
ldapadd -Y EXTERNAL -H ldapi:/// -f indexing.ldif
###### 输出
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}mdb,cn=config"
# 4、在使用者上配置 OpenLDAP 复制
### 我们需要配置消费者服务器,通过启用 olcSyncrepl 并使用正确的配置进行设置,以从提供者服务器获取更新。
### 因为是想要两个LDAP互相同步数据,所以需要在两个服务器上都进行设置
###### 这里一定要注意:使用下面的配置文件的时候要把注释删除,否则会报错
### 主:
cat >> enable-syncrepl.ldif << EOF
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 #此处两节点不同
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncrepl:
rid=001
provider=ldap://172.16.1.201:389 #此处为另一个主节点的ip和端口号
binddn="cn=admin,dc=localdomain,dc=com" # 根据自己的用户修改
bindmethod=simple
credentials="admin@123" #此处是该节点的rootpw,此处只能用明文,也就是上面提到的admin 用户的密码
searchbase="dc=localdomain,dc=com" # 根据自己的用户修改
type=refreshAndPersist
timeout=0
network-timeout=0
retry="60 +"
-
add: olcMirrorMode
olcMirrorMode: TRUE
-
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcDbIndex
olcDbIndex: entryCSN eq
EOF
### 更新数据库
ldapadd -Y EXTERNAL -H ldapi:/// -f enable-syncrepl.ldif
###### 输出
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
modifying entry "olcDatabase={1}mdb,cn=config"
### 从:
cat enable-syncrepl.ldif
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 2
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncrepl:
rid=001
provider=ldap://172.16.1.202:389
binddn="cn=admin,dc=localdomain,dc=com"
bindmethod=simple
credentials="admin@123"
searchbase="dc=localdomain,dc=com"
type=refreshAndPersist
timeout=0
network-timeout=0
retry="60 +"
-
add: olcMirrorMode
olcMirrorMode: TRUE
-
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcDbIndex
olcDbIndex: entryCSN eq
### 更新数据库
ldapadd -Y EXTERNAL -H ldapi:/// -f enable-syncrepl.ldif
######## 输出
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
modifying entry "olcDatabase={1}mdb,cn=config"
# 5、重启服务
systemctl restart slapd
4、测试
# 主服务器上创建用户
cat test-user.ldif
######### 内容如下:
dn: uid=usertest,ou=People,dc=localdomain,dc=com
cn: usertest
gidnumber: 10050
homedirectory: /home/usertest
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: shadowAccount
shadowinactive: 7
shadowlastchange: 0
shadowmax: 60
shadowmin: 1
shadowwarning: 7
sn: Doe
uid: usertest
uidnumber: 10050
userpassword: {SSHA}2qq2GDAoJngANJ+oEDgZEDJDsOt4QpEF
dn: cn=usertest,ou=Groups,dc=localdomain,dc=com
cn: usertest
gidnumber: 10050
memberuid: usertest
objectclass: posixGroup
# 添加条目
ldapadd -x -D cn=admin,dc=localdomain,dc=com -W -f test-user.ldif
#### 输出
Enter LDAP Password:
adding new entry "uid=usertest,ou=People,dc=localdomain,dc=com"
adding new entry "cn=usertest,ou=Groups,dc=localdomain,dc=com"
# 主服务器上查看
ldapsearch -LLL -x -D 'cn=admin,dc=localdomain,dc=com' -W -b 'dc=localdomain,dc=com'
Enter LDAP Password:
dn: cn=usertest,ou=Groups,dc=localdomain,dc=com
cn: usertest
gidNumber: 10050
memberUid: usertest
objectClass: posixGroup
dn: uid=usertest,ou=People,dc=localdomain,dc=com
cn: usertest
gidNumber: 10050
homeDirectory: /home/usertest
loginShell: /bin/bash
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
shadowInactive: 7
shadowLastChange: 0
shadowMax: 60
shadowMin: 1
shadowWarning: 7
sn: Doe
uid: usertest
uidNumber: 10050
userPassword:: e1NTSEF9MnFxMkdEQW9KbmdBTkorb0VEZ1pFREpEc090NFFwRUY=
### 从服务器上查看
ldapsearch -LLL -x -D 'cn=admin,dc=localdomain,dc=com' -W -b 'dc=localdomain,dc=com'
Enter LDAP Password:
dn: cn=usertest,ou=Groups,dc=localdomain,dc=com
cn: usertest
gidNumber: 10050
memberUid: usertest
objectClass: posixGroup
dn: uid=usertest,ou=People,dc=localdomain,dc=com
cn: usertest
gidNumber: 10050
homeDirectory: /home/usertest
loginShell: /bin/bash
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
shadowInactive: 7
shadowLastChange: 0
shadowMax: 60
shadowMin: 1
shadowWarning: 7
sn: Doe
uid: usertest
uidNumber: 10050
userPassword:: e1NTSEF9MnFxMkdEQW9KbmdBTkorb0VEZ1pFREpEc090NFFwRUY=
### 另一个服务器上创建,重复上述操作
总结
关于 LDAP HA有以下需要注意的:
- 本篇文章主要通过 MirrorMode 来实现的 HA,使用该方式配置的高可用模式,主从服务器可以实现用户等信息同步。
- 也可以通过keepalived来实现 LDAP HA,这种方式和Nginx的高可用方式类似,优点是实现了负载均衡,主从都可以通过同一个VIP来访问。但是有个问题是:两个服务器的用户等信息无法自动同步需要另外想办法解决。
- 如果想要实现高可用的同时实现负载均衡,就可以把以上两种方式结合起来使用。此处没有介绍 keepalived来实现 LDAP HA。可以参考 Nginx的高可用。