zabbix集群使用keepalived的高可用方案
1 引言
zabbix监控从理论上来说,为了避免单点故障是需要配置高可用的。架构如下:
架构说明:
1、主备机通过inotify+rsync实现zabbix server端配置文件同步;2、通过mysql主主复制实现数据同步;
3、同一时刻只有一台服务器能对外提供zabbix服务,keepalived用来监控Zabbix Server进程和MySQL进程,以在主机进程崩溃的情况下切换到备机;
4、web端登陆虚ip访问,被监控主机通过配置虚拟ip来完成监控。
2 基础环境安装
1.安装准备
操作系统为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.zabbix安装
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’;
一共有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
[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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
单击 ‘ Finish ’ 跳转:
配置完成,登陆web主页:
初始用户名密码为’Admin/zabbix’
node3完成zabbix安装,node4按同样步骤安装即可。
3.安装expect
expect用来远程登录主机并发送执行命令。
主备机安装expect工具
[root@node3 keepalived]# yum -y install expect
[root@node4 keepalived]# yum -y install expect
4.Keepalived安装
4.1.keepalived 安装
分别在主备机执行如下操作:
[root@node3 ~]# yum -y install keepalived
4.2.keepalived 配置
注意主备中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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
该脚本为判断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
1
2
3
4
5
6
7
8
9
该脚本作用为当主备发生切换或者回切时始终保持有虚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
1
2
3
4
5
6
7
8
9
10
11
12
13
该脚本作用为当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.mysql数据库同步
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
分别重启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:
node4:
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
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
Slave_IO_Running: YES和Slave_SQL_Running状态都为 ‘ Yes ’ ,复制状态正常。
主主复制配置完成。
2.文件同步
由于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
注意pwd文件的权限为600
[root@node3 ~]# more /etc/rsyncd.conf
uid=root
gid=root
max connections=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
node4配置如下:
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. 参数说明
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 Z a b b i x P a t h r o o t @ ZabbixPath root@ZabbixPathroot@Server::zabbix --password-file=/etc/rsyncd.pwd2
elif [[ $line =~ $WebPath2 ]];then
rsync -vzrtopg --progress --delete W e b P a t h 2 r o o t @ WebPath2 root@WebPath2root@Server::web2 --password-file=/etc/rsyncd.pwd2
elif [[ $line =~ $WebPath ]];then
rsync -vzrtopg --progress --delete W e b P a t h r o o t @ WebPath root@WebPathroot@Server::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.1. 文件同步测试
主机上执行新建目录操作:
[root@node3 ~]# cd /etc/httpd/conf && mkdir dropme1 && cd /etc/httpd/conf.d/ && mkdir dropme2 && cd /etc/zabbix/ && mkdir dropme3
查看备机对应文件:
发现自动生成了dropme1、dropme2、dropme3
在备机上删除新建的drop文件,在主机上查找相应文件,发现文件被删除:
[root@node4 /]# find /* -name dropme* |xargs rm -rf {}
[root@node3 ~]# find /* -name dropme*
文件同步测试成功
1.2. 数据库同步测试
登陆主机web控制台,新增主机,查看备机是否同步。
查看备机是否同步:
同样的如果在备机上删除监控主机的话主机也会对应的自动删除。
数据同步测试完成。
2.高可用测试
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. 客户端配置
2.2.mysql 异常测试
停止主机mysql服务,模拟异常
[root@node3 ~]# systemctl stop mysqld
[root@node3 keepalived]# ps -C mysqld --no-header | wc -l
查看主机日志/var/log/message:
发现发生切换,检查zabbix进程:
[root@node3 keepalived]# ps -C zabbix_server --no-header | wc -l
发现主机zabbix进程被kill,查看备机状态:
虚ip已经漂移至备机,并且启动了zabbix服务,web访问:
访问正常.
回切测试:
重拉主机的zabbix和mysql进程,查看是否回切
发现虚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服务:
[root@node3 keepalived]# systemctl start zabbix-server
查看主机日志:
发现完成回切, zabbix服务高可用测试完成