1 引言

目前刚刚接触zabbix监控,不知道对于生产环境是否需要将server配置成高可用架构。但是理论上来说,为了避免单点故障还是需要配置高可用的。因而借用大佬的文章搭建一次试试,将遇到的问题记录成本篇笔记。

  • 架构如下:

说明:
主备机通过inotify+rsync实现文件同步,通过mysql主主复制实现数据同步,同一时刻只有一台服务器能对外提供zabbix服务,keepalived用来监控Zabbix Server进程和MySQL进程,以在主机进程崩溃的情况下切换到备机,web端登陆虚ip访问,被监控主机通过配置虚ip来完成监控。

2 基础环境安装


操作系统为CentOS 7.5.1804;
zabbix为zabbix-server-mysql-3.4.15-1.el7.x86_64;
mysql为mysql-community-server-5.7.24-1.el7.x86_64;
inotify为inotify-tools-3.14-8.el7.x86_64;
rsync为rsync-3.1.2-4.el7.x86_64;
expect为expect-5.45-14.el7_1.x86_64;
keepalived为keepalived-1.3.5-6.el7.x86_64;

  • 注意事项

1)主机为node3,ip为172.21.74.231;备机为node4,ip为172.21.74.223。
2)测试时需要保证DNS解析正常——可以在各个节点写好hosts文件
3)在exp.sh中的password是node3/node4操作系统的root密码
4)该架构的稳定性和性能还需要进一步测试。稳定性测试关注MySql的数据同步问题。


  • 2.1. 安装源码库配置部署包

这个部署包包含了yum配置文件:
[root@node3 ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

  • 2.2. 安装 Zabbix-server 部署包

[root@node3 ~]# yum -y install zabbix-server-mysql zabbix-web-mysql

  • 2.3. 安装 MySQL 数据库
    2.3.1 下载并安装 MySQL 官方的 Yum Repository

[root@node3 ~]# rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

2.3.2 查看当前可用的 Mysql 安装源

[root@node3 ~]# yum repolist enabled | grep “mysql.-community.
mysql-connectors-community/x86_64 MySQL Connectors Community 74
mysql-tools-community/x86_64 MySQL Tools Community 74
mysql57-community/x86_64 MySQL 5.7 Community Server 307

2.3.3 安装 MySQL 数据库

[root@node3 ~]# yum -y install mysql-community-server

2.3.4 启动 mysql 服务并设置开机启动

[root@node3 ~]# systemctl start mysqld.service
[root@node3 ~]# systemctl enable mysqld.service

2.3.5 登陆 mysql

安装好后,会在my.cnf文件中自动生成一个密码
[root@node3 cache]# cat /var/log/mysqld.log | grep password
2018-12-21T02:20:00.716114Z 1 [Note] A temporary password is generated for root@localhost: LivE-h8YEq9e
[root@node3 ~]# mysql -uroot -p
输入密码 “ )> LivE-h8YEq9e ”

2.3.6 修改密码规则(默认密码规则太复杂不容易记忆)

mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.01 sec)
mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)

2.3.7 重置密码(登录数据库后需首先重置密码才能进行后续操作)

mysql> alter user ‘root’@‘localhost’ identified by ‘Root$1036’;
Query OK, 0 rows affected, 1 warning (0.00 sec)

2.3.8 创建数据库和 zabbix 用户并授权

mysql> create database zabbix character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by ‘zabbix’;
Query OK, 0 rows affected, 1 warning (0.00 sec)

2.3.9 导入初始架构( Schema )和数据

#cd /usr/share/doc/zabbix-server-mysql-3.4.15/
#zcat create.sql.gz | mysql -uzabbix -pzabbix -D zabbix
mysql: [Warning] Using a password on the command line interface can be insecure.
执行过程中会有一个关于密码的告警,忽略。
查看执行结果:
mysql> select count(*) tables,table_schema from information_schema.tables where table_schema = ‘zabbix’;

zabbix如何实现高可用 zabbix高可用架构_mysql


一共有140张表

  • 2.4. 启动 Zabbix Server 进程
    2.4.1 在 zabbix_server.conf 中编辑数据库配置

修改SourceIP
[root@node3 zabbix]# sed -i ‘s/^ *# SourceIP=./SourceIP=172.21.74.234/g’ /etc/zabbix/zabbix_server.conf
注释DBHost:
[root@node3 zabbix]# sed -i ‘s/^ *# DBHost=./DBHost=localhost/g’ /etc/zabbix/zabbix_server.conf
修改zabbix密码:
[root@node3 zabbix]# sed -i ‘s/^ *# DBPassword=./DBPassword=zabbix/g’ /etc/zabbix/zabbix_server.conf

2.4.2 修改 zabbix 安装目录属主和权限

[root@node3 zabbix]# chown -R zabbix:zabbix /etc/zabbix/
[root@node3 zabbix]# chmod -R 755 /etc/zabbix/

2.4.3 启动 zabbix-server 服务,并设置开机自启

[root@node3 ~]# systemctl restart zabbix-server
[root@node3 ~]# systemctl enable zabbix-server
注意为了防止开机启动时主备都存在 zabbix 服务,要阻止备端的 zabbix 开机启动:
[root@node4 ~]# systemctl disable zabbix-server

  • 2.5. 编辑 Zabbix 前端的 PHP 配置
    2.5.1 设置时区为 Asia/Shanghai :

[root@node3 ~]# sed -i.bak ‘s/^ *# *php_value date.timezone Europe/Riga/php_value date.timezone Asia/Shanghai/g’ /etc/httpd/conf.d/zabbix.conf

2.5.2 启动 apache 服务,并设置开机自启

[root@node3 conf.d]# systemctl restart httpd
[root@node3 conf.d]# systemctl enable httpd

  • 2.6. 登陆 zabbix
访问地址: http://localhost/zabbix

zabbix如何实现高可用 zabbix高可用架构_php_02


下一步:


zabbix如何实现高可用 zabbix高可用架构_MySQL_03


下一步:


zabbix如何实现高可用 zabbix高可用架构_mysql_04


输入密码 “ zabbix ” ,下一步:


zabbix如何实现高可用 zabbix高可用架构_php_05


name填写为 ‘ node3 ’ ,host和port默认,下一步:


zabbix如何实现高可用 zabbix高可用架构_php_06


信息汇总确认,下一步:


zabbix如何实现高可用 zabbix高可用架构_MySQL_07


下载配置文件并另存为 ‘ /etc/zabbix/web/zabbix.conf.php ’ ,注意属主为zabbix:zabbix,权限为755:


[root@node3 ~]# cd /etc/zabbix/web/


[root@node3 web]# ll


total 8


-rwxr-xr-x 1 zabbix zabbix 1036 Nov 12 18:50 maintenance.inc.php


-rwxr-xr-x 1 zabbix zabbix 420 Dec 21 11:01 zabbix.conf.php

[root@node3 web]# more zabbix.conf.php

<?php
// Zabbix GUI configuration file.
global $DB;
$DB['TYPE']     = 'MYSQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER']     = 'zabbix';
$DB['PASSWORD'] = 'zabbix';
// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA'] = '';
$ZBX_SERVER      = 'localhost';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'node3';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;

单击 ‘ Finish ’ 跳转:

zabbix如何实现高可用 zabbix高可用架构_zabbix如何实现高可用_08


配置完成,登陆web主页:

zabbix如何实现高可用 zabbix高可用架构_zabbix-server高可用_09

初始用户名密码为’Admin/zabbix’
node3完成zabbix安装,node4按同样步骤安装即可。


expect用来远程登录主机并发送执行命令。
主备机安装expect工具
[root@node3 keepalived]# yum -y install expect
[root@node4 keepalived]# yum -y install expect


  • 4.1.keepalived 安装

分别在主备机执行如下操作:
[root@node3 ~]# yum -y install keepalived

  • 4.2.keepalived 配置

主机配置如下:
[root@node3 ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs-nginx01 #router_id 机器标识,通常为 hostname ,但不一定非得是 hostname 。故障发生时,邮件通知会用到。
}
vrrp_script chk_zabbix {
script “/etc/keepalived/check.sh zabbix_server”
interval 2
weight 30
fall 2 # 尝试两次都成功才成功
rise 2 # 尝试两次都失败才失败
}
vrrp_script chk_mysql {
script “/etc/keepalived/check.sh mysqld”
interval 2
weight 20
fall 2 # 尝试两次都成功才成功
rise 2 # 尝试两次都失败才失败
}
vrrp_instance VI_1 { #vrrp 实例定义部分
state MASTER # 设置 lvs 的状态, MASTER 和 BACKUP 两种,必须大写
interface ens33 # 设置对外服务的接口
virtual_router_id 100 # 设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示
priority 100 # 定义优先级,数字越大优先级越高,在一个 vrrp——instance 下, master 的优先级必须大于 backup
advert_int 1 # 设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒
authentication { # 设置验证类型和密码
auth_type PASS # 主要有 PASS 和 AH 两种
auth_pass 1111 # 验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
}
virtual_ipaddress { # 设置虚拟 ip 地址,可以设置多个,每行一个
172.21.74.234
}
track_script {
chk_zabbix
}
track_script {
chk_mysql
}
notify_master “/etc/keepalived/zabbix.sh” # 指定当切换到 master 时,执行的脚本
notify_backup “systemctl stop zabbix-server” # 指定当切换到 backup 时,执行的脚本
}

备机配置如下:
[root@node4 ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs-nginx01 #router_id 机器标识,通常为 hostname ,但不一定非得是 hostname 。故障发生时,邮件通知会用到。
}
vrrp_script chk_zabbix {
script “/etc/keepalived/check.sh zabbix_server”
interval 2
weight 5
fall 2 # 尝试两次都成功才成功
rise 2 # 尝试两次都失败才失败
}
vrrp_script chk_mysql {
script “/etc/keepalived/check.sh mysqld”
interval 2
weight 45
fall 2 # 尝试两次都成功才成功
rise 2 # 尝试两次都失败才失败
}
vrrp_instance VI_1 { #vrrp 实例定义部分
state BACKUP # 设置 lvs 的状态, MASTER 和 BACKUP 两种,必须大写
interface ens33 # 设置对外服务的接口
virtual_router_id 100 # 设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示
priority 90 # 定义优先级,数字越大优先级越高,在一个 vrrp——instance 下, master 的优先级必须大于 backup
advert_int 1 # 设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒
authentication { # 设置验证类型和密码
auth_type PASS # 主要有 PASS 和 AH 两种
auth_pass 1111 # 验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同
}
virtual_ipaddress { # 设置虚拟 ip 地址,可以设置多个,每行一个
172.21.74.234
}
track_script {
chk_zabbix
}
track_script {
chk_mysql
}
notify_master “/etc/keepalived/zabbix.sh” # 指定当切换到 master 时,执行的脚本
notify_backup “systemctl stop zabbix-server” # 指定当切换到 backup 时,执行的脚本
}

注意主备中chk_zabbix和chk_mysql的weight值。该设置目的是保证主机的zabbix或者mysql服务异常时keepalived能正常发生切换,并且当主机的zabbix和mysql服务重新正常启动时keepalived能够回切。

vrrp_script中的脚本(主备机相同):

[root@node3 keepalived]# more check.sh
#! /bin/bash
zabbix_server=`ps -C zabbix_server --no-header | wc -l`
mysqld=`ps -C mysqld --no-header | wc -l`
case $1 in
    zabbix_server)
        if [ $zabbix_server -gt 0 ];then
            exit 0
        else
            exit 1
        fi
    ;;
    mysqld)
        if [ $mysqld -gt 0 ];then
            exit 0
        else
            exit 1
        fi
    ;;
esac

该脚本为判断zabbix和mysql服务的状态。

notify_master和notify_backup执行的脚本(主备机除了ip不同外,其他相同):

[root@node3 keepalived]# more zabbix.sh
#! /bin/bash
systemctl start zabbix-server
/etc/keepalived/exp.sh 172.21.74.223

[root@node4 keepalived]# more zabbix.sh
#! /bin/bash
systemctl start zabbix-server
/etc/keepalived/exp.sh 172.21.74.231

该脚本作用为当主备发生切换或者回切时始终保持有虚ip的机器有zabbix服务而另一台无zabbix服务,保证对外提供服务的只有一台机器。(若两台服务器都提供zabbix服务则每一次事件都会触发两次告警)

主备机上exp.sh脚本:

[root@node3 web]# more /etc/keepalived/exp.sh
#!/usr/bin/expect -f
set ip [lindex $argv 0 ]
set timeout 10
spawn ssh root@$ip
expect {
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "Root\$1036\r";exp_continue }
}
expect "#*"
send "systemctl stop zabbix-server\r"
send  "exit\r"
expect eof

该脚本作用为当master keepalived崩溃导致主备切换时,notify_backup脚本不会执行,此时造成主备机器同时有zabbix服务。因此当slave切换为master时,拉起zabbix-server服务,同时远程到备机kill掉zabbix进程。

  • 4.3. 主备机分别重启 keepalived 服务并加入启动服务

[root@node3 ~]# systemctl restart keepalived
[root@node3 ~]# systemctl enable keepalived
[root@node4 ~]# systemctl restart keepalived
[root@node4 ~]# systemctl enable keepalived

至此完成zabbix-server、keepalived安装,通过虚拟IP访问 http://172.21.74.234/zabbix/

3 文件及数据同步


  • 1.1. 编辑配置文件 /etc/my.cnf

node3:

[root@node3 ~]# more /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server-id=1                       # 保证每个服务器不一样
log-bin=mysql-bin                 # 开启 bin 日志
auto-increment-increment = 2      # 步进值 auto_imcrement 。一般有 n 台主 MySQL 就填 n
auto-increment-offset = 1         # 起始值。一般填第 n 台主 MySQL 。此时为第一台主 MySQL
binlog_format = mixed             # 设置 binlog 格式为 mixed
sync_binlog=1                     # 事务特性每 1 次事务提交
binlog-do-db=zabbix               # 同步的据库名
binlog-ignore-db=mysql            # 不同步数据库名
binlog-ignore-db=sys
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
replicate-do-db=zabbix            # 需要复制的数据库   
replicate-ignore-db=mysql         # 不需要复制的数据库
replicate-ignore-db=sys
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema

node4:

[root@node4 ~]# more /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
server-id=2                       # 保证每个服务器不一样
log-bin=mysql-bin                 # 开启 bin 日志
auto-increment-increment = 2      # 步进值 auto_imcrement 。一般有 n 台主 MySQL 就填 n
auto-increment-offset = 2         # 起始值。一般填第 n 台主 MySQL 。此时为第一台主 MySQL
binlog_format = mixed             # 设置 binlog 格式为 mixed
sync_binlog=1                     # 事务特性每 1 次事务提交
binlog-do-db=zabbix               # 同步的据库名
binlog-ignore-db=mysql            # 不同步数据库名
binlog-ignore-db=sys
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
replicate-do-db=zabbix            # 需要复制的数据库   
replicate-ignore-db=mysql         # 不需要复制的数据库
replicate-ignore-db=sys
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema

分别重启mysql服务:
[root@node3 ~]# systemctl restart mysqld
[root@node4 ~]# systemctl restart mysqld

  • 1.2. 新建备份用户

node3上新建备机可以登录的MySQL用户 ‘ zabbix223 ’ :
mysql> GRANT REPLICATION SLAVE ON . TO ‘zabbix223’@‘172.21.74.223’ IDENTIFIED BY ‘zabbix223’;
mysql> FLUSH PRIVILEGES;

node4上新建主机可以登录的MySQL用户 ‘ zabbix231 ’ :
mysql> GRANT REPLICATION SLAVE ON . TO ‘zabbix231’@‘172.21.74.231’ IDENTIFIED BY ‘zabbix231’;
mysql> FLUSH PRIVILEGES;

  • 1.3. 查看二进制日志名和位置

mysql> show master status;
node3:

zabbix如何实现高可用 zabbix高可用架构_mysql_10


node4:


zabbix如何实现高可用 zabbix高可用架构_MySQL_11

  • 1.4. 启动同步
    1.4.1 主从同步

构建node3到node4的主从同步
1)以下操作都在node4上执行:
mysql> CHANGE MASTER TO
-> MASTER_HOST=‘172.21.74.231’,
-> MASTER_USER=‘zabbix223’,
-> MASTER_PASSWORD=‘zabbix223’,
-> MASTER_LOG_FILE=‘mysql-bin.000001’,
-> MASTER_LOG_POS=616;
Query OK, 0 rows affected, 2 warnings (0.38 sec)
2)开启复制:
mysql> START SLAVE;
3)查看主从复制是否配置成功:
mysql> SHOW SLAVE STATUS\G

zabbix如何实现高可用 zabbix高可用架构_MySQL_12


Slave_IO_Running: YES和Slave_SQL_Running状态都为 ‘ Yes ’ ,复制状态正常。

1.4.2 主主同步

再做一次node4到node3的主从同步即完成了主主同步
以下操作都在node3上执行:
mysql> CHANGE MASTER TO
-> MASTER_HOST=‘172.21.74.223’,
-> MASTER_USER=‘zabbix231’,
-> MASTER_PASSWORD=‘zabbix231’,
-> MASTER_LOG_FILE=‘mysql-bin.000001’,
-> MASTER_LOG_POS=37438;
Query OK, 0 rows affected, 2 warnings (0.46 sec)
开启复制:
mysql> START SLAVE;
查看主从复制是否配置成功:
mysql> SHOW SLAVE STATUS\G

zabbix如何实现高可用 zabbix高可用架构_mysql_13


Slave_IO_Running: YES和Slave_SQL_Running状态都为 ‘ Yes ’ ,复制状态正常。


主主复制配置完成。


由于zabbix-server两台主机配置文件需实时同步,所以采用inotify工具对同步数据目录信息的监控,结合rsync完成对数据信息的实时同步。

  • 2.1.Rsync 安装
    2.1.1.rsync 安装

node3和node4上执行:
[root@node3 ~]# yum -y install rsync
[root@node4 ~]# yum -y install rsync

2.1.2.rsync 配置
node3配置如下:

[root@node3 ~]# cd /etc && ll|grep rsync

zabbix如何实现高可用 zabbix高可用架构_MySQL_14


注意pwd文件的权限为600


[root@node3 ~]# more /etc/rsyncd.conf


uid=root


gid=root


max cnotallow=100


use chroot=true


log file=/var/log/rsyncd.log


motd file = /etc/rsyncd.motd


transfer logging = true


hosts allow= 172.21.74.223


[zabbix]


path=/etc/zabbix/


exclude = web


comment = etc zabbix


read only = no


list = yes


auth users = root


secrets file=/etc/rsyncd.pwd


[web1]


path=/etc/httpd/conf/


comment = httpd conf


read only = no


list = yes


auth users = root


secrets file=/etc/rsyncd.pwd


[web2]


path=/etc/httpd/conf.d/


comment = httpd conf.d


read only = no


list = yes


auth users = root


secrets file=/etc/rsyncd.pwd


zabbix如何实现高可用 zabbix高可用架构_MySQL_15


node4配置如下:


zabbix如何实现高可用 zabbix高可用架构_mysql_16


zabbix如何实现高可用 zabbix高可用架构_MySQL_17


rsyncd.conf文件与主机相同,只是 ‘ hosts allow= 172.21.74.231 ’


同步的文件为/etc/zabbix/(不包括web)、/etc/httpd/conf/和/etc/httpd/conf.d/,可根据实际情况增减。

2.1.3. 启动 rsync

主备机上同时运行:
[root@node3 ~]# nohup rsync --daemon --config=/etc/rsyncd.conf &
[root@node4 ~]# nohup rsync --daemon --config=/etc/rsyncd.conf &

2.1.4. 参数说明

uid=root # 服务器端传输文件时,要发哪个用户和用户组来执行
gid=root # 服务器端传输文件时,要发哪个用户和用户组来执行
max connections=100 # 客户端最多连接数
use chroot=true # 用 chroot ,在传输文件之前,服务器守护程序在将 chroot 到文件系统中的目录中,这样做的好处是可能保护系统被安装漏洞侵袭的可能。缺点是需要超级用户权限。另外对符号链接文件,将会排除在外。也就是说,你在 rsync 服务器上,如果有符号链接,你在备份服务器上运行客户端的同步数据时,只会把符号链接名同步下来,并不会同步符号链接的内容
log file=/var/log/rsyncd.log #rsync 服务器的日志
motd file=/etc/rsyncd.motd # 定义 motd file 路径, rsyncd.motd 内容是定义服务器信息的,用户登录时会看到这个信息
transfer logging = true # 传输文件日志
hosts allow= 172.21.74.223 # 允许的 ip 地址
[zabbix] # 模块名
path=/etc/zabbix/ # 同步的目录
exclude = web # 同步目录中去除的目录,即 web 不同步
comment = etc zabbix # 注释,注释内容可自己定义,起提示作用
read only = no # 只读选择,如为 yes 则不让客户端上传文件到服务器上
list = yes # 服务器上提供同步数据的目录是否显示
auth users = root # 认证用户是 root
secrets file=/etc/rsyncd.pwd # 密码文件保存路径,注意此文件的密码要与 223 上的 rsyncd.pwd2 文件中密码相同
注意:配置文件里不能有注释信息

2.1.5. 开机自启动

主备机分别执行:
[root@node3 ~]# sed -i ‘KaTeX parse error: Expected 'EOF', got '#' at position 78: … [root@node4 ~]#̲ sed -i 'a rsync --daemon --config=/etc/rsyncd.conf’ /etc/rc.d/rc.local

  • 2.2.inotify
    2.2.1.inotify 安装

主备机同时执行:
添加eprl源:
[root@node3 /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安装inotify:
[root@node3 /]# yum -y install inotify-tools

2.2.2. 编写监控同步脚本

[root@node3 ~]# more /root/scripts/inotify.sh
#!/bin/bash
ZabbixPath=/etc/zabbix/
WebPath=/etc/httpd/conf/
WebPath2=/etc/httpd/conf.d/
Server=172.21.74.223
/usr/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M’ --format ‘%T %w%f%e’ -e close_write,delete,create,attrib,move $WebPath $WebPath2 $ZabbixPath |
while read line
do
if [[ $line =~ $ZabbixPath ]];then
rsync -vzrtopg --progress --delete zabbix如何实现高可用 zabbix高可用架构_php_18Server::zabbix --password-file=/etc/rsyncd.pwd2
elif [[ $line =~ $WebPath2 ]];then
rsync -vzrtopg --progress --delete zabbix如何实现高可用 zabbix高可用架构_zabbix-server高可用_19Server::web2 --password-file=/etc/rsyncd.pwd2
elif [[ $line =~ $WebPath ]];then
rsync -vzrtopg --progress --delete zabbix如何实现高可用 zabbix高可用架构_mysql_20Server::web1 --password-file=/etc/rsyncd.pwd2
else
echo $line >> /var/log/inotify.log
fi
done

该脚本首先是用inotify分别监控 ‘ $WebPath $WebPath2 $ZabbixPath ’ 三个文件的状态,若有变化则分别触发对应的rsync同步。备机配置同主机,只是 ‘ Server ’ 项为231。
注意Path后的路径有 ‘ / ’ 。

2.2.3. 参数说明

-m, –monitor # 始终保持事件监听
-r, –recursive # 递归监控目录数据信息变化
-q, –quiet # 输出信息少(只打印事件信息)
–timefmt # 指定时间输出格式
–format # 打印使用指定的输出类似格式字符串,即实际监控输出内容
-e # 指定监听指定的事件,如果省略,表示所有事件都进行监听
close_write # 文件或目录关闭,在写入模式打开之后关闭的
delete # 文件或目录被删除在监控目录中
create # 文件或目录创建在监控目录中
attrib # 文件或目录属性改变
move # 文件或目录不管移动到或是移出监控目录都触发事件

2.2.4. 主备机分别启动监控同步脚本

[root@node3 ~]# nohup sh /root/scripts/inotify.sh &
[root@node4 ~]# nohup sh /root/scripts/inotify.sh &

4 高可用测试


  • 1.1. 文件同步测试

主机上执行新建目录操作:
[root@node3 ~]# cd /etc/httpd/conf && mkdir dropme1 && cd /etc/httpd/conf.d/ && mkdir dropme2 && cd /etc/zabbix/ && mkdir dropme3
查看备机对应文件:

zabbix如何实现高可用 zabbix高可用架构_mysql_21


zabbix如何实现高可用 zabbix高可用架构_zabbix如何实现高可用_22

发现自动生成了dropme1、dropme2、dropme3
在备机上删除新建的drop文件,在主机上查找相应文件,发现文件被删除:
[root@node4 /]# find /* -name dropme* |xargs rm -rf {}
[root@node3 ~]# find /* -name dropme*
文件同步测试成功

  • 1.2. 数据库同步测试

登陆主机web控制台,新增主机,查看备机是否同步。

zabbix如何实现高可用 zabbix高可用架构_php_23


查看备机是否同步:


zabbix如何实现高可用 zabbix高可用架构_mysql_24


同样的如果在备机上删除监控主机的话主机也会对应的自动删除。


数据同步测试完成。


  • 2.1. 测试前配置
    2.1.1. 服务端配置

修改服务端配置,将主备机 ‘ SourceIP ’ 项修改为虚ip:
[root@node3 ~]# sed -i ‘s/^ *# SourceIP=./SourceIP=172.21.74.234/g’ /etc/zabbix/zabbix_server.conf
[root@node4 ~]# sed -i ‘s/^ *# SourceIP=./SourceIP=172.21.74.234/g’ /etc/zabbix/zabbix_server.conf
该操作主备机都执行

2.1.2. 客户端配置

修改客户端配置,将 ‘ Server ’ 项也修改为虚ip:
[root@zabbix-agent ~]# sed -i ‘s/^ *# Server=./Server=172.21.74.234/g’ /etc/zabbix/zabbix_agentd.conf
zabbix-server端启用SourceIP,被监控的主机Server参数也配置为虚ip而不是实际地址。
高可用测试
正常状态下主机有zabbix、mysql、inotify、rsync、keepalived五个服务,备机只有mysql、inotify、rsync、keepalived四个服务,这也是高可用的初始状态。

  • 2.2.mysql 异常测试

停止主机mysql服务,模拟异常
[root@node3 ~]# systemctl stop mysqld
[root@node3 keepalived]# ps -C mysqld --no-header | wc -l
查看主机日志/var/log/message:

zabbix如何实现高可用 zabbix高可用架构_php_25


发现发生切换,检查zabbix进程:


[root@node3 keepalived]# ps -C zabbix_server --no-header | wc -l


发现主机zabbix进程被kill,查看备机状态:


zabbix如何实现高可用 zabbix高可用架构_zabbix-server高可用_26


虚ip已经漂移至备机,并且启动了zabbix服务,web访问:


zabbix如何实现高可用 zabbix高可用架构_zabbix如何实现高可用_27


访问正常.


回切测试:


重拉主机的zabbix和mysql进程,查看是否回切


zabbix如何实现高可用 zabbix高可用架构_MySQL_28


zabbix如何实现高可用 zabbix高可用架构_php_29


发现虚ip回切且zabbix和mysql服务正常,查看备机zabbix状态:


[root@node4 ~]# ps -C zabbix_server --no-header | wc -l


此时备机zabbix服务挂起。mysql高可用测试完成

  • 2.3.zabbix 异常测试

停止主机zabbix服务,模拟异常
[root@node3 keepalived]# systemctl stop zabbix-server
[root@node3 keepalived]# ps -C zabbix_server --no-header | wc -l
查看主机日志/var/log/message:

zabbix如何实现高可用 zabbix高可用架构_mysql_30


发现发生切换,查看备机状态和zabbix进程:


zabbix如何实现高可用 zabbix高可用架构_mysql_31


主备切换完成,回切:


启动主机zabbix服务:


[root@node3 keepalived]# systemctl start zabbix-server


查看主机日志:


zabbix如何实现高可用 zabbix高可用架构_zabbix-server高可用_32


发现完成回切, zabbix服务高可用测试完成。