Zabbix高可用,实现zabbix的无缝切换,无故障时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zabbix高可用,实现zabbix的无缝切换,无故障时间相关的知识,希望对你有一定的参考价值。

   

作者:骚年有梦

联系方式:[email protected]


zabbix高可用设计目标:

1、keepalived服务优先级选择切换机制:对于zabbix服务器来说,只要zabbix存活和mysql存活,就能够正常记录数据,不会丢失数据,phpnginx只是web页面的访问而已,所以我在这里定义mysql和zabbix为主要服务,php和nginx为次要服务,为了实现主要服务存在,次要服务挂了;次要服务器存在,主要服务器挂了,keepalived会优先选择主要服务存在的一方作为Master,让keepalived切换更为更合理。

2、数据库主主同步:不管切到哪一边都需要保持数据一致性,不可出现丢数据或者数据重复。保证数据库的高可用

3、文件双向同步:

        (1)web文件同步:任何做web文件得配置和修改,保证两边一致,确保切换不会发生任何变化。

        (2)zabbix服务文件同步:对zabbix_servr的配置文件做的任何修改,和脚本的修改进行同步,也是为了保证两边的服务一致性,没有落后情况,达到无需人工干预自动切换服务可正常时候。

到此即完成了zabbix得无缝切换,无故障时间!


一、环境

VIP

10.3.6.153

real_server1

10.3.6.43

real_server2

10.3.6.42

技术分享

准备环境:

1、server1 安装zabbix,mysql,php,nginx/apache 确保zabbix能够正常服务

第一步ok,肯定都是有在跑着的zabbix服务的。这里不介绍zabbix的安装,可参考我zabbix安装的文档

2、准备server2环境:

(1)安装php、nginx、mysql、zabbix。

(2)备份server1数据库导入到server2数据库中

(3)server1和server2 数据库做主主同步(全库同步)

(3)cp server1 web文件到server2 web目录中。

(4)启动所有服务,打开浏览器登录zabbix,确保zabbix能够正常访问。


二、部署keepalived

1、安装keepalived服务(server1和server2两边同样操作)

可以去官网http://www.keepalived.org/下载最新的源码包,也可以直接用yum安装。

这里使用编译安装

[[email protected] ~]#tar zxf keepalived-1.2.15.tar.gz -C /usr/src/

[[email protected] ~]# cd /usr/src/keepalived-1.2.15/    
[
[email protected] keepalived-1.2.15]# ./configure --prefix=/Data/apps/keepalived/

[[email protected] keepalived-1.2.15]# make && make install

拷贝keepalived、启动脚本等

[[email protected] /]# cp /Data/apps/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/        #启动脚本

[[email protected] /]# cp /Data/apps/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

[[email protected] /]# mkdir /etc/keepalived

[[email protected] /]# cp /Data/apps/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

[[email protected] /]# cp /Data/apps/keepalived/sbin/keepalived /usr/bin/

2、扩展keepalived检查,编写keepalived 外加的检查脚本(server1 和server2同样操作)

[[email protected] /]# vim /etc/keepalived/keepalived_check.sh      

文件:技术分享

#!/bin/bash
#这是一个keepalived检查服务器启动状态的脚本
#2015/6/14
#[email protected]
CMD="ss -nal"
case $1 in
        service)
        $CMD |grep ":3306" &> /dev/null && $CMD |egrep ":10051" &> /dev/null;;
        httpd)
        $CMD |grep ":81" &> /dev/null && $CMD |egrep ":9000" &> /dev/null ;;
esac


3、对keepalived进行配置,修改server1 keepalived配置

[[email protected] /]# vim /etc/keepalived/keepalived.conf

-----------------------------------------------------------------------------------------

! Configuration File for keepalived
 
global_defs {
   notification_email {     #定义接收邮件的地址,一行对应一个
     [email protected]
     [email protected]   #要接收邮件的邮箱地址
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1      #指定smtp服务器地址
   smtp_connect_timeout 30    #指定超时时间
   router_id zabbix_server     #指定keepalived机器的标识
}
 
vrrp_script mysql           #vrrp脚本命名
{
        script "/etc/keepalived/keepalived_check.sh mysql"   #要执行的脚本
        interval 5      #脚本指定间隔
        weight -30     #优先级(如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加,如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少)
        fall   2     #尝试两次都成功才成功
        rise   2     #尝试两次都失败才失败
}
 
vrrp_script httpd
{
        script "/etc/keepalived/keepalived_check.sh httpd"
        interval 5
        weight -20
        fall   2     #尝试两次都成功才成功
        rise   2     #尝试两次都失败才失败
}
 
#VRRP实例组定义:VRRP实例就表示在上面开启了VRRP协议,这个实例说明了VRRP的一些特性,如主从、VRID等,可以在每个接口上开启一个实例。
vrrp_instance zabbix_server {
    state MASTER    #指定实例的初始状态,高优先级的会竞选为master,
    interface eth0      #实例绑定的网卡
    virtual_router_id 153   #VRID标记(0...255),MASTER和BACKUP要一致
    priority 100     #优先级,数字越高级别越高,master要高于backup。
    advert_int 1       #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {     #验证类型和密码
        auth_type PASS    #明文密码验证
        auth_pass zabbix.haodf     #认证的密码
    }
 
    track_script        #调用上面定义的检查脚本
    {
       mysql
    }
 
    track_script
    {
        httpd
    }
 
    virtual_ipaddress {      #虚IP  一行一个
       10.3.6.153/24         
    }
#notify_master "/sbin/service zabbix_server restart" #指定当切换到master时,执行的脚本
#notify_backup "/sbin/service zabbix_server stop" #指定当切换到backup时,执行的脚本
#notify_fault "/sbin/service zabbix_server stop" #故障时执行的脚本
}
 
##LVS配置  (我们这里没有使用到lvs,所以都注释掉)
#virtual_server 10.3.6.153 81 {
#   delay_loop 6 #服务轮询的延时时间
#   lb_algo rr #lvs的调度算法
#   lb_kind NAT #lvs集群模式
#   persistence_timeout 50  #连接超时时间(秒)
#   protocol TCP #使用的协议是TCP
#
#   real_server 10.3.6.43 81 {
#   weight 1  #权重,默认为1,0为失效
#   TCP_CHECK {   #后端服务器健康检查
#   connect_timeout 5   #连接超时时间
#   nb_get_retry 3   #重连次数
#   delay_before_retry 3   #重连间隔时间(秒)
#   connect_port 80    #检查端口
#      }
#   }
#
#   real_server 10.3.6.42 81 {
#   weight 1
#   TCP_CHECK {
#   connect_timeout 5
#   nb_get_retry 3
#   delay_before_retry 3
#   connect_port 81
#      } 
#   }
#}


-----------------------------------------------------------------------------------------------

4、修改server2 keepalived配置

[[email protected] /]# vim /etc/keepalived/keepalived.conf

----------------------------------------------------------------------------------------------------------------

! Configuration File for keepalived
 
global_defs {
   notification_email {     #定义接收邮件的地址,一行对应一个
     [email protected]
     [email protected]   #要接收邮件的邮箱地址
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1      #指定smtp服务器地址
   smtp_connect_timeout 30    #指定超时时间
   router_id zabbix_server     #指定keepalived机器的标识
}
 
vrrp_script mysql           #vrrp脚本命名
{
        script "/etc/keepalived/keepalived_check.sh mysql"   #要执行的脚本
        interval 5      #脚本指定间隔
        weight -30     #优先级(如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加,如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少)
        fall   2     #尝试两次都成功才成功
        rise   2     #尝试两次都失败才失败
}
 
vrrp_script httpd
{
        script "/etc/keepalived/keepalived_check.sh httpd"
        interval 5
        weight -20
        fall   2     #尝试两次都成功才成功
        rise   2     #尝试两次都失败才失败
}
 
#VRRP实例组定义:VRRP实例就表示在上面开启了VRRP协议,这个实例说明了VRRP的一些特性,如主从、VRID等,可以在每个接口上开启一个实例。
vrrp_instance zabbix_server {
    state BACKUP    #指定实例的初始状态,高优先级的会竞选为master,
    interface eth0      #实例绑定的网卡
    virtual_router_id 153   #VRID标记(0...255),MASTER和BACKUP要一致
    priority 90     #优先级,数字越高级别越高,master要高于backup。
    advert_int 1       #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
    authentication {     #验证类型和密码
        auth_type PASS    #明文密码验证
        auth_pass zabbix.haodf     #认证的密码
    }
 
    track_script        #调用上面定义的检查脚本
    {
    mysql
    }
 
    track_script
    {
        httpd
    }
 
    virtual_ipaddress {      #虚IP  一行一个
       10.3.6.153/24         
    }
#notify_master "/sbin/service zabbix_server restart" #指定当切换到master时,执行的脚本
#notify_backup "/sbin/service zabbix_server stop" #指定当切换到backup时,执行的脚本
#notify_fault "/sbin/service zabbix_server stop" #故障时执行的脚本
}
 
##LVS配置  (我们这里没有使用到lvs,所以都注释掉)
#virtual_server 10.3.6.153 81 {
#   delay_loop 6 #服务轮询的延时时间
#   lb_algo rr #lvs的调度算法
#   lb_kind NAT #lvs集群模式
#   persistence_timeout 50  #连接超时时间(秒)
#   protocol TCP #使用的协议是TCP
#
#   real_server 10.3.6.43 81 {
#   weight 1  #权重,默认为1,0为失效
#   TCP_CHECK {   #后端服务器健康检查
#   connect_timeout 5   #连接超时时间
#   nb_get_retry 3   #重连次数
#   delay_before_retry 3   #重连间隔时间(秒)
#   connect_port 80    #检查端口
#      }
#   }
#
#   real_server 10.3.6.42 81 {
#   weight 1
#   TCP_CHECK {
#   connect_timeout 5
#   nb_get_retry 3
#   delay_before_retry 3
#   connect_port 81
#      } 
#   }
#}


-----------------------------------------------------------------------------------------------------    
     

三、部署文件同步   

这里使用unison这个工具在两台服务器之间做文件间的双向同步

Unison简介          
Unison是windows和unix平台下都可以使用的文件同步工具,它能使两个文件夹(本地或网络上的)保持内容的一致。unison拥有其它一些同步工具或文件系统的相同特性,但也有自己的特点:          
     1.跨平台使用;          
     2.对内核和用户权限没有特别要求;          
     3. unison是双向的,它能自动处理两分拷贝中更新没有冲突的部分,有冲突的部分将会显示出来让用户选择更新策略;          
    4.只要是能连通的两台主机,就可以运行unison,可以直接使用socket连接或安全的ssh连接方式,对带宽的要求不高,使用类似rsync的压缩传输协议。
   

   

1、配置双机OpenSSH,是两台机器免密码验证

两台服务器的ssh端口必须是默认的22号端口,或者你修改ssh服务默认连接端口,两边用秘钥连接的时候分别在脚本里面指定对端正确端口。

扩展:修改ssh服务默认连接端口

vim /etc/services

技术分享

(1)创建密钥:

ssh-keygen (回车后再按三下回车)

技术分享

到此就生成密钥对,然后再使用ssh-copy-id命令 后面加对端主机IP 输入对端用户密码后,将私钥传给对方主机

技术分享

(2)、在另外一台服务器上做同样操作,这样两边的服务器就可以免密码验证了

2、安装unison            
unison各种版本下载地址:
         
http://www.seas.upenn.edu/~bcpierce/unison//download.html      
unison编译器下载地址:          
http://caml.inria.fr/pub/distrib/ocaml-3.10      
从以上地址可以下载各种平台,各种版本的unison,有基于源码安装的,有二进制的,我下载的是二进制的,可以直接使用.这里介绍源码安装:

1:源码安装unison      
Linux下从源码包编译安装,需要一个叫做Objective Caml compiler的工具,版本至少3.0.7,可以从这里下载:
http://caml.inria.fr/      
Ocaml安装脚本如下:          
# tar zxvf ocaml-3.09.3.tar.gz            
# cd ocaml-3.09.3              
# ./configure              
# make world opt              
# make install
           
Unison对版本要求很高,进行同步的两台主机需要相同版本的unison,所以这里使用和windows一致的版本2.13.16,unison-2.13.16.tar.gz          
安装脚本如下:
         
# tar zxvf unison-2.13.16.tar.gz          
# cd unison-2.13.16            
# make UISTYLE=text THREADS=true STATIC=true            
# cp ./unison /usr/local/bin/

#/usr/local/bin/unison   #生成的这个文件之后,首先需要执行一次,会在当前登陆的用户家目录下生成一个.unison的目录,并且在目录下生成一个defualt.prf文件,以后unison的使用都是通过修改稿配置文件,执行unison这个命令进行。          

     

3、 安装inotify工具inotify-tools

由于inotify特性需要Linux内核的支持,在安装inotify-tools前要先确认Linux系统内核是否达到了2.6.13以上如果Linux内核低于2.6.13版本,就需要重新编译内核加入inotify的支持,也可以用如下方法判断,内核是否支持inotify:      
[[email protected] webdata]#
uname -r            
2.6.18-164.11.1.el5PAE      
[[email protected] webdata]#
ll /proc/sys/fs/inotify            
总计 0      
-rw-r--r-- 1 root root 0 04-13 19:56
max_queued_events            
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_instances            
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_watches            
如果有上面三项输出,表示系统已经默认支持inotify,接着就可以开始安装inotify-tools了。      
可以到
http://inotify-tools.sourceforge.net/下载相应的inotify-tools版本,然后开始编译安装:      
[[email protected]  ~]#
tar zxvf inotify-tools-3.14.tar.gz            
[email protected]  ~]# cd inotify-tools-3.14            
[[email protected] inotify-tools-3.14]# ./configure            
[[email protected] inotify-tools-3.14]# make            
[[email protected] inotify-tools-3.14]# make install            
[[email protected] inotify-tools-3.14]# 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事件发生多少次等信息。


inotify相关参数

http://note.youdao.com/share/?id=8c2ed94299fae0377a8840e45330b7d1&type=note      
inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小。下面分别做简单介绍。          
    /proc/sys/fs/inotify/max_queued_evnets          
       表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。     

     
  /proc/sys/fs/inotify/max_user_instances            
        表示每一个real user ID可创建的inotify instatnces的数量上限。

         
    /proc/sys/fs/inotify/max_user_watches            
        表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小,例如:          
echo 30000000 > /proc/sys/fs/inotify/max_user_watches

inotifywait相关参数              
Inotifywait是一个监控等待事件,可以配合shell脚本使用它,下面介绍一下常用的一些参数:
         
-m, 即--monitor,表示始终保持事件监听状态。            
-r, 即--recursive,表示递归查询目录。              
-q, 即--quiet,表示打印出监控事件。              
-e, 即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等。
           
更详细的请参看man  inotifywait。


4、修改unison配置文件,并编写同步脚本进行实施监控同步。(server1和server2 上操作一样)

整个过程是通过使用innotify对目录和文件进行检查,然后根据变动调用unison工具进行同步

(1)创建两个新的prf文件:

[[email protected] .unison]# vim zabbix.prf     #同步zabbix配置,有几个注意的地方,不同版本的zabbix版本切记不要同步他的二进制文件,因为每个版本的zabbix编译所产难过的二进制文件不是一定是一样的。这样会造成一边zabbix运行出问题。

-----------------------------------------------------------------------------------        

# Unison preferences file
#unison服务端配置文件

root=/Data/apps/zabbix/      
#本地文件夹      
root=ssh://[email protected]//Data/apps/zabbix/       #格式:ssh://[email protected]$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=cron.d    
path=lib      
path=share/zabbix/   #这下面放了告警脚本      
#同步指定的子目录及文件,而非整个目录。可以写多个path,如在下面再写一个path = wwwbak。
ignore = Path etc/zabbix_agentd.conf      
#忽略/wwwroot下面的WEB-INF/tmp目录,即同步时不同步它。注意,这里是"Path",而不是"path"。


---------------------------------------------------------------------------------      

[[email protected] .unison]# vim webapps.prf       #web文件同步

----------------------------------------------------------------------------------      

# Unison preferences file     
#unison服务端配置文件      

root=/Data/webapps/zabbix-frontend/      
#本地文件夹      
root=ssh://[email protected]//Data/webapps/zabbix-frontend/  (web文件)     
#远程文件夹      
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 = /Data/apps/zabbix-2.4.3/bin/      
#同步指定的子目录及文件,而非整个目录。可以写多个path,如在下面再写一个path = wwwbak。
#ignore = Path WEB-INF/tmp  
#忽略/wwwroot下面的WEB-INF/tmp目录,即同步时不同步它。注意,这里是"Path",而不是"path"。


------------------------------------------------------------------------------------      

   

(2)编写同步脚本

[[email protected] .unison]# vim unison.sh

-----------------------------------------------------------------------------------------------

#/bin/bash     
#2015/6/14      
#
[email protected]
    
dir1="/Data/webapps/zabbix-frontend/"   #需要检测的目录#     
dir2="/Data/apps/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



-------------------------------------------------------------------------------------

   

(3)放后台执行脚本

[[email protected] .unison]# nohup bash /root/.unison/unison.sh &   #放后台,不会因为关闭窗口断开

(4)测试

两边都运行脚本后,即可到同步目录创建文件看看效果了。可以跟踪nohup.out文件查看情况

tailf nohup.out


四、zabbix高可用部署线上并实际运作:

1、修改稿zabbix_agent客户端中zabbix_agentd.conf配置文件中Server=10.3.6.153 ServerActive=10.3.6.153,puppet统一部署客户端。

2、web页面的编辑:(<

以上是关于Zabbix高可用,实现zabbix的无缝切换,无故障时间的主要内容,如果未能解决你的问题,请参考以下文章

zabbix集群使用keepalived的高可用方案

Zabbix_server高可用之文件同步

Zabbix 干货二则:四行shell脚本实现Zabbix_server的高可用等 | 运维进阶

MySQL:MHA实现MySQL主从架构中主服务器的高可用,zabbix完成manager重启

MySQL:MHA实现MySQL主从架构中主服务器的高可用,zabbix完成manager重启

四行shell脚本实现zabbix_server的高可用