-
高可用架构图
主备机通过inotify+rsync实现文件同步,通过mysql主主复制实现数据同步,同一时刻只有一台服务器能对外提供zabbix服务,keepalived用来监控Zabbix Server进程和MySQL进程,以在主机进程崩溃的情况下切换到备机,web端登陆虚ip访问,被监控主机通过配置虚ip来完成监控。
-
基础环境安装
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;
主机为node3,ip为172.21.74.231;备机为node4,ip为172.21.74.223。
2.zabbix安装
2.1.
安装源码库配置部署包
这个部署包包含了yum配置文件:
2.2.
安装
Zabbix-server
部署包
[root@node3 ~]# yum -y install zabbix-server-mysql zabbix-web-mysql
2.3.
安装
MySQL
数据库
2.3.1
下载并安装
MySQL
官方的
Yum Repository
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
下一步:
下一步:
输入密码
“
zabbix
”
,下一步:
name填写为
‘
node3
’
,host和port默认,下一步:
信息汇总确认,下一步:
下载配置文件并另存为
‘
/etc/zabbix/web/zabbix.conf.php
’
,注意属主为zabbix:zabbix,权限为755:
[root@node3 ~]# cd /etc/zabbix/web/
-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
// Zabbix GUI configuration file.
$DB['SERVER'] = 'localhost';
$DB['DATABASE'] = 'zabbix';
$DB['PASSWORD'] = 'zabbix';
// Schema name. Used for IBM DB2 and PostgreSQL.
$ZBX_SERVER = 'localhost';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'node3';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
单击
‘
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
配置
主机配置如下:
[root@node3 ~]# more /etc/keepalived/keepalived.conf
! Configuration File for keepalived
router_id lvs-nginx01 #router_id
机器标识,通常为
hostname
,但不一定非得是
hostname
。故障发生时,邮件通知会用到。
script "/etc/keepalived/check.sh zabbix_server"
script "/etc/keepalived/check.sh mysqld"
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
地址,可以设置多个,每行一个
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
router_id lvs-nginx01 #router_id
机器标识,通常为
hostname
,但不一定非得是
hostname
。故障发生时,邮件通知会用到。
script "/etc/keepalived/check.sh zabbix_server"
script "/etc/keepalived/check.sh mysqld"
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
地址,可以设置多个,每行一个
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
zabbix_server=`ps -C zabbix_server --no-header | wc -l`
mysqld=`ps -C mysqld --no-header | wc -l`
if [ $zabbix_server -gt 0 ];then
if [ $mysqld -gt 0 ];then
该脚本为判断zabbix和mysql服务的状态。
notify_master和notify_backup执行的脚本(主备机除了ip不同外,其他相同):
[root@node3 keepalived]# more zabbix.sh
systemctl start zabbix-server
/etc/keepalived/exp.sh 172.21.74.223
[root@node4 keepalived]# more zabbix.sh
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
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "Root\$1036\r";exp_continue }
send "systemctl stop zabbix-server\r"
该脚本作用为当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
三、文件及数据同步
1.mysql数据库同步
1.1.
编辑配置文件
/etc/my.cnf
node3:
[root@node3 ~]# more /etc/my.cnf
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
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=performance_schema
binlog-ignore-db=information_schema
replicate-do-db=zabbix #
需要复制的数据库
replicate-ignore-db=mysql #
不需要复制的数据库
replicate-ignore-db=performance_schema
replicate-ignore-db=information_schema
node4:
[root@node4 ~]# more /etc/my.cnf
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
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=performance_schema
binlog-ignore-db=information_schema
replicate-do-db=zabbix #
需要复制的数据库
replicate-ignore-db=mysql #
不需要复制的数据库
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';
node4上新建主机可以登录的MySQL用户
‘
zabbix231
’
:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'zabbix231'@'172.21.74.231' IDENTIFIED BY 'zabbix231';
1.3.
查看二进制日志名和位置
mysql> show master status;
node3:
node4:
1.4.
启动同步
1.4.1
主从同步
构建node3到node4的主从同步
以下操作都在node4上执行:
-> MASTER_HOST='172.21.74.231',
-> MASTER_USER='zabbix223',
-> MASTER_PASSWORD='zabbix223',
-> MASTER_LOG_FILE='mysql-bin.000001',
Query OK, 0 rows affected, 2 warnings (0.38 sec)
开启复制:
查看主从复制是否配置成功:
mysql> SHOW SLAVE STATUS\G
Slave_IO_Running: YES和Slave_SQL_Running状态都为
‘
Yes
’
,复制状态正常。
1.4.2
主主同步
再做一次node4到node3的主从同步即完成了主主同步
以下操作都在node3上执行:
-> MASTER_HOST='172.21.74.223',
-> MASTER_USER='zabbix231',
-> MASTER_PASSWORD='zabbix231',
-> MASTER_LOG_FILE='mysql-bin.000001',
Query OK, 0 rows affected, 2 warnings (0.46 sec)
开启复制:
查看主从复制是否配置成功:
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
log file=/var/log/rsyncd.log
motd file = /etc/rsyncd.motd
hosts allow= 172.21.74.223
secrets file=/etc/rsyncd.pwd
secrets file=/etc/rsyncd.pwd
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.
参数说明
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
地址
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 '$a rsync --daemon --config=/etc/rsyncd.conf' /etc/rc.d/rc.local
[root@node4 ~]# sed -i '$a rsync --daemon --config=/etc/rsyncd.conf' /etc/rc.d/rc.local
2.2.inotify
2.2.1.inotify
安装
主备机同时执行:
添加eprl源:
安装inotify:
[root@node3 /]# yum -y install inotify-tools
2.2.2.
编写监控同步脚本
[root@node3 ~]# more /root/scripts/inotify.sh
WebPath2=/etc/httpd/conf.d/
/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 |
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
echo $line >> /var/log/inotify.log
该脚本首先是用inotify分别监控
‘
$WebPath $WebPath2 $ZabbixPath
’
三个文件的状态,若有变化则分别触发对应的rsync同步。备机配置同主机,只是
‘
Server
’
项为231。
注意Path后的路径有
‘
/
’
。
2.2.3.
参数说明
-m, –monitor #
始终保持事件监听
-r, –recursive #
递归监控目录数据信息变化
-q, –quiet #
输出信息少(只打印事件信息)
–format #
打印使用指定的输出类似格式字符串,即实际监控输出内容
-e #
指定监听指定的事件,如果省略,表示所有事件都进行监听
close_write #
文件或目录关闭,在写入模式打开之后关闭的
move #
文件或目录不管移动到或是移出监控目录都触发事件
2.2.4.
主备机分别启动监控同步脚本
[root@node3 ~]# nohup sh /root/scripts/inotify.sh &
[root@node4 ~]# nohup sh /root/scripts/inotify.sh &
四、高可用测试
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.
客户端配置
修改客户端配置,将
‘
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进程:
[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服务高可用测试完成。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31544156/viewspace-2286615/
,如需转载,请注明出处,否则将追究法律责任。