思路:主备机通过inotify+rsync实现文件同步,通过mysql主主复制实现数据同步,同一时刻只有一台服务器能对外提供zabbix服务,web端登陆虚ip访问,被监控主机通过配置虚ip来完成监控。
配置:
主机 |
ip |
操作系统 |
zabbix版本 |
mysql版本 |
inotify版本 |
rsync版本 |
备注 |
zabbix-server01 | 172.27.9.80 |
Centos7.3.1611 | zabbix_server (Zabbix) 3.4.10 |
5.7.22 | 3.14 | 3.1.2 | 关闭防火墙和selinux |
zabbix-server02 | 172.27.9.81 |
Centos7.3.1611 | zabbix_server (Zabbix) 3.4.10 |
5.7.22 | 3.14 | 3.1.2 | 关闭防火墙和selinux |
Part 1 基础环境安装
zabbix安装
1.安装源码库配置部署包
这个部署包包含了yum配置文件:
[root@zabbix-server01 ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
2.安装Zabbix-server部署包
[root@zabbix-server01 ~]# yum -y install zabbix-server-mysql zabbix-web-mysql
3.安装初始化数据库
3.1下载并安装MySQL官方的 Yum Repository
[root@zabbix-server01 ~]# rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
3.2查看当前可用的Mysql安装源
[root@zabbix-server01 ~]# yum repolist enabled | grep "mysql.*-community.*" mysql-connectors-community/x86_64 MySQL Connectors Community 51 mysql-tools-community/x86_64 MySQL Tools Community 63 mysql57-community/x86_64 MySQL 5.7 Community Server 267
3.3安装MySQL数据库
[root@zabbix-server01 ~]# yum -y install mysql-community-server
总下载量:205M,请耐心等待。
安装完成,系统自带的mariadb被覆盖。
3.4启动mysql服务并设置开机启动
[root@zabbix-server01 ~]# systemctl start mysqld.service [root@zabbix-server01 ~]# systemctl enable mysqld.service
3.5登陆mysql
安装好后,会在my.cnf文件中自动生成一个密码
[root@zabbix-server01 ~]# cat /var/log/mysqld.log | grep password 2018-06-20T09:40:53.666115Z 1 [Note] A temporary password is generated for root@localhost: )>b5dXb+sLei [root@zabbix-server01 ~]# mysql -uroot -p
输入密码“)>b5dXb+sLei”
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)
3.7重置密码(登录数据库后需首先重置密码才能进行后续操作)
mysql> set password = password('mysql123'); Query OK, 0 rows affected, 1 warning (0.00 sec)
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 'zabbix123'; Query OK, 0 rows affected, 1 warning (0.00 sec)
3.9导入初始架构(Schema)和数据
[root@zabbix-server01 ~]# cd /usr/share/doc/zabbix-server-mysql-3.4.10/ [root@zabbix-server01 zabbix-server-mysql-3.4.10]# zcat create.sql.gz | mysql -uzabbix -pzabbix123 -D zabbix mysql: [Warning] Using a password on the command line interface can be insecure.
执行过程中会有一个关于密码的告警,忽略。
查看执行结果:
mysql> show tables from zabbix; mysql> select count(*) tables,table_schema from information_schema.tables where table_schema = 'zabbix';
一共有140张表
4.启动Zabbix Server进程
4.1在zabbix_server.conf中编辑数据库配置
解注释DBHost:
[root@zabbix-server01 zabbix]# sed -i 's/^ *# *DBHost=.*/DBHost=localhost/g' /etc/zabbix/zabbix_server.conf
修改zabbix密码:
[root@zabbix-server01 zabbix]# sed -i 's/^ *# *DBPassword=.*/DBPassword=zabbix123/g' /etc/zabbix/zabbix_server.conf
4.2修改zabbix安装目录属主和权限
[root@zabbix-server01 zabbix]# chown -R zabbix:zabbix /etc/zabbix/ [root@zabbix-server01 zabbix]# chmod -R 755 /etc/zabbix/
4.3启动zabbix-server服务,并设置开机自启
[root@zabbix-server01 ~]# systemctl restart zabbix-server [root@zabbix-server01 ~]# systemctl enable zabbix-server
5.编辑Zabbix前端的PHP配置
5.1设置时区为Asia/Shanghai:
[root@zabbix-server01 ~]# sed -i.bak 's/^ *# *php_value date.timezone Europe\/Riga/php_value date.timezone Asia\/Shanghai/g' /etc/httpd/conf.d/zabbix.conf
5.2启动apache服务,并设置开机自启
[root@zabbix-server01 conf.d]# systemctl restart httpd [root@zabbix-server01 conf.d]# systemctl enable httpd
6.登陆zabbix
访问地址:http://localhost/zabbix
下一步:
下一步:
输入密码“zabbix123”,下一步:
name填写为‘myzabbix81’和zabbix-server02的‘myzabbix82’区分,host和port默认,下一步:
信息汇总确认,下一步:
下载配置文件并另存为‘/etc/zabbix/web/zabbix.conf.php’,注意属主为zabbix:zabbix,权限为755:
[root@zabbix-server02 ~]# cd /etc/zabbix/web/ [root@zabbix-server02 web]# ll 总用量 8 -rwxr-xr-x. 1 zabbix zabbix 1036 6月 4 19:40 maintenance.inc.php -rwxr-xr-x 1 zabbix zabbix 427 6月 20 22:38 zabbix.conf.php [root@zabbix-server02 web]# more zabbix.conf.php单击‘Finish’跳转:
配置完成,登陆web主页:
初始用户名密码为'Admin/zabbix'
zabbix-server01完成zabbix安装,zabbix-server02按同样步骤安装即可。
Keepalived安装
1.keepalived安装
分别在主备机执行如下操作:
[root@zabbix-lvs01 ~]# yum -y install keepalived
2.keepalived配置
主机配置如下:
[root@zabbix-server01 ~]# 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.27.9.80 } track_script { chk_zabbix } track_script { chk_mysql } notify_master "/etc/keepalived/zabbix.sh start" #指定当切换到master时,执行的脚本 notify_backup "/etc/keepalived/zabbix.sh stop" #指定当切换到backup时,执行的脚本 }备机配置如下:
[root@zabbix-server02 ~]# 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.27.9.80 } track_script { chk_zabbix } track_script { chk_mysql } notify_master "/etc/keepalived/zabbix.sh start" #指定当切换到master时,执行的脚本 notify_backup "/etc/keepalived/zabbix.sh stop" #指定当切换到backup时,执行的脚本 }注意主备中chk_zabbix和chk_mysql的weight值。该设置目的是保证主机的zabbix或者mysql服务异常时keepalived能正常发生切换,并且当主机的zabbix和mysql服务重新正常启动时keepalived能够回切。具体的切换机制可以查看Keepalived中Master和Backup主备切换机制浅析。
vrrp_script中的脚本(主备机相同):
[root@zabbix-server01 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执行的脚本(主备机相同):
[root@zabbix-server01 keepalived]# more zabbix.sh #!/bin/bash case $1 in start) systemctl start zabbix-server ;; stop) systemctl stop zabbix-server ;; esac该脚本作用为当主备发生切换或者回切时时钟保持有虚ip的机器有zabbix服务而另一台无zabbix服务,保证对外提供服务的只有一台机器。(若两台服务器都提供zabbix服务则每一次事件都会触发两次告警)
3.主备机分别重启keepalived服务并加入启动服务
[root@zabbix-server01 ~]# systemctl restart keepalived [root@zabbix-server01 ~]# systemctl enable keepalived
至此完成zabbix-server、keepalived安装,通过虚拟IP访问:
http://172.27.9.80/zabbix/
Part 2 文件及数据同步
mysql数据库同步
1.编辑配置文件/etc/my.cnf
zabbix-server01:
[root@zabbix-server01 ~]# 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_schemazabbix-server02:
[root@zabbix-server02 ~]# 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@zabbix-server01 ~]# systemctl restart mysqld
2.新建备份用户
zabbix-server01上新建备机可以登录的MySQL用户‘zabbix82’:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'zabbix82'@'172.27.9.82' IDENTIFIED BY 'zabbix82'; mysql> FLUSH PRIVILEGES;zabbix-server02上新建主机可以登录的MySQL用户‘zabbix81’:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'zabbix81'@'172.27.9.81' IDENTIFIED BY 'zabbix81'; mysql> FLUSH PRIVILEGES;
3.查看二进制日志名和位置
mysql> show master status;zabbix-server01:
zabbix-server02:
4.启动同步
4.1主从同步
构建zabbix-server01到zabbix-server02的主从同步
以下操作都在zabbix-server02上执行:
mysql> CHANGE MASTER TO -> MASTER_HOST='172.27.9.81', -> MASTER_USER='zabbix82', -> MASTER_PASSWORD='zabbix82', -> MASTER_LOG_FILE='mysql-bin.000002', -> MASTER_LOG_POS=50334; Query OK, 0 rows affected, 2 warnings (0.38 sec)开启复制:
mysql> START SLAVE;查看主从复制是否配置成功:
mysql> SHOW SLAVE STATUS\GSlave_IO_Running: YES和Slave_SQL_Running状态都为‘Yes’,复制状态正常。
4.2主主同步
再做一次zabbix-server02到zabbix-server01的主从同步即完成了主主同步
以下操作都在zabbix-server01上执行:
mysql> CHANGE MASTER TO -> MASTER_HOST='172.27.9.82', -> MASTER_USER='mysql81', -> MASTER_PASSWORD='mysql81', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=4362658; Query OK, 0 rows affected, 2 warnings (0.46 sec)开启复制:
mysql> START SLAVE;查看主从复制是否配置成功:
mysql> SHOW SLAVE STATUS\GSlave_IO_Running: YES和Slave_SQL_Running状态都为‘Yes’,复制状态正常。
主主复制配置完成。
文件同步
之前公司异地灾备时用rsync做程序的同步,不过由于生产环境不会随意动且变更都是在晚上,程序的同步实时性要求不高,所以采用每天晚上通过定时任务方式进行同步。本文中由于zabbix-server两台主机配置文件需实时同步,所以通过定时任务方式不可行,本文采用inotify工具对同步数据目录信息的监控,结合rsync完成对数据信息的实时同步。
Rsync
1.rsync安装
zabbix-server01和zabbix-server02上执行:
[root@zabbix-server01 ~]# yum -y install rsync
2.rsync配置
zabbix-server01配置如下:
[root@zabbix-server01 ~]# cd /etc && ll|grep rsync
注意pwd文件的权限为600
[root@zabbix-server01 ~]# 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.27.9.82 [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.pwdzabbix-server02配置如下:
rsyncd.conf文件与主机相同,只是‘hosts allow=172.27.9.81’
同步的文件为/etc/zabbix/(不包括web)、/etc/httpd/conf/和/etc/httpd/conf.d/,可根据实际情况增减。
3.启动rsync
主备机上同时运行:
[root@zabbix-server01 ~]# rsync --daemon --config=/etc/rsyncd.conf
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.27.9.82 #允许的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 #密码文件保存路径注意:配置文件里不能有注释信息
5.开机自启动
主备机分别执行:
[root@zabbix-server01 ~]# sed -i '$a rsync --daemon --config=/etc/rsyncd.conf' /etc/rc.d/rc.local
inotify
1.inotify安装
主备机同时执行:
添加eprl源:
[root@zabbix-server01 /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo安装inotify:
[root@zabbix-server01 /]# yum -y install inotify-tools
2.编写监控同步脚本
[root@zabbix-server01 ~]# more /root/scripts/inotify.sh #!/bin/bash ZabbixPath=/etc/zabbix/ WebPath=/etc/httpd/conf/ WebPath2=/etc/httpd/conf.d/ Server=172.27.9.82 /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 $ZabbixPath root@$Server::zabbix --password-file=/etc/rsyncd.pwd2 elif [[ $line =~ $WebPath2 ]];then rsync -vzrtopg --progress --delete $WebPath2 root@$Server::web2 --password-file=/etc/rsyncd.pwd2 elif [[ $line =~ $WebPath ]];then rsync -vzrtopg --progress --delete $WebPath root@$Server::web1 --password-file=/etc/rsyncd.pwd2 else echo $line >> /var/log/inotify.log fi done该脚本首先是用inotify分别监控‘$WebPath $WebPath2 $ZabbixPath’三个文件的状态,若有变化则分别触发对应的rsync同步。备机配置同主机,只是‘Server’项为82。
注意Path后的路径有‘/’。
3.参数说明
-m, –monitor #始终保持事件监听 -r, –recursive #递归监控目录数据信息变化 -q, –quiet #输出信息少(只打印事件信息) –timefmt #指定时间输出格式 –format #打印使用指定的输出类似格式字符串,即实际监控输出内容 -e #指定监听指定的事件,如果省略,表示所有事件都进行监听 close_write #文件或目录关闭,在写入模式打开之后关闭的 delete #文件或目录被删除在监控目录中 create #文件或目录创建在监控目录中 attrib #文件或目录属性改变 move #文件或目录不管移动到或是移出监控目录都触发事件
4.主备机分别启动监控同步脚本
[root@zabbix-server01 ~]# nohup sh /root/scripts/inotify.sh &
Part 3 高可用测试
文件及数据同步测试
1.文件同步测试
主机上执行新建目录操作:
[root@zabbix-server01 ~]# cd /etc/httpd/conf && mkdir dropme1 && cd /etc/httpd/conf.d/ && mkdir dropme2 && cd /etc/zabbix/ && mkdir dropme3查看备机对应文件:
发现自动生成了dropme1、dropme2、dropme3
在备机上删除新建的drop文件,在主机上查找相应文件,发现文件被删除:
[root@zabbix-server02 /]# find /* -name dropme* |xargs rm -rf \{} [root@zabbix-server01 ~]# find /* -name dropme* [root@zabbix-server01 ~]#文件同步测试成功
2.数据库同步测试
登陆主机web控制台,新增主机,查看备机是否同步。
查看备机是否同步:
同样的如果在备机上删除监控主机的话主机也会对应的自动删除。
数据同步测试完成。
高可用测试
测试前配置
1.服务端配置
修改服务端配置,将‘SourceIP’项修改为虚ip:
[root@zabbix-server01 ~]# sed -i 's/^ *# *SourceIP=.*/SourceIP=172.27.9.80/g' /etc/zabbix/zabbix_server.conf该操作主备机都执行
2.客户端配置
修改客户端配置,将‘Server’项也修改为虚ip:
[root@zabbix-agent ~]# sed -i 's/^ *# *Server=.*/Server=172.27.9.80/g' /etc/zabbix/zabbix_agentd.confzabbix-server端启用SourceIP,被监控的主机Server参数也配置为虚ip而不是实际地址81或82。
高可用测试
正常状态下主机有zabbix、mysql、inotify、rsync、keepalived五个服务,备机只有mysql、inotify、rsync、keepalived四个服务,这也是高可用的初始状态。
1.mysql异常测试
停止主机mysql服务,模拟异常
[root@zabbix-server01 ~]# systemctl stop mysqld [root@zabbix-server01 keepalived]# ps -C mysqld --no-header | wc -l 0查看主机日志/var/log/message:
发现发生切换,检查zabbix进程:
[root@zabbix-server01 keepalived]# ps -C zabbix_server --no-header | wc -l 0发现主机zabbix进程被kill,查看备机状态:
虚ip已经漂移至备机,并且启动了zabbix服务,web访问:
访问正常且主机为82.
回切测试:
重拉主机的zabbix和mysql进程,查看是否回切
发现虚ip回切且zabbix和mysql服务正常,查看备机zabbix状态:
[root@zabbix-server02 ~]# ps -C zabbix_server --no-header | wc -l 0此时备机zabbix服务挂起。
mysql高可用测试完成
2.zabbix异常测试
停止主机zabbix服务,模拟异常
[root@zabbix-server01 keepalived]# systemctl stop zabbix-server [root@zabbix-server01 keepalived]# ps -C zabbix_server --no-header | wc -l 0查看主机日志/var/log/message:
发现发生切换,查看备机状态和zabbix进程:
主备切换完成,回切:
启动主机zabbix服务:
[root@zabbix-server01 keepalived]# systemctl start zabbix-server查看主机日志:
发现完成回切,查看web也访问的为81,zabbix服务高可用测试完成。
总结:本文为zabbix高可用搭建提供了一种思路,其它高可用项目也可做参考,如果是B/S架构还可加入lvs和nginx,本文的文件和数据库的同步也可以采用共享存储和nfs的方式,通过数据库和配置文件放在共享目录里来实现高可用。
****************************************************************************************************************************************
本文有个漏洞,特做补充说明。当主的keepalived服务挂掉时,此时主的notify_backup不会执行,故此时主备都有zabbix-server服务,只是不可接受的,现对notify_master脚本做改造,加入expect工具,当切换为master时,拉起zabbix-server服务,同时远程到备机kill掉zabbix进程。改进如下:
安装expect
主备机安装expect工具
[root@zabbix-server01 keepalived]# yum -y install expectkeepalived.conf配置文件
[root@zabbix-server01 keepalived]# more 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.27.9.80 } track_script { chk_zabbix } track_script { chk_mysql } notify_master "/etc/keepalived/zabbix.sh" #指定当切换到master时,执行的脚本 #notify_backup "/etc/keepalived/zabbix.sh stop" #指定当切换到backup时,执行的脚本 }keepalived.conf配置文件和前文比只是注释了notify_backup
zabbix.sh脚本
[root@zabbix-server01 keepalived]# more zabbix.sh #!/bin/bash systemctl start zabbix-server /etc/keepalived/exp.sh 172.27.9.82 monitor备机ip为172.27.9.81,monitor为root密码
exp.sh脚本
exp.sh为新增脚本
[root@zabbix-server01 keepalived]# more exp.sh #!/usr/bin/expect -f set ip [lindex $argv 0 ] set password [lindex $argv 1 ] set timeout 10 spawn ssh root@$ip expect { "*yes/no" { send "yes\r"; exp_continue} "*password:" { send "$password\r";exp_continue } } expect "#*" send "pkill -9 zabbix\r" send "exit\r" expect eof
另为避免主备同时开机时zabbix服务都启动,备机的zabbix-server设置为开机不启动
[root@zabbix-server02 ~]# systemctl disable zabbix-server测试过程同上文,不再赘述。本文所有脚本和配置文件已上传,下载地址:https://github.com/loong576/zabbix-keepalived/archive/master.zip。