LDAP 集群监控
LDAP 的集群支持双主 和 主从的模式,目前我们使用的是主从的模式。
监控指标:
- 主从服务存活
- 主从同步监控
监控思路
- zabbix 监控脚本或者服务状态,主从状态
- prometheus 开源 export 获取ldap的工作状态 【第三方客户端软件,监控项目多,但不够精简】
监控的实现
使用监控脚本将主从ldap服务的存活信息 和主从同步的监控信息 传递到zabbix实现主从服务存活和同步监控。
参考: https://github.com/MrCirca/OpenLDAP-Cluster-Zabbix
服务存活监控实现
原理
ldap的服务端口是389端口,正常工作时我们可以使用ldap的命令来远程访问主从两台主机,若访问正常则判断服务正常
## slave实例上面访问
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -s base -b "$BASE_DN" contextCSN 2> /dev/null
echo $?
##若slave实例异常,则返回非0
## slave实例访问master的接口
ldapsearch -Q -LLL -x -H ldap://"$PROVIDER_URI" -Y EXTERNAL -H ldapi:/// -s base -b "$BASE_DN" contextCSN 2> /dev/null
echo $?
##若master实例异常,则返回非0
主从同步监控实现
原理
ldap 在主从复制后会成超一个contextCSN 值,每次更新都会重新计算这个值,当master实例和slave实例的值相同时,则判断主从同步正常
# 获取slave实例的contextCSN值
[root@hn-nameserver02-2-205 ~]# ldapsearch -LLL -x -s base -b "dc=local,dc=cn" contextCSN
dn: dc=local,dc=cn
contextCSN: 20190514075500.340075Z#000000#000#000000
# 获取master实例的contextCSN值
[root@hn-nameserver02-2-205 ~]# ldapsearch -LLL -x -H ldap://172.16.2.204 -s base -b "dc=local,dc=cn" contextCSN
dn: dc=local,dc=cn
contextCSN: 20190514075500.340075Z#000000#000#000000
contextCSN: 20190514075500.340075Z#000000#000#000000
监控脚本信息:
状态检查脚本
[root@hn-nameserver02-2-205 ~]# cat /etc/zabbix/external_scripts/ldap_check_status.sh
#!/bin/bash
BASE_DN=$(ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config 2> /dev/null | grep "olcSuffix:" | cut -d " " -f 2)
PROVIDER_URI=$1
LDAP_CSN_CONSUMER_COMMAND=$(ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -s base -b "$BASE_DN" contextCSN 2> /dev/null)
LDAP_CSN_CONSUMER_RC=$?
LDAP_CSN_PROVIDER_COMMAND=$(ldapsearch -LLL -x -H ldap://"$PROVIDER_URI" -s base -b "$BASE_DN" contextCSN 2> /dev/null)
LDAP_CSN_PROVIDER_RC=$?
PROVIDER_CSN=$(echo -e $LDAP_CSN_PROVIDER_COMMAND | grep contextCSN | cut -d " " -f 2)
CONSUMER_CSN=$(echo -e $LDAP_CSN_CONSUMER_COMMAND | grep contextCSN | cut -d " " -f 2)
if [[ "$LDAP_CSN_CONSUMER_RC" != "0" ]] && [[ "$LDAP_CSN_PROVIDER_RC" == "0" ]]; then
echo "1"
elif [[ "$LDAP_CSN_PROVIDER_RC" != "0" ]] && [[ "$LDAP_CSN_CONSUMER_RC" == "0" ]]; then
echo "2"
elif [[ "$LDAP_CSN_PROVIDER_RC" != "0" ]] && [[ "$LDAP_CSN_CONSUMER_RC" != "0" ]]; then
echo "3"
elif [[ "$PROVIDER_CSN" == "$CONSUMER_CSN" ]]; then
echo "4"
else
echo "100"
fi
zabbix 自定义监控项
[root@hn-nameserver02-2-205 ~]# tail -n1 /etc/zabbix/zabbix_agentd.conf
UserParameter=ldap.clusterstatus[*],/etc/zabbix/external_scripts/ldap_check_status.sh $1
监控说明
- 在slave节点执行监控,监控项里面执行master的监控ip
- 当状态检测脚本返回1,则说明slave实例不可用
- 当状态检测脚本返回2,则说明master实例不可用
- 当状态检测脚本返回3,则说明主从不同步
PS : 建议导入zabbix模板,修改master实例的值