zabbix原生高可用集群应用实战
一、zabbix原生高可用的原理
Zabbix原生高可用(High Availability)解决方案由多个zabbix_server实例或节点组成。每个节点独立配置,但数据库是使用同一个实例。在Zabbix高可用模式下,多台Zabbix server作为集群中的节点运行。 当集群中的一个Zabbix server处于激活(active )状态时,其他服务器处于备用(standy)状态,随时准备在必要时接管。集群中一次只能有一个节点处于活动状态(工作)。
| 序号 | zabbix原生高可用集群原理说明 |
| 1 | 在zabbix原生高可用的基本架构示意图中,zbx-node1是活动节点,zbx-node是备用节点;两个节点之间每5秒发送一次心跳到zabbix数据库,若一个节点停止发送其心跳信号,则另一个节点将会接管服务。 |
| 2 | zabbix节点间的心跳监控细节是: 《1》通过多个zabbix-server不断向数据库更新自己的时间戳来实现的,主节点和备节点每5秒去数据库更新一次自己的时间戳。 《2》首先,每个备用节点会监控主节点的最后一次访问。如果主节点的最后一次访问时间超过了“故障转移延迟”秒,备用节点将自己切换为主节点,并将“不可用”状态分配给先前的主节点。 《3》同时,主节点还会监视自己的数据库连接,如果与数据库连接丢失超过“故障转移延迟-5”秒,它就会停止所有处理并切换到备用模式。此外,主节点还会监视备用节点的状态,如果备用节点的最后访问时间超过了“故障转移延迟”秒,就将备用节点分配为“不可用”状态。 |
| 3 | 若配置了zabbix原生高可用(zabbix HA),那么在zabbix agent中也需要配置多个zabbix server节点,如zabbix原生高可用的基本架构示意图:若zbx-node1失效,则zabbix agent会尝试去连接另一个zbx-node2,通过此机制,保证监控数据输出的连续性。 |
| 4 | zabbix原生高可用节点的状态有如下四种: 《1》active——活动状态; 《2》standby——备用状态; 《3》unavailable——不可用状态; 《4》stopped——停止状态。 |
二、构建zabbix原生高可用基本架构集群
2.1、zabbix原生高可用基本架构集群规划
| zabbix原生高可用是【一主多备】模式,最简单的是一主一备,主备角色集群自动进行配置生成 | ||||
| 序号 | IP地址 | 主机名称 | 操作系统 | 说明 |
| 1 | 192.168.1.36 | zabbix-server01 | Almalinux9.3 | zabbix-server01节点 1.1-需安装的zabbix组件有: 《1》zabbix-server-mysql; 《2》zabbix-web-mysql; 《3》zabbix-nginx-conf; 《4》zabbix-sql-scripts; 《5》zabbix-selinux-policy; 《6》zabbix-agent2; 《7》zabbix-agent2-plugin-mongodb; 《8》zabbix-agent2-plugin-mssql; 《9》zabbix-agent2-plugin-postgresql; 1.2-安装数据库(如:mysql)【也可单独部署】 《1》mysql8.4.6 |
| 2 | 192.168.1.37 | zabbix-server02 | Almalinux9.3 | zabbix-server02节点 1.1-需安装的zabbix组件有: 《1》zabbix-server-mysql; 《2》zabbix-web-mysql(可选); 《3》zabbix-nginx-conf; 《4》zabbix-sql-scripts(可选); 《5》zabbix-selinux-policy; 《6》zabbix-agent2; 《7》zabbix-agent2-plugin-mongodb; 《8》zabbix-agent2-plugin-mssql; 《9》zabbix-agent2-plugin-postgresql; |
2.2、zabbix-server的安装
2.2.1、zabbix-server01的zabbix server安装
zabbix-server01服务器上可以完全按照这个《使用dnf/yum方式在线安装部署zabbix 7.0 LTS监控平台》的操作安装配置一遍就可以了。
#1-在共享数据库(mysql)中使用root用户登录并授权新节点(zabbix-server01)连接操作
/usr/local/mysql/mysql-8.4.6/bin/mysql -uroot -p
create user zabbix@192.168.1.36 identified by 'zabbix123';
grant all privileges on zabbix.* to zabbix@192.168.1.36;
select user,plugin,host from mysql.user;
flush privileges;
show grants for 'zabbix'@'192.168.1.36';
exit;
#1-zabbix web配置中,编辑配置文件/etc/nginx/conf.d/zabbix.conf,去掉【listen】与
【server_name】前的注释,修改后如下:
vi /etc/nginx/conf.d/zabbix.conf
listen 8091
server_name example.com;#2-修改zabbix-server的基础配置,配置上zabbix数据库的【DBPassword】【DBSocket】及其一些参数优化
vi /etc/zabbix/zabbix_server.conf
#将这个zabbix_server.conf文件里面的内容修改如下:
DBHost=192.168.1.36
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix123
#DBSocket=/tmp/mysql.sock
DBPort=13336
ListenPort=10051
LogFile=/var/log/zabbixsrv/zabbix_server.log
ListenIP=0.0.0.0
StartPollers=5
StartTrappers=10
StartDiscoverers=10
AlertScriptsPath=/usr/lib/zabbix/alertscripts
2.2.2、zabbix-server02的zabbix server安装
注意:zabbix的安装源仓库地址是【https://repo.zabbix.com/zabbix/】。且该节点不用安装数据库,与zabbix-server01共享数据库(mysql)【即:两个节点的zabbix_server.conf配置文件中连接数据库的信息保持一致;若数据库默认只允许本机(localhost)连接,还需要在数据库上授权新节点zabbixserver02允许连接数据库】。
#安装部署zabbix7.0 LTS的实操流程#0-清除系统中原有的EPEL源(因为epel中的zabbix与zabbix提供的源有冲突,会造成无法正常安装zabbix server)
rm -rf /etc/yum.repos.d/epel*
yum clean all
yum repolist enabled | grep epel#1-下载zabbix7.0 LTS的安装源(我们安装好zabbix的源后,其实它是在【/etc/yum.repos.d/】路径下名为【zabbix.repo】)并清空仓库
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
#1.1-清理当前仓库
yum clean all#2-安装Zabbix server,Web前端,agent2
yum install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent2 -y#3-安装zabbix agent2的插件
yum install zabbix-agent2-plugin-mongodb zabbix-agent2-plugin-mssql zabbix-agent2-plugin-postgresql -y#4-在共享数据库(mysql)中使用root用户登录并授权新节点(zabbix-server02)连接操作
/usr/local/mysql/mysql-8.4.6/bin/mysql -uroot -p
create user zabbix@192.168.1.9 identified by 'zabbix123';
grant all privileges on zabbix.* to zabbix@192.168.1.9;
select user,plugin,host from mysql.user;
flush privileges;
show grants for 'zabbix'@'192.168.1.9';
exit;
#1-zabbix web配置中,编辑配置文件/etc/nginx/conf.d/zabbix.conf,去掉【listen】与
【server_name】前的注释,修改后如下:
vi /etc/nginx/conf.d/zabbix.conf
listen 8091
server_name example.com;#2-修改zabbix-server的基础配置,配置上zabbix数据库的【DBPassword】【DBSocket】及其一些参数优化
vi /etc/zabbix/zabbix_server.conf
#将这个zabbix_server.conf文件里面的内容修改如下:
DBHost=192.168.1.36
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix123
#DBSocket=/tmp/mysql.sock
DBPort=13336
ListenPort=10051
LogFile=/var/log/zabbixsrv/zabbix_server.log
ListenIP=0.0.0.0
StartPollers=5
StartTrappers=10
StartDiscoverers=10
AlertScriptsPath=/usr/lib/zabbix/alertscripts
#1-启动Zabbix server、agent2、ngingx、php-fpm进程并设置开机自启
systemctl restart zabbix-server zabbix-agent2 nginx php-fpm
systemctl enable zabbix-server zabbix-agent2 nginx php-fpm#2-查看zabbix-server的日志来确认是否成功启动(日志里面没有错误信息则表示成功)
cd /var/log/zabbix/
cat zabbix_server.logtail -f /var/log/zabbix/zabbix_server.log
注意:若是zabbix-server02上的防火墙开启了,则需要放开8091、10050、10051端口。
#查看系统当前的防火墙是否打开,若打开则需要放开8091、10050、10051端口#1-查看系统当前防火墙的打开状态(若显示【Active: active (running)】则表示防火墙开启中)
systemctl status firewalld#2-【防火墙激活运行中】执行永久放开防火墙的8091、10050、10051端口
firewall-cmd --list-port
firewall-cmd --zone=public --add-port=8091/tcp --permanent
firewall-cmd --zone=public --add-port=10050/tcp --permanent
firewall-cmd --zone=public --add-port=10051/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port







2.3、开启zabbix-server原生高可用
要启用zabbix server的HA功能,只需要在zabbix_server.conf中开启两个参数即可,分别是HANodeName、NodeAddress。这两个配置参数在zabbix_server.conf文件的最后部分。
《1》HANodeName:集群中每个zabbix server节点此名称必须要有且唯一,如果没有指定HANodeName,那么服务器将以standalone模式启动。
《2》NodeAddress: 必须为每个server节点指定,NodeAddress参数(address:port)将被Zabbix前端用来连接到主server节点。NodeAddress必须匹配相应Zabbix server的IP。
配置完成后,重启两个zabbix server服务即可,详细操作如下所示:
查看和修改Linux的主机名称_linux如何查看和修改主机名?
https://coffeemilk.blog.csdn.net/article/details/152363961
#一、开启192.168.1.36服务器的zabbix原生高可用
#1.1-进入192.168.1.36服务器中将该服务器的主机名称修改为【zabbix-server01】
hostnamectl set-hostname zabbix-server01
systemctl restart systemd-hostnamed
exec bashcp /etc/hosts /etc/hosts$(date +'%Y%m%d%H%M%S').bak
vi /etc/hosts
#【/etc/hosts】文件的内容如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.36 zabbix-server01
192.168.1.9 zabbix-server02#1.2-编辑【/ect/zabbix/zabbix_server.conf】文件,启用如下HA参数并保存退出:
vi /ect/zabbix/zabbix_server.conf
DBHost=127.0.0.1
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix123
#DBSocket=/tmp/mysql.sock
DBPort=13336
HANodeName=zabbix-server01
NodeAddress=192.168.1.36:10051#1.3-重启zabbix-server服务(若启动失败可查看日志【 tail -f /var/log/zabbix/zabbix_server.log】)
systemctl restart zabbix-server.service
systemctl status zabbix-server.service
#二、开启192.168.1.9服务器的zabbix原生高可用
#2.1-进入192.168.1.9服务器中将该服务器的主机名称修改为【zabbix-server02】
hostnamectl set-hostname zabbix-server02
systemctl restart systemd-hostnamed
exec bashcp /etc/hosts /etc/hosts$(date +'%Y%m%d%H%M%S').bak
vi /etc/hosts
#【/etc/hosts】文件的内容如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.36 zabbix-server01
192.168.1.9 zabbix-server02#2.2-编辑【/ect/zabbix/zabbix_server.conf】文件,启用如下HA参数并保存退出:
vi /etc/zabbix/zabbix_server.conf
DBHost=127.0.0.1
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix123
#DBSocket=/tmp/mysql.sock
DBPort=13336
HANodeName=zabbix-server02
NodeAddress=192.168.1.9:10051#2.3-重启zabbix-server服务(若启动失败可查看日志【 tail -f /var/log/zabbix/zabbix_server.log】)
systemctl restart zabbix-server.service
systemctl status zabbix-server.service
然后到zabbix-server的web界面上【192.168.1.36:8091】选择左侧导航栏的【报表】-->【系统信息】就可以看到高可用信息了,如下图所示:

到这里恭喜你,zabbx-server的原生高可用基本架构集群已经实现了。
2.4、修改zabbix-agent2的配置适配高可用
由于启用了zabbix的原生高可用功能,因此所有的agent节点、proxy节点的配置文件也都需要进行修改(主要修改agent2中的【Server】【ServerActive】两个参数,这两个参数添加Zabbix HA集群所有节点的IP地址信息。
#1-修改agent2的配置文件【/etc/zabbix/zabbix_agent2.conf】内容
vi /etc/zabbix/zabbix_agent2.conf
#1.1-【被动代理】节点名称必须列在代理的服务器参数中,以逗号分隔内容如下:
Server=192.168.1.36,192.168.1.9#1.2-【主动代理】节点名称必须列在代理的服务器参数中,以分号分隔内容如下:
ServerActive=192.168.1.36;192.168.1.9#2-重启所有zabbix agent2服务
systemctl restart zabbix-agent2.service
systemctl status zabbix-agent2.service
tail -f /var/log/zabbix/zabbix_agent2.log

注意:当我们重启agent2后,需要对zabbix-server的web界面的名为【Zabbix server】的主机修改为【zabbix-server01】的IP及其配置详细操作如下,其还需要添加上【zabbix-server02】主机,如下图所示:






2.5、zabbix集群故障切换
若主节点停止,Zabbix将自动故障转移到另一个节点(要发生故障转移,必须至少有一个节点处于备用状态;故障转移会有多快? 所有节点每5秒更新一次他们的最后访问时间和状态(它被更改)) 因此:
- 如果主节点关闭并成功报告其状态为“stopped”,另一个节点将在5秒内接管。
- 如果主节点关闭/变得不可用,而无法更新其状态,备用节点将等待故障转移延迟 + 5秒来接管。
#手动模拟zabbix集群的故障切换
#(即:单个节点若其当前是active状态,若其故障后激活的节点转为其他节点,则该节点再恢复也不会转为active状态了,除非当前active的节点再次故障)#1-先将zabbix-server01的zabbix-server服务停止(此时该节点在集群的状态是stop)
systemctl stop zabbix-server.service#2-过了几分钟后再次将zabbix-server01的zabbix-server服务启动(此时该节点在集群的状态是standby)
systemctl restart zabbix-server.service
详细操作如下图所示:





三、管理zabbix原生高可用集群
3.1、查看当前zabbix的集群状态
#查看zabbix集群的状态#方法一:在zabbix-server服务上运行命令查看(只能在激活节点运行)
zabbix_server -R ha_status#方法二:直接在zabbix-server的web界面左侧导航栏选择【报表】-->【系统信息】界面可以查看到详情



3.2、设置zabbix集群的故障转移延迟时间
#设置zabbix集群的故障转移延迟时间命令(delay是具体的延时时间,范围为10秒到15分钟之间;支持时间后缀,例如 10s、1m。)
#zabbix_server -R ha_set_failover_delay=delay#示例:如将zabbix集群的故障转移延迟设置为15秒
zabbix_server -R ha_set_failover_delay=15s


3.3、删除和添加zabbix集群的指定节点
#删除zabbix集群的指定节点命令【zabbix_server -R ha_remove_node=节点ID】(节点编号可以通过运行【zabbix_server -R ha_status】命令获取)
#(注意:当节点状态处于【active】【standby】模式时无法删除)
#示例:如删除zabbix集群中的【cmhq25fgx0001d35log1r6ppd】节点
zabbix_server -R ha_remove_node=cmhq25fgx0001d35log1r6ppd

注意,处于active、standby状态的节点不能被删除。因此要从集群中移除一个节点,可以先将此节点的zabbix server服务关闭,关闭后,此节点处于stopped状态,然后在执行上面命令删除。
要将某个节点重新加入zabbix ha集群,只需要重新启动此节点的zabbix server服务即可。
