一、架构设计及环境规划:
架构设计图:
架构设计说明:
1. 基础架构为LAMP环境,采用keepalived实现zabbix服务器高可用,保证主server的mysql或者httpd宕掉后能切换到从server
2、数据库做主主同步,保证两边服务器数据的一致性,实现数据库的高可用。
3、采用unison同步软件保证不管修改那台服务器配置,zabbix配置目录及web目录内容的一致,实现文件双向同步。
网络环境说明:
软件版本说明:
二、软件安装配置(zabbix1同zabbix2)
配置两个节点的hosts文件,保证两个节点解析一致
# vim /etc/hosts
10.10.1.101 zabbix1
10.10.1.99 zabbix2
LAMP环境安装
# yum -yinstall epel-release#yum -y install gcc gcc-c++
# yum -y install php php-gd php-mysql php-bcmath php-mbstring php-xml curl curl-devel net-snmp net-snmp-devel perl-DBI
# yum -y install httpd
# yum -y install mariadb mariadb-server
创建程序运行用户,zabbix默认以zabbix用户运行
# groupadd -r zabbix
# useradd -g zabbix -r zabbix
注: -r, --system 创建一个系统账户
-g, --gid GROU 新账户主组的名称或 ID
zabbix的安装和配置
# tar -zxvfzabbix-3.2.6.tar.gz
# cd zabbix-3.2.6
# ./configure --with-mysql=/usr/bin/mysql_config --with-net-snmp --with-libcurl --enable-server --enable-agent --enable-proxy --prefix=/usr/local/zabbix
# make && make install
--prefix----> 指定zabbix安装目录
--enable-server----> 支持zabbix服务器
--enable-agent----> 支持zabbix代理
--enable-proxy----> 支持zabbix代理服务器
--with-libcurl----> 使用curl包
--with-net-snmp----> 使用net-snmp软件包,选择性地指定路径NET-SNMP配置
--with-mysql=/usr/bin/mysql_config 使用MySQL客户端库可以选择指定路径mysql_config
注:如出现configure: error: MySQL library not found错误,是因为缺少mariadb-devel该软件包,yum install mariadb-devel进行安装
导入数据库
# systemctl start mariadb
# systemctl enable mariadb
# mysql -u root
MariaDB [(none)]>use zabbix;
MariaDB [zabbix]> source /root/zabbix-3.2.6/database/mysql/schema.sql
MariaDB [zabbix]> source /root/zabbix-3.2.6/database/mysql/images.sql
MariaDB [zabbix]> source /root/zabbix-3.2.6/database/mysql/data.sql
MariaDB [zabbix]> quit
注:导入请按以上顺序导入,否则会出现错误情况。
添加服务器对应的端口(可省略)
[root@localhost ~]# cat /etc/services |grep zabbix
zabbix-agent 10050/tcp # Zabbix Agent //客户端
zabbix-agent 10050/udp # Zabbix Agent
zabbix-trapper 10051/tcp # Zabbix Trapper //服务端
zabbix-trapper 10051/udp # Zabbix Trapper
拷贝相关的配置文件到/etc下并进行相关配置修改
[root@localhost ~]# mkdir -p /etc/zabbix
[root@localhost ~]# cp -r zabbix-3.2.6/conf/* /etc/zabbix/
[root@localhost ~]# ln -s /usr/local/zabbix/etc/* /etc/zabbix/
[root@localhost ~]# chown -R zabbix:zabbix /etc/zabbix
[root@localhost ~]# ln -s /usr/local/zabbix/bin/* /usr/bin/
[root@localhost ~]# ln -s /usr/local/zabbix/sbin/* /usr/sbin/
a).修改zabbix_server.conf
[root@localhost ~]# vim /etc/zabbix/zabbix_server.conf
修改后如下:
[root@localhost ~]# cat /etc/zabbix/zabbix_server.conf|grep -n ^[^#]
LogFile=/tmp/zabbix_server.log ##日志文件地址
SourceIP=10.10.1.98 #VIP虚拟IP
BHost=localhost ##数据库主机
DBName=zabbix ##数据库名
DBUser=zabbix ##数据库用户名
DBPassword=zabbix ##数据库密码
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts
##zabbix运行脚本存放目录
b).修改zabbix_agentd.conf
[root@localhost ~]# vim /etc/zabbix/zabbix_agentd.conf
修改后如下:
[root@localhost ~]# cat /etc/zabbix/zabbix_agentd.conf|grep -n ^[^#]
PidFile=/tmp/zabbix_agentd.pid ##进程PID
LogFile=/tmp/zabbix_agentd.log ##日志保存位置
EnableRemoteCommands=1 ##允许执行远程命令
Server=10.10.1.98 #VIP
ServerActive=10.10.1.98 #VIP
Hostname=zabbix1 (zabbix2上写zabbix2)
##在web端添加监控主机时,必须与zabbix创建的hostname相同
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/
##添加在定义Key时,存放的位置
UnsafeUserParameters=1 ##启动自定义key
修改PHP相关参数
# vim /etc/php.ini
max_execution_time = 300
max_input_time = 300
memory_limit = 128M
upload_max_filesize = 2M
date.timezone = Asia/Shanghai
post_max_size = 28M
配置web站点
①
# cd zabbix-3.2.6/
# cp -r frontends/php /var/www/html/zabbix
# chown -R apache:apache/var/www/html/zabbix
②修改httpd.conf的参数
# vim /etc/httpd/conf/httpd.conf
164 DirectoryIndex index.htmlindex.php
③关闭SELinux和防火墙
# sed-i"s/SELINUX=enforcing/SELINUX=disabled/"/etc/selinux/config
# setenforce 0
# iptables -F
添加开机启动脚本
# cd zabbix-3.2.6/
# cp misc/init.d/fedora/core5/zabbix_server/etc/init.d/zabbix_server
# cp misc/init.d/fedora/core5/zabbix_agentd/etc/init.d/zabbix_agentd
修改脚本的默认设置,指定相关路径以及配置文件:
此步相当重要,不然会出现zabbi_server起不来的现象,查看日志显示
[Z3001] connection to database 'zabbix' failed: [1045] Access denied for user 'zabbix'@'localhost' (using password: NO)
# vim /etc/init.d/zabbix_server
21 ZABBIX_BIN="/usr/local/zabbix/sbin/zabbix_server"
31daemon $ZABBIX_BIN-c /etc/zabbix/zabbix_server.conf
#vim /etc/init.d/zabbix_agentd
21 ZABBIX_BIN="/usr/local/zabbix/sbin/zabbix_agentd"
31 daemon $ZABBIX_BIN-c/etc/zabbix/zabbix_agentd.conf
# chmod +x /etc/init.d/zabbix_server
# chmod +x /etc/init.d/zabbix_agentd
#chkconfig --add zabbix_server
#chkconfig --add zabbix_agentd
# chkconfig zabbix_server on
# chkconfig zabbix_agentd on
MySQL 主主同步
修改数据库配置文件(除红色部分,zabbix1同zabbix2)
############################################
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions inhttp://fedoraproject.org/wiki/Systemd
server-id=1 #(zabbix2 设置为2)
log-bin=mysql-bin # 开启bin日志
expire_logs_days=365 # bin日志过期清理时间
max_binlog_size=314572800 # 每个bin日志大小
auto-increment-increment = 2 #字段变化增量值
auto-increment-offset = 1 #初始字段ID为1
slave-skip-errors = all #忽略所有复制产生的错误
binlog-do-db=zabbix # 同步原数据库名
binlog-ignore-db=mysql # 不同步数据库名
binlog-ignore-db=test
replicate-do-db=zabbix
replicate-ignore-db=mysql
replicate-ignore-db=test
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
#####################################################
# systemctl restart mariadb
建立同步数据同步账号
zabbix1上操作:
mysql> grant replication slave on *.* to 'tongbu'@'10.10.1.99' identified by 'tongbu@123';
mysql> flush privileges;
zabbix2上操作:
mysql> grant replication slave on *.* to 'tongbu'@'10.10.1.101' identified by 'tongbu@123';
mysql> flush privileges;
在zabbix1和zabbix2上
查看同步账号:
mysql> use mysql;
Database changed
mysql> select user,host from user;
在zabbix1上
获取zabbix2 binlog 文件 和 id:
+------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+-------------------------------+
| mysql-bin.000002 | 1512 | zabbix | mysql,test,information_schema |
+------------------+----------+--------------+-------------------------------+
在zabbix2上
获取zabbix1 binlog 文件 和 id:
mysql> show master status;
+------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+-------------------------------+
| mysql-bin.000002 | 1510 | zabbix | mysql,test,information_schema |
+------------------+----------+--------------+-------------------------------+
启动互为主从的模式
zabbix1上操作:
mysql> change master tomaster_host='10.10.1.99',master_user='tongbu',master_password='tongbu@123',master_log_file='mysql-bin.000002',master_log_pos=1512;
mysql>start slave;
zabbix1上查看同步状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.1.99
Master_User: tongbu
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 40294
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 1088
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: zabbix
Replicate_Ignore_DB: mysql,test,information_schema
zabbix2上操作:
mysql> change master to master_host='10.10.1.101', master_user='tongbu', master_password='tongbu@123', master_log_file='mysql-bin.000002',master_log_pos=1510;
mysql>start slave;
zabbix2上查看同步状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.1.101
Master_User: tongbu
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 4587
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 3328
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: zabbix
Replicate_Ignore_DB: mysql,test,information_schema
安装keepalived实现主从切换
对keepalived的安装,我们可以用yum也可以源码编译安装,我们这里用yum
# yum install keepalived
创建keepalived状态检查脚本:
# vi /etc/keepalived/keepalived_check.sh
###############################################
#!/bin/bash
mysql_check=`ps -C mysqld --no-header | wc -l`
httpd_check=`ps -C httpd --no-header | wc -l`
case $1 in
mysqld)
if [ $mysql_check -eq 0 ];then
systemctl start mariadb
sleep 3
if [ $mysql_check -eq 0 ];then
systemctl stop keepalived
fi
fi
;;
httpd)
if [ $httpd_check -eq 0 ];then
systemctl start httpd
sleep 3
if [ $httpd_check -eq 0 ];then
systemctl stop keepalived
fi
fi
;;
esac
#######################################################
# chmod 755 /etc/keepalived/keepalived_check.sh
创建zabbix重启脚本:
当主从切换的时候执行此脚本,必须在keepalived配置文件中增加此脚本,否则,主从切换后,web查看host的状态是错误,但是后台可以获得数据!如下图所示:
具体原因不明,可能是因为hosts中主机的items选项中”Update interval (in sec) 60”更新时间默认设置为60秒,所以切换后相当于重新连接切换的从server数据,造成此现象。所以下面脚本中增加了 60秒的睡眠时间。
#vim /etc/keepalived/keepalived_zabbix.sh
###########################
#!/bin/bash
sleep 60
/etc/init.d/zabbix_server restart
##############################
# chmod 777 /etc/keepalived/keepalived_zabbix.sh
修改keepalived配置文件(红色标示部分为zabbix2需要修改地方,其他配置zabbix1同zabbix2)
# vi /etc/keepalived/keepalived.conf
#############################################
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc #设置报警地址,可以设置多个,每行1个
sysadmin@firewall.loc #需安装sendmail,并开启邮件报警
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 #设置SMTP Server地址
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script mysqld #vrrp脚本命名
{
script "/etc/keepalived/keepalived_check.sh mysqld" #要执行的脚本
interval 2 #脚本指定间隔,单位为秒
weight -30 #优先级(如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加,如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少)
fall 2 #尝试两次都成功才成功
rise 2 #尝试两次都失败才失败
}
vrrp_script httpd
{
script "/etc/keepalived/keepalived_check.sh httpd"
interval 2
weight -20
fall 2 #尝试两次都成功才成功
rise 2 #尝试两次都失败才失败
}
vrrp_instance zabbix_server{
stateMASTER#指定Keepalived的角色,MASTER为主,BACKUP为备
interface eth0 #绑定真实的物网卡
virtual_router_id 51 #虚拟路由编号,主备要一致
priority100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR,zabbix2写90
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS #认证方式,PASS或AH两种
auth_pass 1111 #认证密码,主备服务器要一致
}
track_script #调用上面定义的检查脚本
{
mysqld
}
track_script
{
httpd
}
virtual_ipaddress {
10.10.1.98 #定义虚拟IP(VIP),可多设,每行一个,注意和zabbix1 zabbix2在同一网端(掩码问题)
}
notify_master "/etc/keepalived/keepalived_zabbix.sh" #指定当切换到master时,执行的脚本,歇60秒
notify_backup "/etc/keepalived/keepalived_zabbix.sh" #指定当切换到backup时,执行的脚本,歇60秒
#notify_fault "/sbin/service zabbix_server stop" #故障时执行的脚本
}
#######################################################
# systemctl start keepalived
# systemctl enablekeepalived
启动服务,查看监听端口
# service zabbix_server start
# service zabbix_agentd start
# ss -tln
三、实现web目录双向同步
配置zabbix1和zabbix2免密码验证
ssh端口默认的22,如果你修改ssh服务默认连接端口,两边用秘钥连接的时候分别在脚本里面指定对端正确端口。
zabbix1上操作:
#ssh-keygen (回车后再按三下回车)
#ssh-copy-id root@10.10.1.99
zabbix2上操作:
#ssh-keygen (回车后再按三下回车)
#ssh-copy-id root@10.10.1.101
安装unison同步工具(zabbix1同zabbix2)
安装unison:
http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/
# wgethttp://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.4.tar.gz
# tar zxvf unison-2.13.16.tar.gz
# cd unison-2.48.4
# make UISTYLE=text THREADS=true STATIC=true
# cp ./unison /usr/local/bin/
# /usr/local/bin/unison
生成的这个文件之后,首先需要执行一次,会在当前登陆的用户家目录下生成一个.unison的目录,并且在目录下生成一个defualt.prf文件,以后unison的使用都是通过修改稿配置文件,执行unison这个命令进行。
安装inotify工具inotify-tools:
http://inotify-tools.sourceforge.net
确认Linux系统内核为2.6.13以上,如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持。
# wgethttp://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# tar xvf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure
# make
# make install
# ll /usr/local/bin/inotifywa*
-rwxr-xr-x 1 root root 37264 04-14 13:42 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 35438 04-14 13:42 /usr/local/bin/inotifywatch
inotify-tools安装完成后,会生成inotifywait和inotifywatch两个指令:
inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树
inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息
修改unison配置文件,编写同步脚本进行实施监控同步(除红色表明外,zabbix1同zabbix2)
整个过程是通过使用innotify对目录和文件进行检查,然后根据变动调用unison工具进行同步
创建同步zabbix配置的prf文件(zabbix1上操作):
# cd /root/.unison
# vim zabbix.prf
注意:同步zabbix配置,有几个注意的地方,不同版本的zabbix版本切记不要同步他的二进制文件,因为每个版本的zabbix编译所产难过的二进制文件不是一定是一样的。这样会造成一边zabbix运行出问题!
#################################################
# Unison preferences file
#unison服务端配置文件
root=/usr/local/zabbix/
#本地文件夹
root=ssh://root@10.10.1.99//usr/local/zabbix/ #zabbix2换成zabbix1的IP
#格式:ssh://$user@$IP//$DIR
#远程文件夹
batch = true
#表示全自动模式,接受并执行默认动作。
owner = true
#表示保持同步的文件属主信息。
group = true
#表示保持同步的文件属组信息。
perms = -1
#表示保持同步的文件读写权限。
fastcheck = false
#true表示同步时通过文件的创建时间来比较两地文件;false表示同步时通过比较两地文件内容。
rsync = false
#默认值是true,用于激活rsync传输模式。
sshargs = -C
#使用ssh的压缩传输方式。
xferbycopying = true
#优化传输参数,默认值为true。
#confirmbigdel = false
#默认值为true,表示当需要同步的两个目录有一个为空时,unison将停止。设置为false可以保证当需要同步的某个目录为空时,unison不会停止运转。
log = true
#表示在终端输出运行信息。
logfile = /root/.unison/unison.log
#指定同时输出写入log文件。
maxthreads = 300
#指定同步时最大线程数。
#repeat = 1
#表示间隔1秒后开始一次新的同步检查
retry = 3
#指定失败重试次数
#force = /wwwroot
#指定force表示以本地/wwwroot为标准,指定了则变成单项同步了,所以在这里不指定。
path=bin#这下面了自定义的检查脚本
path=sbin
path=etc
path=lib
path=share/zabbix/#这下面放了告警脚本
#同步指定的子目录及文件,而非整个目录。可以写多个path,如在下面再写一个path = wwwbak。
ignore = Path etc/zabbix_agentd.conf
#忽略/wwwroot下面的WEB-INF/tmp目录,即同步时不同步它。注意,这里是"Path",而不是"path"。
######################################
创建同步Web文件的prf文件(zabbix1上操作):
# vim webapps.prf
###########################
# Unison preferences file
#unison服务端配置文件
root=/var/www/html/zabbix/
#本地文件夹
root=ssh://root@10.10.1.99//var/www/html/zabbix/#zabbix2换成zabbix1的IP
#远程文件夹
batch = true
#表示全自动模式,接受并执行默认动作。
owner = true
#表示保持同步的文件属主信息。
group = true
#表示保持同步的文件属组信息。
perms = -1
#表示保持同步的文件读写权限。
fastcheck = false
#true表示同步时通过文件的创建时间来比较两地文件;false表示同步时通过比较两地文件内容。
rsync = false
#默认值是true,用于激活rsync传输模式。
sshargs = -C
#使用ssh的压缩传输方式。
xferbycopying = true
#优化传输参数,默认值为true。
#confirmbigdel = false
#默认值为true,表示当需要同步的两个目录有一个为空时,unison将停止。设置为false可以保证当需要同步的某个目录为空时,unison不会停止运转。
log = true
#表示在终端输出运行信息。
logfile = /root/.unison/unison.log
#指定同时输出写入log文件。
maxthreads = 300
#指定同步时最大线程数。
#repeat = 1
#表示间隔1秒后开始一次新的同步检查
retry = 3
#指定失败重试次数
#force = /wwwroot
#指定force表示以本地/wwwroot为标准,指定了则变成单项同步了,所以在这里不指定。
#path = /usr/local/zabbix/bin/
#同步指定的子目录及文件,而非整个目录。可以写多个path,如在下面再写一个path = wwwbak。
#ignore = Path WEB-INF/tmp
#忽略/wwwroot下面的WEB-INF/tmp目录,即同步时不同步它。注意,这里是"Path",而不是"path"。
#################################################
------------------------------------------------------参数含义--------------------------------------------------------
# Unison preferences file
#unison服务端配置文件
root=/Data/apps/zabbix/
#本地文件夹
root=ssh://root@10.3.6.42//Data/apps/zabbix/ #格式:ssh://$user@$IP//$DIR
#远程文件夹
batch = true
#表示全自动模式,接受并执行默认动作。
owner = true
#表示保持同步的文件属主信息。
group = true
#表示保持同步的文件属组信息。
perms = -1
#表示保持同步的文件读写权限。
fastcheck = false
#true表示同步时通过文件的创建时间来比较两地文件;false表示同步时通过比较两地文件内容。
rsync = false
#默认值是true,用于激活rsync传输模式。
sshargs = -C
#使用ssh的压缩传输方式。
xferbycopying = true
#优化传输参数,默认值为true。
#confirmbigdel = false
#默认值为true,表示当需要同步的两个目录有一个为空时,unison将停止。设置为false可以保证当需要同步的某个目录为空时,unison不会停止运转。
log = true
#表示在终端输出运行信息。
logfile = /root/.unison/unison.log
#指定同时输出写入log文件。
maxthreads = 300
#指定同步时最大线程数。
#repeat = 1
#表示间隔1秒后开始一次新的同步检查
retry = 3
#指定失败重试次数
#force = /wwwroot
#指定force表示以本地/wwwroot为标准,指定了则变成单项同步了,所以在这里不指定。
path=bin/custom/ #这下面了自定义的检查脚本
path=etc
path=sbin
path=lib
path=share/zabbix/ #这下面放了告警脚本
#同步指定的子目录及文件,是相对路径,而非整个目录。可以写多个path,如在下面再写一个path = wwwbak。
ignore = Path etc/zabbix_agentd.conf
#忽略/wwwroot下面的WEB-INF/tmp目录,即同步时不同步它。注意,这里是"Path",而不是"path"。
---------------------------------------------------------------------------------------------------------------
创建同步脚本(zabbix1同zabbix2):
# vim /root/.unison/unison.sh
######################################
#/bin/bash
dir1="/var/www/html/zabbix/"#需要检测的目录#
dir2="/app/zabbix/"#需要检测的目录#
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $dir1 $dir2 | while read line; do
#通过inotifywait来检测这个两个目录的改动情况#
/usr/local/bin/unison webapps #调用配置文件webapps.prf同步#
/usr/local/bin/unison zabbix #调用配置文件zabbix.prf同步#
echo -n "`whoami` `date | cut -d " " -f1-5` " >> /var/log/inotify.log
#记录目录被更改的时间到日志,并记录当前登陆的用户#
echo "$line" >> /var/log/inotify.log #记录目录哪些文件被更改情况#
done
########################################################
脚本放后台执行:
# /usr/bin/nohup bash/root/.unison/unison.sh&
放后台,不会因为关闭窗口断开,查看进程
[root@zabbix1 ~]# ps aux | grep unison.sh
root 18733 0.0 0.1 113132 1368 pts/0 S 09:57 0:00 bash /root/.unison/unison.sh
root 18735 0.0 0.0 113136 864 pts/0 S 09:57 0:00 bash /root/.unison/unison.sh
root 26974 0.0 0.0 112680 984 pts/0 S+ 15:48 0:00 grep --color=auto unison.sh
# echo "/usr/bin/nohup/root/.unison/unison.sh &" >> /etc/rc.local
两边都运行脚本后,可以创建文件测试下,同时可以跟踪nohup.out文件查看同步情况
# tailf nohup.out
在centos7上,我们可以将其注册为系统服务,用systemd控制:
# chmod +x/root/.unison/unison.sh
# vimunison.service
##############################
[Unit]
Description=Files rsync script
[Service]
ExecStart=/usr/bin/nohup /root/.unison/unison.sh &
[Install]
WantedBy=multi-user.target
##############################
# mvunison.service/etc/systemd/system
# systemctl daemon-reload
# systemctl startunison.service
# systemctl enableunison.service
# systemctl status unison.service
四、测试高可用效果
vip的位置一开始在zabbix1上面:
登录web新建一个hosts:
停掉zabbix1的httpd服务,可以看到VIP飘到zabbix2上面了:
再通过vip地址打开web页面,发现依然可以使用,且新建主机一样,到此zabbix的高可用已完全实现!
五、故障排查和注意事项:
1、DNS解析要确保一致,防止切换后会出现问题。
vim /etc/resolv.conf
当在zabbix监控项中使用dns域名解析监控主机时,要考虑zabbix服务器是否能够解析这个域名,不然则会获取不到数据(确保两边的zabbix服务器都可以解析域名)
2.zabbix_get 问题
实施完zabbix高可用后,大批量的zabbix_agent超时的报警,后来手动使用zabbix_get用agent.ping这个key做测试,发现确实无法获取数据,通过抓包和查看建立连接,默认建立连接都是用的物理网卡的真实IP(10.10.1.101)去与客户端的10050去建立连接得,Server并没有使用虚IP(10.10.1.98)去与10050建立连接,后来使zabbix_get -h 查看帮助信息,得知-I 参数后,使用zabbix_get -I 指定源IP为虚IP才能获取到数据
问题原因:
事后分析,为什么告警得只有agent.ping 这种告警,我们得环境都监控项都是主动模式,但是监控agent得当然还是采用被动模式Server去检测agent端的agent启动状态,但是只有这钟告警,我初步定位到是被动方式受影响了,相关得配置项也就“Server= ”这个但是我这里配置是对的,和更具上面得表现形式Server zabbix_get 加 “-I”参数能get到值,不加get不到值;那么Server在哪里能够把“-I”能配置吗?
后来得知Server配置文件中有一项:“SourceIP=” 这项默认是没有配置的,那么他就会走通过物理网卡得IP去请求客户端建立连接。在这个三次握手中源IP自然是物理网卡IP,没有用虚IP去请求,所以当10.10.1.101请求客户端建立连接得时候,对方看一下自己的“Server=”配置是10.10.1.98 对比一下发现不匹配,然后拒绝10.10.1.101得请求,所以Server请求失败了。
解决方法:
修改Server配置文件
# vim zabbix_server.conf
SourceIP=10.10.1.98 #修改为VIP
那么再次去请求的时候就是通过这个虚IP去请求,对应agent端“Server=VIP”项配置。匹配OK 故障恢复!
六、参考
http://blog.51cto.com/yigemeng/1738174
http://www.jiagoumi.com/work/618.html
http://caml.inria.fr/pub/distrib/ocaml-3.10/
https://github.com/rvoicilas/inotify-tools/wiki
http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/