keepalived高可用

目录

一.keepalived简介

二.keepalived的重要功能

三.keepalived高可用故障转移的原理

四.keepalived原理

keepalived高可用架构图 

keepalived工作原理描述

五. Keepalived高可用部署

准备工作

第一台与第二台 haproxy DR机 部署 

RS机 部署

keepalived 安装

六.模拟主节点宕机效果

七.配置主节点宕机更换备用节点报警系统

八.部署zabbix报警,主节点宕机


一.keepalived简介

keepalived是一个用于实现高可用性的软件,主要用于在Linux系统上实现服务器的故障转移和负载均衡。它可以监控服务器的状态,并在主服务器出现故障时自动将流量切换到备份服务器,以确保服务的连续性和可用性。

keepalived的工作原理是通过VRRP(Virtual Router Redundancy Protocol)协议实现的。它将多台服务器组成一个虚拟路由器,其中一台服务器作为主服务器,负责处理流量,其他服务器作为备份服务器,监控主服务器的状态。当主服务器出现故障时,备份服务器会接管流量,成为新的主服务器。

除了故障转移,keepalived还支持负载均衡功能。它可以将流量分发到多台服务器上,以提高系统的性能和可扩展性。通过配置权重和调度算法,keepalived可以根据服务器的负载情况智能地分配流量。

总的来说,keepalived是一个简单而强大的工具,可以帮助管理员实现服务器的高可用性和负载均衡。它可以在不影响服务的情况下自动处理服务器故障,并提供可靠的服务。

二.keepalived的重要功能

keepalived具有以下几个重要功能:

  1. 故障转移:keepalived可以监控服务器的状态,当主服务器出现故障时,它可以自动将流量切换到备份服务器上,确保服务的连续性和可用性。

  2. 负载均衡:keepalived可以将流量分发到多台服务器上,以提高系统的性能和可扩展性。它可以根据服务器的负载情况智能地分配流量,并支持配置权重和调度算法。

  3. 健康检查:keepalived可以定期检查服务器的健康状态,例如检测服务器的网络连接、CPU负载、内存使用等。如果某个服务器不健康,keepalived可以将其从负载均衡池中移除,以避免将流量发送到故障的服务器上。

  4. 虚拟路由器:keepalived使用VRRP协议将多台服务器组成一个虚拟路由器。其中一台服务器作为主服务器,负责处理流量,其他服务器作为备份服务器,监控主服务器的状态。当主服务器故障时,备份服务器可以接管流量。

  5. 配置灵活性:keepalived提供了灵活的配置选项,可以根据实际需求进行配置。管理员可以定义故障转移的触发条件、备份服务器的优先级、负载均衡的调度算法等。

这些功能使得keepalived成为一个强大而灵活的工具,可以帮助管理员实现服务器的高可用性和负载均衡。

三.keepalived高可用故障转移的原理

keepalived通过VRRP(Virtual Router Redundancy Protocol)协议实现高可用故障转移。以下是keepalived高可用故障转移的原理:

  1. 主备服务器:keepalived将多台服务器组成一个虚拟路由器,其中一台服务器作为主服务器,其他服务器作为备份服务器。主服务器负责处理流量,备份服务器监控主服务器的状态。

  2. VRRP协议:keepalived使用VRRP协议来实现主备服务器之间的通信和状态同步。VRRP协议定义了主备服务器之间的通信规则和状态转换机制。

  3. 虚拟IP地址:在keepalived配置中,给主备服务器分配了一个虚拟IP地址,该IP地址用于对外提供服务。客户端将流量发送到虚拟IP地址,而不是直接发送到主服务器。

  4. 心跳检测:备份服务器通过发送心跳包来监控主服务器的状态。主服务器定期发送心跳包,备份服务器接收到心跳包后确认主服务器的存活状态。

  5. 故障检测:如果备份服务器在一定时间内没有接收到主服务器的心跳包,就会认为主服务器发生故障。备份服务器会发起一次选举过程,选择一个备份服务器作为新的主服务器。

  6. 虚拟路由器切换:一旦新的主服务器选举出来,备份服务器会将虚拟IP地址绑定到新的主服务器上,然后将流量切换到新的主服务器上处理。

通过这种方式,keepalived可以实现在主服务器故障时自动将流量切换到备份服务器,从而实现高可用性的故障转移。整个过程是自动化的,不需要人工干预,可以保证服务的连续性和可用性。

四.keepalived原理

keepalived高可用架构图 

keepalived工作原理描述

Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:
1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。


2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。


3) VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。


4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。


5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工作原理:

Keepalived高可用是通过 VRRP 进行通信的, VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

在 Keepalived 服务之间,只有作为主的服务器会一直发送 VRRP 广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。

五. Keepalived高可用部署

准备工作

服务机说明服务机名称ip系统
第一台 haproxy DR机H1.example.com192.168.187.128centos8
第二台 haproxy DR机H2.example.com192.168.187.131centos8
第一台 RS机RS1.example.com192.168.187.129centos8
第二台 RS机RS2.example.com192.168.187.140centos8

第一台与第二台 haproxy DR机 部署 

两台haproxy DR机部署一致

# 1.关闭防火墙与selinux
[root@H1 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@H1 ~]# setenforce 0
[root@H1 ~]# sed -i s/SELINUX=.*/SELINUX=disabled/ /etc/selinux/config

# 2.安装依赖
[root@H1 ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel

# 3.创建haproxy用户
[root@H1 ~]# useradd -r -M -s /sbin/nologin haproxy

# 4.下载haproxy软件包
[root@H1 ~]# wget https://www.haproxy.org/download/2.7/src/haproxy-2.7.10.tar.gz
[root@H1 ~]# ls
anaconda-ks.cfg  haproxy-2.7.10.tar.gz
[root@H1 ~]# tar xf haproxy-2.7.10.tar.gz 
[root@H1 ~]# ls
anaconda-ks.cfg  haproxy-2.7.10  haproxy-2.7.10.tar.gz
[root@H1 ~]# cd haproxy-2.7.10
[root@H1 haproxy-2.7.10]# ls
addons    CHANGELOG     doc       INSTALL      Makefile   scripts  tests
admin     CONTRIBUTING  examples  LICENSE      README     src      VERDATE
BRANCHES  dev           include   MAINTAINERS  reg-tests  SUBVERS  VERSION


# 5.编译安装haproxy,详细阅读INSTALL,里面有安装操作
# 清理
[root@H1 haproxy-2.7.10]# make clean

# 编译
[root@H1 haproxy-2.7.10]# make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE=1 USE_SYSTEMD=1


# 安装时指定路径
[root@H1 haproxy-2.7.10]# make install PREFIX=/usr/local/haproxy
[root@H1 haproxy-2.7.10]# cd /usr/local/
[root@H1 local]# ls
bin  etc  games  haproxy  include  lib  lib64  libexec  sbin  share  src
[root@H1 local]# cd haproxy/
[root@H1 haproxy]# ls
doc  sbin  share

# 6.方便启动haproxy,我们给它做一个软链接
[root@H1 haproxy]# ln -s /usr/local/haproxy/sbin/* /usr/sbin/
[root@H1 haproxy]# which haproxy
/usr/sbin/haproxy

# 这样就能找到它了


# 7.配置各个负载的内核参数
[root@H1 haproxy]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>  /etc/sysctl.conf
[root@H1 haproxy]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@H1 haproxy]# sysctl  -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

# 8.使用harpoxy帮助文档
[root@H1 share]# pwd
/usr/local/haproxy/share
[root@H1 share]# ls
man

# 这里有一个man目录,但是目前还使用不了
# 编辑/etc/man_db.conf 文件,将当前路径下的man目录写入进去
MANDATORY_MANPATH                       /usr/local/haproxy/share/man    ---接着22行按照模板写入路径

# 然后就可以用man帮助文档查看haproxy

# 9.创建haproxy目录,写入配置文件
[root@H1 share]# mkdir /etc/haproxy
[root@H1 share]# cd /etc/haproxy
[root@H1 share]# cat > /etc/haproxy/haproxy.cfg <<EOF

#--------------全局配置----------------
global
    log 127.0.0.1 local0  info
    #log loghost local0 info
    maxconn 20480
#chroot /usr/local/haproxy
    pidfile /var/run/haproxy.pid
    #maxconn 4000
    user haproxy
    group haproxy
    daemon
#---------------------------------------------------------------------
#common defaults that all the 'listen' and 'backend' sections will
#use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode http
    log global
    option dontlognull
    option httpclose
    option httplog
    #option forwardfor
    option redispatch
    balance roundrobin
    timeout connect 10s
    timeout client 10s
    timeout server 10s
    timeout check 10s
    maxconn 60000
    retries 3
#--------------统计页面配置------------------
listen admin_stats
    bind 0.0.0.0:8189
    stats enable
    mode http
    log global
    stats uri /haproxy_stats
    stats realm Haproxy\ Statistics
    stats auth admin:admin
    #stats hide-version
    stats admin if TRUE
    stats refresh 30s
#---------------web设置-----------------------
listen webcluster
    bind 0.0.0.0:80
    mode http
    #option httpchk GET /index.html
    log global
    maxconn 3000                      #  --- 监听http80端口,添加上2台RS主机的信息
    balance roundrobin
    cookie SESSION_COOKIE insert indirect nocache
    server RS1 192.168.187.129:80 check inter 2000 fall 5
    server RS2 192.168.187.140:80 check inter 2000 fall 5
    #server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5

EOF

# 10.创建haproxy文件开机自启
[root@H1 haproxy]# cat > /usr/lib/systemd/system/haproxy.service <<EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg   -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg  -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2

[Install]
WantedBy=multi-user.target

EOF

# 11.刷新
[root@H1 haproxy]# systemctl daemon-reload

# 设置开机自启haproxy
[root@H1 haproxy]# systemctl enable --now haproxy
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
[root@H1 haproxy]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process   
LISTEN   0        128              0.0.0.0:22              0.0.0.0:*                
LISTEN   0        2048             0.0.0.0:8189            0.0.0.0:*                
LISTEN   0        2048             0.0.0.0:80              0.0.0.0:*                
LISTEN   0        128                 [::]:22                 [::]:* 

# 80端口和8189端口起来了   

# 12.创建日志并重启rsyslog
[root@H1 haproxy]# vim /etc/rsyslog.conf 
# 在66行local7.* 的前面加上这一行,将haproxy日志添加进去
local0.*                                                /var/log/harpoxy.log
 
# 重启rsyslog
[root@H1 haproxy]# systemctl restart rsyslog

RS机 部署

RS1 机 与 RS2 机 部署一致

# 1.部署httpd
[root@RS1 ~]# yum -y install httpd

# 2.启动httpd启并设置开机自启
[root@RS1 ~]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS1 ~]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process   
LISTEN   0        128              0.0.0.0:22              0.0.0.0:*                
LISTEN   0        511                    *:80                    *:*                
LISTEN   0        128                 [::]:22                 [::]:*   

# 3.往网页文件中写点内容
RS1 机写 "忘情天尊" 
RS2 机写 "玄一大法师"
便于区分 

 这时就可以看到效果了,负载均衡配置完成

keepalived 安装

# 1.两台H DR机都要部署keepalived,我们将H1 DR机作为主节点
# 2.配置epel源
# 安装epel配置包
[root@H1 haproxy]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm

[root@H1 haproxy]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@H1 haproxy]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*


# 3.下载keepalived
[root@H1 ~]# yum list all | grep keepalived
keepalived.x86_64                                                 2.1.5-9.el8                                                       @appstream   
[root@H1 ~]# yum -y install keepalived

# 4.keepalived配置文件说明
keepalived 的主配置文件是 /etc/keepalived/keepalived.conf。其内容如下:

[root@H1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {       //全局配置
   notification_email {     //定义报警收件人邮件地址
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc    //定义报警发件人邮箱
   smtp_server 192.168.200.1    //邮箱服务器地址
   smtp_connect_timeout 30      //定义邮箱超时时间
   router_id LVS_DEVEL          //定义路由标识信息,同局域网内唯一
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {        //定义实例
    state MASTER            //指定keepalived节点的初始状态,可选值为MASTER|BACKUP
    interface eth0          //VRRP实例绑定的网卡接口,用户发送VRRP包
    virtual_router_id 51    //虚拟路由的ID,同一集群要一致
    priority 100            //定义优先级,按优先级来决定主备角色,优先级越大越优先
    nopreempt               //设置不抢占
    advert_int 1            //主备通讯时间间隔
    authentication {        //配置认证
        auth_type PASS      //认证方式,此处为密码
        auth_pass 1111      //同一集群中的keepalived配置里的此处必须一致,推荐使用8位随机数
    }
    virtual_ipaddress {     //配置要使用的VIP地址
        192.168.200.16
    }
}

virtual_server 192.168.200.16 1358 {    //配置虚拟服务器
    delay_loop 6        //健康检查的时间间隔
    lb_algo rr          //lvs调度算法
    lb_kind NAT         //lvs模式
    persistence_timeout 50      //持久化超时时间,单位是秒
    protocol TCP        //4层协议

    sorry_server 192.168.200.200 1358   //定义备用服务器,当所有RS都故障时用sorry_server来响应客户端

    real_server 192.168.200.2 1358 {    //定义真实处理请求的服务器
        weight 1    //给服务器指定权重,默认为1
        HTTP_GET {
            url {
              path /testurl/test.jsp    //指定要检查的URL路径
              digest 640205b7b0fc66c1ea91c463fac6334d   //摘要信息
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3       //连接超时时间
            nb_get_retry 3          //get尝试次数
            delay_before_retry 3    //在尝试之前延迟多长时间
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


# 5.keepalived配置主节点,其它多余文件都用不到,直接删了
[root@H1 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id haproxy01
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 99
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456789
    }
    virtual_ipaddress {
        192.168.187.200
    }
}

virtual_server 192.168.187.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.187.128 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.187.131 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# 启动keepalived服务并设置开机自启
[root@H1 keepalived]# systemctl enable --now keepalived
[root@H1 keepalived]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process   
LISTEN   0        128              0.0.0.0:22              0.0.0.0:*                
LISTEN   0        2048             0.0.0.0:8189            0.0.0.0:*                
LISTEN   0        2048             0.0.0.0:80              0.0.0.0:*                
LISTEN   0        128                 [::]:22                 [::]:*   

# 它是没有端口显示的,但是已经启动了

# 5.备用节点配置
[root@H2 keepalived]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id haproxy02
}

vrrp_instance VI_1 {
    state BACKUP            --- 类型是备用
    interface ens160
    virtual_router_id 99       ---- id一致
    priority 90             --- 比主节点低
    advert_int 1      
    authentication {
        auth_type PASS
        auth_pass 123456789       --- 密码一致
    }
    virtual_ipaddress {
        192.168.187.200
    }
}
                                  --- 剩下的一致
virtual_server 192.168.187.200 80 {        
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.187.128 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.187.131 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# 启动keepalived服务并设置开机自启
[root@H2 keepalived]# systemctl enable --now keepalived
[root@H2 keepalived]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process   
LISTEN   0        128              0.0.0.0:22              0.0.0.0:*                
LISTEN   0        2048             0.0.0.0:8189            0.0.0.0:*                
LISTEN   0        2048             0.0.0.0:80              0.0.0.0:*                
LISTEN   0        128                 [::]:22                 [::]:*   

# 6.查看主节点ip,vip在主节点上
[root@H1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:d8:60:da brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.187.128/24 brd 192.168.187.255 scope global dynamic noprefixroute ens160
       valid_lft 1698sec preferred_lft 1698sec
    inet 192.168.187.200/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fed8:60da/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

# 7.但这时拿vip的ip访问,访问不出来
# 关闭备用节点的haproxy,然后访问vip,就可以访问出页面了

六.模拟主节点宕机效果

1.第一次关闭主节点的keepalived,vip被备用节点抢过去了,可以访问页面

然后开启主节点的keepalived,vip被主节点抢回来了,但是访问不了页面,需要关闭备用节点的haproxy

2.第二次关闭主节点的keepalived,vip被备用节点抢过去了,可以访问页面

然后开启主节点的keepalived,vip被主节点抢回来了,可以访问页面,不需要关闭备用节点的haproxy

之后的主节点宕机,备用节点都会抢占vip并且继续提供转发

然后主节点恢复也会将vip抢占回来,并可以直接提供转发

七.配置主节点宕机更换备用节点报警系统

主节点配置

# 1.编写主节点查询haproxy状态脚本
[root@H1 ~]# mkdir /scripts
[root@H1 ~]# cd /scripts
[root@H1 scripts]# vim check_haproxy.sh  
[root@H1 scripts]# cat check_haproxy.sh 
#! /bin/bash
haproxy_status=$(ps -ef | grep -Ev "grep|$0" | grep haproxy | wc -l)
if [ $haproxy_status -lt 1 ];then
        systemctl stop keepalived
fi
[root@H1 scripts]# chmod +x check_haproxy.sh 

# 2.编辑主节点配置文件如下
! Configuration File for keepalived

global_defs {
   router_id haproxy01
}
vrrp_script haproxy_check {                    ------- 添加执行脚本
    script "/scripts/check_haproxy.sh"         ------ interval 1 执行时间为1s一次
    interval 1
}


vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 99
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456789
    }
    virtual_ipaddress {
        192.168.187.200
    }
    track_script {
        haproxy_check              --------- 添加脚本名称
    }
}

virtual_server 192.168.187.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.187.128 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.187.131 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# 重启keepalived服务
[root@H1 scripts]# systemctl restart keepalived

# 3.测试
# haproxy服务与keepalived服务 现启动状态
[root@H1 scripts]# ss -antl
State                Recv-Q               Send-Q                             Local Address:Port                             Peer Address:Port              Process              
LISTEN               0                    2048                                     0.0.0.0:80                                    0.0.0.0:*                                      
LISTEN               0                    128                                      0.0.0.0:22                                    0.0.0.0:*                                      
LISTEN               0                    2048                                     0.0.0.0:8189                                  0.0.0.0:*                                      
LISTEN               0                    128                                         [::]:22                                       [::]:*                                      
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-10-13 03:04:45 EDT; 1s ago
  Process: 49165 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)

# 关闭haproxy服务,查询keepalived状态
[root@H1 scripts]# systemctl stop haproxy
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Fri 2023-10-13 03:05:14 EDT; 598ms ago
  Process: 49165 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 49166 (code=exited, status=0/SUCCESS)

# haproxy服务关闭之后,脚本自动运行,关闭了keepalived服务

备用节点配置

# 1.创建查询haproxy进行数脚本
[root@H2 ~]# mkdir /scripts
[root@H2 ~]# cd /scripts

[root@H2 scripts]# vim notify.sh 
[root@H2 scripts]# cat notify.sh 
#!/bin/bash
case "$1" in
  master)
        haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
        if [ $nginx_status -lt 1 ];then
            systemctl start haproxy
        fi
  ;;
  backup)
        haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bnginx\b'|wc -l)
        if [ $nginx_status -gt 0 ];then
            systemctl stop haproxy
        fi
  ;;
  *)
        echo "Usage:$0 master|backup VIP"
  ;;
esac

[root@H2 ~]# chmod +x notify.sh

# 2.编辑keepalived配置文件
### 
notify_master
notify_backup
是固定写法
当keepalived高可用连接不到主节点时,执行notify_master
当keepalived高可用恢复连接主节点时,执行notify_backup
      
[root@H2 scripts]# vim /etc/keepalived/keepalived.conf 
[root@H2 scripts]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id haproxy02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 99
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456789
    }
    virtual_ipaddress {
        192.168.187.200
    }  
    notify_master "/scripts/notify.sh master"    ---- 加上两行
    notify_backup "/scripts/notify.sh backup"    master和backup参数执行脚本
}

virtual_server 192.168.187.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.187.128 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.187.131 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

# 重启keepalived服务
[root@H2 scripts]# systemctl restart keepalived

实验效果

手动关闭主节点haproxy服务,模拟宕机

# 1.正常状态
[root@H1 scripts]# ss -antl
State                Recv-Q               Send-Q                             Local Address:Port                             Peer Address:Port              Process              
LISTEN               0                    2048                                     0.0.0.0:80                                    0.0.0.0:*                                      
LISTEN               0                    128                                      0.0.0.0:22                                    0.0.0.0:*                                      
LISTEN               0                    2048                                     0.0.0.0:8189                                  0.0.0.0:*                                      
LISTEN               0                    128                                         [::]:22                                       [::]:*                                      
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-10-13 03:40:16 EDT; 2min 3s ago
  Process: 54030 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)



# 2.关闭主节点haproxy服务
[root@H1 scripts]# systemctl stop haproxy
[root@H1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: deactivating (stop-sigterm) since Fri 2023-10-13 03:42:52 EDT; 581ms ago
  Process: 54030 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)

# haproxy服务关闭了,keepalived服务被执行的脚本关闭

# 3.查看备用节点
[root@H2 scripts]# ip a
......省略
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group 
    inet 192.168.187.200/32 scope global ens160
       valid_lft forever preferred_lft forever
......省略

[root@H2 scripts]# ss -antl
State                Recv-Q               Send-Q                             Local Address:Port                             Peer Address:Port              Process              
LISTEN               0                    2048                                     0.0.0.0:80                                    0.0.0.0:*                                      
LISTEN               0                    128                                      0.0.0.0:22                                    0.0.0.0:*                                      
LISTEN               0                    2048                                     0.0.0.0:8189                                  0.0.0.0:*                                                                         
LISTEN               0                    128                                         [::]:22                                       [::]:*      

# vip出来了,haproxy服务端口号出来了

# 4.恢复主节点
[root@H1 scripts]# systemctl start haproxy
[root@H1 scripts]# systemctl start keepalived

# vip回来了
[root@H1 scripts]# ip a
......省略
       valid_lft 1540sec preferred_lft 1540sec
    inet 192.168.187.200/32 scope global ens160
......省略

# 5.备用节点haproxy服务自动关闭了
[root@H2 scripts]# ss -antl
State                Recv-Q               Send-Q                             Local Address:Port                             Peer Address:Port              Process              
LISTEN               0                    128                                      0.0.0.0:22                                    0.0.0.0:*                                      
LISTEN               0                    80                                       0.0.0.0:3306                                  0.0.0.0:*                                      
LISTEN               0                    128                                         [::]:22                                       [::]:*                                      
[root@H2 scripts]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Fri 2023-10-13 03:46:23 EDT; 53min ago
  Process: 52655 ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid (code=exited, status=0/SUCCESS)

八.部署zabbix报警,主节点宕机

实验准备

zabbix机ip系统
zabbix服务机192.168.187.134centos8
zabbix用户机(H2 DR机)192.168.187.131centos8

实验说明

部署一台zabbix服务机 zabbix_server

在H1 DR机上部署zabbix_agentd

通过监控 H1 DR机 上vip是否存在来判断主节点是否宕机

zabbix服务部署博客

我这里zabbix_server已经部署完成,详情参考博客

zabbix_agentd部署

# 1.我们在zabbix官网上下载zabbix_agent服务软件包
[root@H1 ~]# wget wget https://cdn.zabbix.com/zabbix/sources/stable/6.4/zabbix-6.4.6.tar.gz
[root@H1 ~]# tar xf zabbix-6.4.6.tar.gz 
[root@H1 ~]# ls
anaconda-ks.cfg  haproxy-2.7.10  haproxy-2.7.10.tar.gz  zabbix-6.4.6.tar.gz zabbix-6.4.6

# 创建zabbix组与用户
[root@H1 ~]# groupadd --system zabbix
[root@H1 ~]# useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix


# 2.安装依赖
[root@H1 ~]# yum -y install gcc gcc-c++ make pcre-devel

# 3.编译
[root@H1 zabbix-6.4.6]# ./configure --enable-agent
***********************************************************
*            Now run 'make install'                       *
*                                                         *
*            Thank you for using Zabbix!                  *
*              <http://www.zabbix.com>                    *
***********************************************************

# 立刻make install
[root@H1 zabbix-6.4.6]# make install

# 4.安装完成后可以在/usr/local/etc下看到agent的主配置文件
[root@H1 zabbix-6.4.6]# cd /usr/local/etc
[root@H1 etc]# ls
zabbix_agentd.conf  zabbix_agentd.conf.d

# 编辑主配置文件
[root@H1 etc]# vim zabbix_agentd.conf

Server=192.168.187.134               # 指定zabbix服务端的ip
ServerActive=192.168.187.134         # 指定zabbix服务端的ip
Hostname=H1            # 自定义命名,以后在服务端用这个名字来连接这台主机

# 查看端口10050
[root@H1 etc]# zabbix_agentd
[root@H1 etc]# ss -antl
State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process   
LISTEN   0        128              0.0.0.0:22              0.0.0.0:*                
LISTEN   0        128              0.0.0.0:10050           0.0.0.0:*                
LISTEN   0        128                 [::]:22                 [::]:*   

zabbix控制机部署监控

编写脚本

# 1.编写脚本
[root@H1 ~]# mkdir /666
[root@H1 ~]# cd /666
[root@H2 666]# vim ip.sh 
[root@H2 666]# cat ip.sh 
#! /bin/bash
if [ `ip a | grep 192.168.187.200|wc -l` == 0 ];then
        echo "1"
else
        echo "0"
fi
[root@H1 scripts]# chmod +x ip.sh


# 2.在zabbix_agentd主配置文件中编写(这里直接写到最后面)
# 格式: #UserParameter=<key>,<shell command> 自定义键名加上脚本名
[root@H1 666]# vim /usr/local/etc/zabbix_agentd.conf
[root@H1 666]# tail -n1 /usr/local/etc/zabbix_agentd.conf
UserParameter=ip_vip,/bin/bash /666/ip.sh

# 重启zabbix_agentd服务
[root@H1 system]# pkill zabbix_agentd
[root@H1 system]# zabbix_agentd

# 3.在zabbix服务端测试
[root@c83 ~]# zabbix_get -s 192.168.187.128 -k ip_vip
1
# 因为这个时候我的主节点的haproxy服务是关闭的,所以192.168.187.200的ip,echo出一个1,表示错误

配置监控项

自定义触发规则

因为主节点的haproxy服务已经庇,所以30s会触发报警

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值