zabbix监控脑裂
脑裂简介
脑裂(Split Brain)是指在分布式系统中,由于网络故障或其他原因导致系统节点之间失去通信,导致节点之间无法协调工作,出现分裂的情况。这种情况下,系统无法保证一致性和可靠性,可能会导致数据冲突、数据丢失或系统崩溃等问题。
脑裂问题通常发生在具有冗余节点的高可用系统中,例如集群、HA(高可用性)系统或分布式数据库系统。当节点之间失去联系时,每个节点可能会认为自己是唯一的正常节点,继续独立地执行任务,这就导致了数据不一致和冲突。
脑裂产生原因
- 网络故障:网络是分布式系统节点之间通信的基础,当网络出现故障时,节点之间无法正常通信,导致脑裂问题的发生。网络故障可能包括网络断开、网络延迟、网络拥塞等情况。
- 节点故障:分布式系统中的节点可能由于硬件故障、软件故障或其他原因而发生故障,导致节点无法正常工作或无法与其他节点通信。这也会导致脑裂问题的发生。
- 节点间消息丢失:在分布式系统中,节点之间通过消息传递进行通信和协调工作。如果由于网络故障或其他原因导致节点之间的消息丢失,就会导致节点无法及时获得其他节点的状态信息,从而产生脑裂问题。
- 配置错误:在配置分布式系统时,如果配置错误或不一致,可能会导致节点之间无法正常通信或无法达成共识,从而导致脑裂问题的发生。
脑裂解决方案
- 心跳机制:在节点之间建立心跳连接,定期发送心跳信号以检测节点的可用性。如果某个节点长时间未收到其他节点的心跳信号,就可以认为发生了脑裂,并采取相应的处理措施。
- 多数投票机制:在多节点系统中,通过多数投票的方式来决定哪个节点是正常节点。只有当大多数节点都认为某个节点是正常的,才能继续执行任务。这样可以避免脑裂问题的发生。
- 集群管理软件:使用专门的集群管理软件,如Keepalived、Pacemaker等,来监控和管理集群节点的状态。这些软件可以通过心跳检测、资源管理和故障恢复等机制,自动处理脑裂问题。
环境准备:
主机名 | ip地址 | 环境说明 |
---|---|---|
controller | 192.168.200.10 | zabbix_server |
h2(备服务器) | 192.168.200.20 | keepalived,haproxy,zabbix_agent |
h1(主服务器) | 192.168.200.40 | keepalived,haproxy |
主备服务器的VIP为:192.168.200.250
zabbix部署
zabbix服务端的部署请参考:zabbix监控部署-优快云博客
zabbix客户端的部署请参考:zabbix监控配置流程-优快云博客
zabbix自定义监控请参考:zabbix自定义监控-优快云博客
zabbix监控keepalived
编写自定义监控脚本
[root@h2 ~]# vim /scripts/keep.sh
[root@h2 ~]# cat /scripts/keep.sh
#!/bin/bash
if [ `ip a show ens33 |grep 192.168.200.250|wc -l` -ne 0 ];then
echo "0"
else
echo "1"
fi
[root@h2 ~]#
[root@h2 ~]# chmod +x /scripts/keep.sh
[root@h2 ~]#
[root@h2 ~]# ll /scripts/
total 8
-rwxr-xr-x. 1 root root 107 Oct 16 00:28 keep.sh
-rwxr-xr-x. 1 root root 440 Oct 15 20:29 notify.sh
[root@h2 ~]#
修改zabbix客户端配置文件,重启服务
[root@h2 ~]# vi /usr/local/etc/zabbix_agentd.conf
...
### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined parameters.
# Format: UserParameter=<key>,<shell command>
# See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
UserParameter=keepalived,/bin/bash /scripts/keep.sh
...
[root@h2 ~]# systemctl restart zabbix_agentd
先将主服务器上的haproxy服务停掉了,让备服务器把VIP抢过来以便后面测试用
[root@h2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:18:11:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.200.20/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.200.250/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe18:118c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@h2 ~]#
在zabbix_server服务器上测试,有结果说明脚本可以正常使用
[root@controller ~]# zabbix_get -s 192.168.200.20 -k keepalived
0
[root@controller ~]#
访问zabbix网页
由于本人之前添加过主机,在原有的基础上修改一下就行,如果没有主机需要先添加主机再做后面的操作
添加keepalived监控项
监控项添加成功
添加keepalived触发器
添加触发内容,选择报警等级
自定义触发规则,当测试结果等于1时触发报警
点击Add
触发器添加成功
测试
将主服务器上的haproxy服务开启,手动触发报警
[root@h1 ~]# systemctl start haproxy
[root@h1 ~]#
[root@h1 ~]# systemctl start keepalived
[root@h1 ~]#
[root@h1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:d7:d0:09 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.40/24 brd 192.168.200.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.200.250/32 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::476a:4ab2:8e04:8416/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@h1 ~]#
当主服务器开启haproxy服务后,备服务器的VIP已经被主服务器抢了回去,报警就会触发
[root@h2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:18:11:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.200.20/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe18:118c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@h2 ~]#
报警已触发