暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

案例|某电商如何构建Zabbix高可用监控平台?

Zabbix开源社区 2021-02-25
126

感谢作者杨惠供稿!

杨惠

  • 就职于某知名电商公司,从事于互联网基础架构领域相关工作,负责公司容器云、私有云、Hadoop基础架构方面工作。

  • 对开源系统、网络、集群、数据库、分布式存储等方面有丰富的实践经验。云栈社区CSTC初创成员。

【背景】由于公司业务环境Zabbix监控平台架构,无论在性能、稳定性还是版本升级方面都存在很大困难。本文将介绍通过Centos7.7 + Keepalive + Zabbix + DRBD + Heartbeat + MySQES-Cluster 方案,来构建Zabbix的高可用集群环境。


 01 方案架构

方案:Centos7.7+Keepalive+Zabbix+DRBD+Heartbeat+MySQL+ES-Cluste



 02 环境初始化

环境信息


初始化

  • 2节点ssh互通做免密认证

      Zabbix-HA1节点执行 ssh-keygen  -q -t rsa -N '' -f ~/.ssh/id_rsa ssh-copy-id -p36091 root@192.168.8.187


  • 双节点做基于主机名解析,分别执行

         cat > /etc/hosts << EOF 

            192.168.8.186 Zabbix-HA1 

            192.168.8.187 Zabbix-HA2 

          EOF

  • 所有节点都关闭swap

         swapoff -a # 临时手动关闭

         永久关闭swap ,注释掉/ etc/fstab 中swap ,重启机器

  • 网络环境设定

          每个主机分别带有两块以太网卡,其中一块用于网络通信,另一块用于心跳功能。

          两个节点的网络设置如下:

         Zabbix-HA1 主节点

           eth0: 192.168.8.86 255.255.0.0    #对外IP地址

           eth1: 172.16.38.1   255.255.255.0 #HA心跳使用地址

           Zabbix-HA2 从节点

           eth0: 192.168.8.86 255.255.0.0    #对外IP地址

           eth1: 172.16.38.2.  255.255.255.0 #HA心跳使用地址

  • 配置heartbeat 防火墙规则

      Zabbix-HA1 节点加入Zabbix-HA2 节点上heartbeat 心跳IP和udp 端口防火墙规则
      iptables -A INPUT -i eth1 -p udp -s 172.16.38.2 --dport 694 -m comment --comment "heartbeat-slave" -j ACCEPT
      /usr/libexec/iptables/iptables.init save
      Zabbix-HA2 节点加入Zabbix-HA1 节点上heartbeat 心跳IP和udp 端口防火墙规则
      iptables -A INPUT -i eth1 -p udp -s 172.16.38.1 --dport 694 -m comment --comment "heartbeat-master" -j ACCEPT
      /usr/libexec/iptables/iptables.init save
    • 时间同步时间同步(zabbix-ha1 和zabbix-ha2 都要执行) 

        yum -y install rdate
        rdate -s time-b.nist.gov

       03 安装配置DRBD

      DRBD安装

        安装drbd9
        rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
        rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm yum install -y drbd90-utils kmod-drbd90


        配置drbd内核模块开机自动启动
        echo drbd > etc/modules-load.d/drbd.conf
        手动启动drbd内核模块modprobe drbd lsmod|grep drbd
        ps:不管是单独硬盘、普通分区、lvm,drbd需要的是干净的分区,不要格式化.


        配置drbd
        移除默认配置
        mv /etc/drbd.d/global_common.conf etc/drbd.d/global_common.confbak创建全局配置
        cat << EOF > etc/drbd.d/global_common.conf
        global {
        usage-count no;
        }
        common { net { protocol C;
        }
        }
        EOF


        创建资源配置文件
        cat << EOF > etc/drbd.d/drbd0.res
        resource drbd0 { disk dev/sdb;
        device /dev/drbd0; meta-disk internal; on Zabbix-HA1 {
        address 192.168.8.186:7789;
        }
        on Zabbix-HA2 {
        address 192.168.8.187:7789;
        }
        }
        EOF
        ps:根据实际情况修改上面配置中的主机名、IP、和disk为自己的具体配置

        节点配置


          Zabbix-HA1节点操作初始化设备元文件
          drbdadm create-md drbd0启动drbd0资源
          drbdadm up drbd0


          Zabbix-HA2节点操作初始化设备元文件
          drbdadm create-md drbd0启动drbd0资源
          drbdadm up drbd0


          在Zabbix-HA1节点,指定为主drbdadm primary --force drbd0


          在DRBD主节点上将drbd0块设备格式化,系统文件格式为xfs mkfs.xfs dev/drbd0


          Zabbix-HA1节点上传drbd-overview维护工具到/usr/sbin目录下,并赋权chmod +x usr/sbin/drbd-overview
          复制到Zabbix-HA2节点/usr/sbin目录下
          scp -P36091 usr/sbin/drbd-overview 192.168.8.187:/usr/sbin/


          分别查看两个节点上drbd0的主副角色 drbdadm role drbd0


          查看drbd同步运行状态cat proc/drbd
          or
          drbd-overview
          0:drbd0/0 Connected Primary/Secondary UpToDate/UpToDate


          配置2个节点开机自动drbd服务systemctl enable drbd systemctl start drbd

           04 安装配置Heartbeat

          安装Heartbeat

            下载heartbeat 依赖环境包
            cd usr/src
            wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2 wget http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2
            wget https://github.com/ ClusterLabs/resource-agents/archive/v3.9.6.tar.gz安装相关依赖库
            yum -y install gcc gcc-c++ autoconf automake libtool glib2-devel libxml2-devel bzip2 bzip2-devel e2fsprogs-devel libxslt-devel libtool-ltdl-devel asciidoc psmisc创建运行heartbeat 组及用户
            groupadd haclient
            useradd -g haclient hacluster -s sbin/nologin




            部署heartbeat 编译安装依赖环境安装cluster-glue
            cd usr/src
            tar -jxvf 0a7add1d9996.tar.bz2
            cd Reusable-Cluster-Components-glue--0a7add1d9996/
            ./autogen.sh
            ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1' make && make install


            安装resource-agents
            tar -zxvf v3.9.6.tar.gz
            cd resource-agents-3.9.6
            ./autogen.sh
            ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1' make && make install


            安装heartbeat
            tar -jxvf 958e11be8686.tar.bz2
            cd Heartbeat-3-0-958e11be8686/
            ./bootstrap


            声明编译环境变量
            export CFLAGS="$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib"
            ./configure --prefix=/usr/local/heartbeat --with-daemon-user=hacluster --with-daemon-group=haclient --enable-fatal-warnings=no LIBS='/lib64/libuuid.so.1' make && make install


            复制heartbeat 核心配置文件
            cp doc/{ha.cf,haresources,authkeys} usr/local/heartbeat/etc/ha.d/授权认证文件600权限
            chmod 600 usr/local/heartbeat/etc/ha.d/authkeys创建目录,配置网卡支持插件文件
            mkdir -p usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/
            cp usr/lib/ocf/lib/heartbeat/ocf-* usr/local/heartbeat/usr/lib/ocf/lib/heartbeat/


            注:一般启动时会报错因为ping 和ucast 这些配置都需要插件支持,需要将lib64下面的插件软连接到lib目录才不会抛出异常 ln -svf usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* usr/local/heartbeat/lib/heartbeat/ plugins/RAExec/
            ln -svf usr/local/heartbeat/lib64/heartbeat/plugins/* usr/local/heartbeat/lib/heartbeat/plugins/


            Heartbeat配置
            sed -i 's/#auth 1/auth 1/g' usr/local/heartbeat/etc/ha.d/authkeys
            sed -i 's/#1 crc/1 crc/g' usr/local/heartbeat/etc/ha.d/authkeys


            2个节点分别复制drbd服务drbddisk脚本到heartbeat目录(编译安装heartbeat,默认没有该脚本),实现DRBD主从节点资源组的挂载和卸载 cp -p /etc/ha.d/resource.d/drbddisk /usr/local/heartbeat/etc/ha.d/resource.d/


            配置haresources资源文件,用于指定双机系统的主节点、 VIP、子网掩码、广播地址及启动的服务等集群资源设置Zabbix-HA1为主从节点角色中为主节点,同时2节点分别执行
            echo 'Zabbix-HA1 IPaddr::192.168.8.4/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/opt::xfs' >> usr/local/heartbeat/etc/ha.d/haresources
            注:drbd0为drbd创建资源名称,一定要与其一致,否则无法用drbddisk脚本实现DRBD主从节点资源组的挂载和卸载

            节点配置Heartbeat

              分别在2节点配置heartbeat的主配置文件ha.cf
              mv usr/local/heartbeat/etc/ha.d/ha.cf usr/local/heartbeat/etc/ha.d/ha.cfbak Zabbix-HA1节点执行
              cat > usr/local/heartbeat/etc/ha.d/ha.cf <<EOF
              debugfile var/log/ha-debug.log logfile var/log/heartbeat.log ucast eth1 172.16.38.2
              keepalive 2
              warntime 6
              deadtime 10
              initdead 120
              udpport 694 auto_failback off node Zabbix-HA1 node Zabbix-HA2 ping 192.168.8.1
              respawn hacluster usr/local/heartbeat/libexec/heartbeat/ipfail apiauth ipfail gid=haclient uid=hacluster
              EOF




              Zabbix-HA2节点执行
              cat > usr/local/heartbeat/etc/ha.d/ha.cf <<EOF
              debugfile var/log/ha-debug.log logfile var/log/heartbeat.log ucast eth1 172.16.38.1
              keepalive 2
              warntime 6
              deadtime 10
              initdead 120
              udpport 694 auto_failback off node Zabbix-HA1 node Zabbix-HA2 ping 192.168.8.1
              respawn hacluster usr/local/heartbeat/libexec/heartbeat/ipfail apiauth ipfail gid=haclient uid=hacluster
              EOF
              注:ucast eth1参数中配置IP地址为对方节点的心跳IP,否则heartbeat无法进行心跳检测和服务故障切换


              两机器启动heartbeat服务systemctl enable heartbeat
              systemctl start heartbeat #重点:heartbeat开机启动顺序,先主节点启动,后从节点启动 systemctl stop heartbeat #实现主从节点之间切换及VIP漂移


              查看端口号
              netstat -anup|grep 694

              05 配置MySQL高可用

                从节点停止zabbix-server服务和禁止开机自启动
                systemctl stop zabbix-server && systemctl disable zabbix-server


                从节点移除zabbix程序和web
                mkdir -p data/backup && mv opt/zabbix/ data/backup && mv /opt/www_zabbix /data/backup/


                主节点禁用zabbix-server服务开机自启动,服务由heartbeat托管systemctl disable zabbix-server


                主节点都执行以下操作
                heartbeat接管zabbix-server服务启动停止
                cat > /usr/local/heartbeat/etc/ha.d/resource.d/zabbix-server <<EOF #!/bin/bash


                PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH


                case "$1" in start)
                systemctl start zabbix-server
                ;;
                stop)
                systemctl stop zabbix-server
                ;;
                esac exit 0 EOF


                赋予执行权限
                chmod +x /usr/local/heartbeat/etc/ha.d/resource.d/zabbix-server


                脚本拷贝到从节点
                scp -P36091 -p /usr/local/heartbeat/etc/ha.d/resource.d/zabbix-server 192.168.8.187:/usr/local/heartbeat/etc/ha.d/resource.d


                把zabbix-server脚本名称放入haresources文件中vim /usr/local/heartbeat/etc/ha.d/haresources
                Zabbix-HA1 IPaddr::192.168.8.4/24/eth0 drbddisk::drbd0 Filesystem::/dev/drbd0::/opt::xfs zabbix-server


                Zabbix-HA1主节点拷贝到Zabbix-HA2从节点
                scp -P36091 /usr/local/heartbeat/etc/ha.d/haresources 192.168.8.187:/usr/local/heartbeat/ etc/ha.d/


                防止mysql开机启动优先于禁用大页服务,导致tokudb 引擎加载失败(2个节点都要设置) systemctl disable mysql
                echo 'systemctl start mysql' >> /etc/rc.local
                echo 'systemctl start keepalived' >> /etc/rc.local

                06 配置数据库双主同步

                  Zabbix-HA2节点备份zabbix相关配置表(有VIP地址节点导出)
                  注:拷贝sql文件到Zabbix-HA1节点,导入sql


                  Zabbix-HA1节点配置my.cnf 忽略要同步的历史大表
                  ############Open GTID Mode#########
                  gtid_mode = on enforce_gtid_consistency =true log_slave_updates=true
                  master-info-repository=TABLE relay-log-info-repository=TABLE slave-parallel-workers=4
                  ###########MySQL AB Replication##########
                  relay-log = /data/mysql/relay-log auto-increment-increment = 2
                  auto-increment-offset = 1
                  replicate-wild-ignore-table=zabbix.history replicate-wild-ignore-table=zabbix.history_uint replicate-wild-ignore-table=zabbix.history_str replicate-wild-ignore-table=zabbix.history_log replicate-wild-ignore-table=zabbix.history_text


                  Zabbix-HA2节点配置my.cnf
                  ############Open GTID Mode#########
                  gtid_mode = on enforce_gtid_consistency =true log_slave_updates=true
                  master-info-repository=TABLE relay-log-info-repository=TABLE slave-parallel-workers=4
                  ###########MySQL AB Replication##########
                  relay-log = /data/mysql/relay-log auto-increment-increment = 2
                  auto-increment-offset = 2
                  replicate-wild-ignore-table=zabbix.history replicate-wild-ignore-table=zabbix.history_uint replicate-wild-ignore-table=zabbix.history_str replicate-wild-ignore-table=zabbix.history_log replicate-wild-ignore-table=zabbix.history_text
                  注:主从复制各个实例server-id必须唯一,分别重启mysql服务生效


                  分别在2个主节点上设置主从复制
                  在Zabbix-HA1节点和Zabbix-HA2节点上分别创建具有复制权限的用户
                  grant replication slave on *.* to repl@'192.168.8.%' identified by 'yanghui';
                  flush privileges;


                  Zabbix-HA1节点授权允许Zabbix-HA2同步相关的表,才能开启start slave;)
                  change master to master_host='192.168.8.187',master_user='repl',master_password='yanghui',master_auto_position=1;
                  flush privileges;


                  Zabbix-HA2节点授权(允许从Zabbix-HA1同步相关的表,才能开启start slave;)
                  change master to master_host='192.168.8.186',master_user='repl',master_password='yanghui',master_auto_position=1;
                  flush privileges;


                  双节点分别授权允许通过VIP地址远程登陆MySQL Zabbix-HA1节点节点执行(8.186)
                  grant all on *.* to root@'192.168.8.187' identified by 'Zabbix@2021'; select user,host,password from mysql.user;


                  Zabbix-HA2节点执行(8.187)
                  grant all on *.* to root@'192.168.8.186' identified by 'Zabbix@2021'; select user,host,password from mysql.user;


                  分别登陆MySQL主从节点启动主从复制start slave;
                  show slave status\G;


                  drbd挂载的节点更改zabbix-web的IP地址为VIP地址
                  /opt/www_zabbix/conf/zabbix.conf.php
                  sed -i 's/192.168.8.186/192.168.8.5/g' /opt/www_zabbix/conf/zabbix.conf.php sed -i 's/192.168.8.186/192.168.8.5/g ' /opt/zabbix/etc/zabbix/zabbix_server.conf注:表示绿色为宿主机节点IP,红色为数据库的VIP,需重启zabbix-server服务

                  07 测试验证


                  • 测试HA架构方案-服务主节点VIP漂移

                          测试Zabbix-Server + DRBD +heartbeat HA

                          systemctl restart heartbeat

                          #观察从节点是否接管Zabbix-Server VIP地址,并且服务是否正常运行

                         注:Zabbix-HA1节点第1次切换到Zabbix-HA2节点后,zabbix-server没有正常启动,需systemctl restart zabbix-server,后续切换就能自动启动。

                  • 测试mysql + keepalived HA

                          systemctl stop mysql

                          #观察从节点是否接管MySQL VIP地址,并且服务是否正常运行

                          注:故障节点服务切换后,修复该节点服务后,需手动启动keepalived服务来继续监听对方节点,形成HA机制

                  08 完善方案

                    keepalived+mysql HA方案完善补充缘由:
                    使用脚本和定时任务监测keepalived 服务运行状态,实现mysql 故障切换后,keepalived 通过后台定时任务实现自动恢复服务。


                    keepalived脚本分别放到2个节点的/etc/keepalived目录
                    echo '*/2 * * * * root /etc/keepalived/monitor-keepalived.sh' >> /etc/crontab systemctl restart crond
                    注:修改定时任务调用脚本后,一定要重启crond任务才会生效


                    heartbeat+zabbix HA方案完善补充缘由:
                    heartbeat本身不对应用服务状态做判断,需要编写脚本来判断服务异常,弥补该架构的不足。


                    部署supervisor
                    yum install -y supervisor
                    mkdir -p /etc/supervisor/config.d
                    echo_supervisord_conf > /etc/supervisor/supervisord.conf


                    配置supervisord主配置文件
                    cat >> /etc/supervisor/supervisord.conf <<EOF [include]
                    files = /etc/supervisor/config.d/*.ini EOF


                    配置监视zabbix-server进程
                    cat > /etc/supervisor/config.d/zabbix-server.ini <<EOF [program:zabbix-heartbeat]
                    user=root
                    directory= /etc/supervisor
                    command= /bin/sh /etc/supervisor/heartbeat.sh numprocs=1
                    autostart=true autorestart=true startretries=3 EOF


                    启动supervisord服务
                    systemctl enable supervisord && systemctl start supervisord && systemctl status supervisord


                    补充:heartbeat编译参数注解:
                    vim /usr/local/heartbeat/etc/ha.d/ha.cf
                    debugfile /var/log/ha-debug ##用于记录heartbeat的调试信息
                    logfile/var/log/ha-log ##用于记录heartbeat的日志信息
                    logfacilitylocal0 ##设置heartbeat的日志,这里用的是系统日志
                    keepalive 2 ##设定心跳(监测)时间时间为2秒
                    deadtime 30 ##指定若备用节点在30秒内未收到主节点心跳信号,则接管主服务器资源
                    warntime 10 ##指定心跳延迟的时间为10秒,10秒内备节点不能接收主节点心跳信号,即往日志写入警告日志,但不会切换服务
                    initdead 60 ##系统启动或重启后预留的忽略时间段,取值至少为deadtime的两倍
                    udpport 694 ##广播/单播通讯使用的Udp端口
                    #bcast ens32 ##使用网卡eno32发送心跳检测
                    #mcast eth0 225.0.0.1 694 1 0 ##采用网卡eth0的Udp多播来组织心跳,一般在备用节点
                    ucast ens32 192.168.1.64


                    ##采用网卡eth32的udp单播来组织心跳,后面跟的IP地址为双机对方IP地址
                    auto_failback on  ##定义当主节点恢复后,是否将服务自动切回,争抢VIP地址
                    node xuegod63.cn node xuegod64.cn ping 192.168.1.1


                    ##主节点名称##备用节点名称
                    ##通过ping网关检测心跳是否正常,仅用来测试网络


                    apiauth ipfail gid=haclient uid=hacluster ##设置启动IPfail的用户和组
                    respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail ##指定和heartbeat一起启动、关闭的进程注:Bcast、ucast和mcast分别代表广播、单播和多播,是组织心跳的的方式,任选其一

                    08 总结

                    优点:

                    • 安全性高、稳定性高、可用性高,出现故障自动切换

                    缺点:

                    • 只有一台服务器提供服务,成本相对较高,不方便扩展,可能会发生脑裂

                    • 当zabbix 服务挂掉或者不可用的情况下不能进行自动切换,需要通过的脚本实现(比如shell脚本监测到master 的zabbix 不可用就将主节点上的heartbeat 停掉,这样就会切换到从节点去)

                    危险操作:

                    • 不能在主从节点停止drbd服务, systemctl stop drbd会造成DRBD脑裂,主从节点数据不一致

                    • 手动启停MySQL服务只能通过systemctl statt/stop mysql操作,禁止使用/etc/init.d/mysqld stop/start操作,防止MySQL PID异常,服务不可用

                    09 FAQ

                    • 故障现象:当DRBD出现脑裂后,会导致drbd 主从两边的磁盘数据不一致,从节点上切换成secondary ,并放弃该资源的数据从节点执行以下命令:

                            drbdadm secondary r0

                            drbdadm --discard-my-data connect r0

                    • 故障现象:primary 主节点重新连接secondary (如果这个节点当前的连接状态为WFConnection 的话)主节点执行以下命令:drbdadm connect r0

                    • 故障现象:# drbdadm create-md r0 'r0' not defined in your config (for this host).原因:

                            A. 主机名与资源池(*.res) 中配置定义主机名不一致导致

                            B. 资源池(*.res) 中配置定义资源池名字与资源池(*.res) 不一致导致 

                            解决方法:统一名称或者主机名即可。


                    点击报名

                    2021年Zabbix新增“为期1天的线上专题培训”,助你解决具体的技术问题,提高工作效率!


                    Zabbix预处理从3.0版本开始独成一块,并且随着Zabbix每次版本升级都有较大提升,从支持JSON/XML Path,到Prometheus agent,以及Javascript,连Zabbix CEO Alexei也说预处理是the sky in the limit。所以掌握了预处理就可以节省大量开发脚本的时间,并且可以完成之前不能实现的功能。点击链接查看课程大纲。


                    首场线上专题培训立减500元,名额有限,先到先得。欢迎联系小Z:17502189550(微信同号)。


                    Zabbix开源社区

                    干货满满

                    加入交流群

                    3000+用户已加入

                    文章转载自Zabbix开源社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论