keeplaived实现haproxy高可用

名称 IP
node1(haproxy,keepalived) 192.168.6.152
node2  (haproxy,keepalived) 192.168.6.153
RS1 192.168.6.135
RS2 192.168.6.154
 
# 在Rs1,Rs2下载nginx写一个网页文件
[root@rs1 ~]# dnf -y install nginx
[root@rs1 ~]# echo 'rs1' > /usr/share/nginx/html/index.html
[root@rs1 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.


[root@rs2 ~]# dnf -y install nginx
[root@rs2 ~]# echo 'rs2' > /usr/share/nginx/html/index.html
[root@rs2 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

node1安装haproxy及配置

#下载haproxy
[root@node1 ~]# ls
anaconda-ks.cfg  haproxy-2.6.0.tar.gz
#安装依赖包
[root@node1 ~]# yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel
#创建用户
[root@node1 ~]# useradd -r -M -s /sbin/nologin haproxy
[root@node1 ~]# id haproxy
uid=994(haproxy) gid=991(haproxy) groups=991(haproxy)
#解压
[root@node1 ~]# tar xf haproxy-2.6.0.tar.gz
[root@node1 ~]# ls
anaconda-ks.cfg  haproxy-2.6.0  haproxy-2.6.0.tar.gz
[root@node1 ~]# cd haproxy-2.6.0
[root@node1 haproxy-2.6.0]# ls
addons     CONTRIBUTING  include      Makefile   src      VERSION
admin      dev           INSTALL      README     SUBVERS
BRANCHES   doc           LICENSE      reg-tests  tests
CHANGELOG  examples      MAINTAINERS  scripts    VERDATE
#编译并安装
[root@ haproxy-2.6.0]# make -j $(grep 'processor' /proc/cpuinfo |wc -l)  \
> TARGET=linux-glibc  \
> USE_OPENSSL=1  \
> USE_ZLIB=1  \
> USE_PCRE=1  \
> USE_SYSTEMD=1
[root@node1 haproxy-2.6.0]# make install PREFIX=/usr/local/haproxy
# 做软连接或者设置环境变量都可以
[root@node1 haproxy-2.6.0]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
#配置各个负载的内核参数
[root@node1 haproxy-2.6.0]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1 #ip绑定功能打开,绑定一个非本地ip防止报错
net.ipv4.ip_forward = 1   #ip转发的功能打开

# 生效
[root@node1 haproxy-2.6.0]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
#提供配置文件
[root@node1 ~]# mkdir /etc/haproxy
[root@haproxy haproxy]# cat > /etc/haproxy/haproxy.cfg <<EOF
 #--------------全局配置----------------
 global
     log 127.0.0.1 local0  info  # 日志放在这个local0
     #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   #代理的http协议
     log global
     option dontlognull    #不记录空日志
     option httpclose
     option httplog
     #option forwardfor    #转发的 
     option redispatch       #打包的
     balance roundrobin      #算法    rr轮询模式
     timeout connect 10s   #链接超时时间10秒
     timeout client 10s       #客户端超时时间10秒
     timeout server 10s      #服务端超时时间10ian
     timeout check 10s       #检查超时时间10秒
     maxconn 60000           # 最大连接数
     retries 3                      #重试次数
 #--------------统计页面配置------------------
 listen admin_stats      #管理界面
     bind 0.0.0.0:8189    #绑定在8189的端口号上
     stats enable             #状态
     mode http                #模式是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                 #30秒刷新一下
 #---------------web设置-----------------------
 listen webcluster   #集群
     bind 0.0.0.0:80    #80端口号
     mode http            #用到http协议
     #option httpchk GET /index.html     
     log global
     maxconn 3000    #最大连接数
     balance roundrobin    #算法是
     cookie SESSION_COOKIE insert indirect nocache
        server web01 192.168.6,135:80 check inter 2000 fall 5
        server web02 192.168.6.154:80 check inter 2000 fall 5
     #server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5> EOF

haproxy.service文件编写

[root@node1 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 $MAINPID
>
> [Install]
> WantedBy=multi-user.target
> EOF

[root@node1 haproxy]# systemctl daemon-reload

启用日志

[root@node1 ~]# vi /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local0.*                                                /var/log/haproxy.log   #加入此行
[root@node1 ~]# systemctl restart rsyslog   #  #重启这个服务

启动服务

[root@node1 ~]# systemctl restart haproxy
[root@node1 ~]# ss -antl
State     Recv-Q    Send-Q       Local Address:Port         Peer Address:Port    Process
LISTEN    0         128                0.0.0.0:8189              0.0.0.0:*
LISTEN    0         128                0.0.0.0:80                0.0.0.0:*
LISTEN    0         128                0.0.0.0:22                0.0.0.0:*
LISTEN    0         128                   [::]:22                   [::]:*

node2安装haproxy及配置

[root@node2 ~]# ls
anaconda-ks.cfg  haproxy-2.6.0.tar.gz
[root@node2 ~]# useradd -r -M -s /sbin/nologin haproxy
[root@node2 ~]# id haproxy
uid=993(haproxy) gid=990(haproxy) groups=990(haproxy)
[root@node2 ~]# dnf -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel
[root@node2 ~]# tar xf haproxy-2.6.0.tar.gz
[root@node2 ~]# ls
anaconda-ks.cfg  haproxy-2.6.0  haproxy-2.6.0.tar.gz
[root@node2 ~]# cd haproxy-2.6.0
[root@node2 haproxy-2.6.0]# ls
addons    CHANGELOG     doc       INSTALL      Makefile   scripts  tests
admin     CONTRIBUTING  examples  LICENSE      README     src      VERDATE
BRANCHES  dev           include   MAINTAINERS  reg-tests  SUBVERS  VERSION
[root@node2 haproxy-2.6.0]#    make -j $(grep 'processor' /proc/cpuinfo |wc -l)  \
TARGET=linux-glibc  \
USE_OPENSSL=1  \
USE_ZLIB=1  \
USE_PCRE=1  \
USE_SYSTEMD=1
[root@node2 haproxy-2.6.0]# make install PREFIX=/usr/local/haproxy

[root@node2 haproxy-2.6.0]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
#配置各个负载的内核参数
[root@node2 haproxy-2.6.0]# vi /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
[root@node2 haproxy-2.6.0]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
#提供配置文件
#创建目录
[root@node2 ~]# mkdir /etc/haproxy
[root@node2 ~]# cd /etc/haproxy/
[root@node2 haproxy]# cat > /etc/haproxy/haproxy.cfg <<EOF
> #--------------全局配置----------------
> global
>     log 127.0.0.1 local0  info  # 日志放在这个local0
>     #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   #代理的http协议
>     log global
>     option dontlognull    #不记录空日志
>     option httpclose
>     option httplog
>     #option forwardfor    #转发的 
>     option redispatch       #打包的
>     balance roundrobin      #算法    rr轮询模式
>     timeout connect 10s   #链接超时时间10秒
>     timeout client 10s       #客户端超时时间10秒
>     timeout server 10s      #服务端超时时间10ian
>     timeout check 10s       #检查超时时间10秒
>     maxconn 60000           # 最大连接数
>     retries 3                      #重试次数
> #--------------统计页面配置------------------
> listen admin_stats      #管理界面
>     bind 0.0.0.0:8189    #绑定在8189的端口号上
>     stats enable             #状态
>     mode http                #模式是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                 #30秒刷新一下
> #---------------web设置-----------------------
> listen webcluster   #集群
>     bind 0.0.0.0:80    #80端口号
>     mode http            #用到http协议
>     #option httpchk GET /index.html     
>     log global
>     maxconn 3000    #最大连接数
>     balance roundrobin    #算法是
     cookie SESSION_COOKIE insert indirect nocache
        server web01 192.168.6,142:80 check inter 2000 fall 5
        server web02 192.168.6.200:80 check inter 2000 fall 5
     #server web01 192.168.80.102:80 cookie web01 check inter 2000 fall 5> EOF

haproxy.service文件编写

[root@node2 haproxy]# vi /usr/lib/systemd/system/haproxy.service
[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 $MAINPID

[Install]
WantedBy=multi-user.target

[root@node2 haproxy]# systemctl daemon-reload

启用日志

[root@node2 haproxy]# vi /etc/rsyslog.conf   #加入下面内容
local0.*                                                /var/log/haproxy.log
[root@node2 haproxy]# systemctl restart rsyslog  #重启这个服务

启动服务

[root@node2 ~]# systemctl restart haproxy
[root@node2 ~]# ss -antl
State     Recv-Q    Send-Q       Local Address:Port         Peer Address:Port    Process
LISTEN    0         128                0.0.0.0:8189              0.0.0.0:*
LISTEN    0         128                0.0.0.0:80                0.0.0.0:*
LISTEN    0         128                0.0.0.0:22                0.0.0.0:*
LISTEN    0         128                   [::]:22                   [::]:*

 

下载keepalived配置主keepalived

[root@node1 ~]# dnf -y install keepalived   # 下载
[root@node1 ~]# cd /etc/keepalived/    
[root@node1 keepalived]# ls
keepalived.conf
[root@node1 keepalived]# cp keepalived.conf keepalived.conf123  #复制一个原本默认的配置文件修改名字备份一下
[root@node1 keepalived]# > keepalived.conf   #内容清空
[root@node1 keepalived]# vim keepalived.conf   #编辑主配置文件
! Configuration File for keepalived

global_defs {       # 全局配置
   router_id lb01
}

vrrp_instance VI_1 {    #定义实例
    state MASTER     # 定义keepalived节点的初始状态,可以为MASTER和BACKUP
    interface ens160   # VRRP实施绑定的网卡接口,
    virtual_router_id 51   # 虚拟路由的ID,同一集群要一致
    priority 100           #定义优先级,按优先级来决定主备角色优先级越大越有限
    advert_int 1              # 主备通讯时间间隔
    authentication {          #配置认证
        auth_type PASS          #认证方式此处为密码
        auth_pass 023654  # 修改密码
    }
    virtual_ipaddress {    #要使用的VIP地址
        192.168.6.250   # 修改vip
    }
}

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

    real_server 192.168.6.152 80 {     # 定义真实处理请求的服务器
        weight 1              # 给服务器指定权重,默认为1
        TCP_CHECK {
            connect_port 80   #端口号为80
            connect_timeout 3   # 连接超时时间
            nb_get_retry 3       # 连接次数
            delay_before_retry 3   # 在尝试之前延迟多少时间
        }
    }

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

[root@node1 keepalived]# systemctl enable --now keepalived   #启动并开机自启
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
[root@node1 keepalived]# systemctl status keepalived   # 查看状态
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
Active: active (running) since Wed 2022-08-31 21:20:10 CST; 15s ago
Process: 20949 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
Main PID: 20950 (keepalived)
Tasks: 3 (limit: 11202)
Memory: 3.6M
CGroup: /system.slice/keepalived.service
├─20950 /usr/sbin/keepalived -D
├─20951 /usr/sbin/keepalived -D
└─20952 /usr/sbin/keepalived -D

 

下载keepalived配置备keepalived

[root@node2 ~]# dnf -y install keepalived
[root@node2 ~]# cd /etc/keepalived/
[root@node2 keepalived]# ls
keepalived.conf
[root@node2 keepalived]# cp keepalived.conf keepalived.conf123
[root@node2 keepalived]# > keepalived.conf
[root@node2 keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 023654
    }
    virtual_ipaddress {
        192.168.6.250
    }
}

virtual_server 192.168.6.250 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

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

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

[root@node2 keepalived]# systemctl enable --now keepalived  #启动并设置开机自启
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
[root@node2 keepalived]# systemctl status keepalived  #查看状态是否是启动并开机自启的
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
   Active: active (running) since Wed 2022-08-31 21:21:09 CST; 17s ago
  Process: 24443 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
 Main PID: 24444 (keepalived)
    Tasks: 3 (limit: 11202)
   Memory: 3.6M
   CGroup: /system.slice/keepalived.service
           ├─24444 /usr/sbin/keepalived -D
           ├─24445 /usr/sbin/keepalived -D
           └─24446 /usr/sbin/keepalived -D

查看VIP在哪里

#  在MASTER上查看
[root@node1 ~]# 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:d7:b0:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.152/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1454sec preferred_lft 1454sec
    inet 192.168.6.250/32 scope global ens160    # vip在主节点上
       valid_lft forever preferred_lft forever
    inet6 fe80::6e9:511e:b6a8:693c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

#在SLAVE上查看
[root@node2 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:42:d0:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.153/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1412sec preferred_lft 1412sec
    inet6 fe80::da77:9e16:6359:1029/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

模拟主出现问题挂掉了

[root@node1 ~]# systemctl stop keepalived
[root@node1 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
   Active: inactive (dead) since Wed 2022-08-31 22:09:17 CST; 4s ago
  Process: 21090 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
 Main PID: 21091 (code=exited, status=0/SUCCESS)
[root@node1 ~]# ip a    # vip释放掉了
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 mq state UP group default qlen 1000
    link/ether 00:0c:29:d7:b0:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.152/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1268sec preferred_lft 1268sec
    inet6 fe80::6e9:511e:b6a8:693c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

查看备

[root@node2 scripts]# 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:42:d0:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.153/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1381sec preferred_lft 1381sec
    inet 192.168.6.250/32 scope global ens160    # 备顶替主接管vip
       valid_lft forever preferred_lft forever
    inet6 fe80::da77:9e16:6359:1029/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

 

 把被停掉看主

[root@node2 scripts]# systemctl stop keepalived
[root@node2 scripts]# 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:42:d0:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.153/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1175sec preferred_lft 1175sec
    inet6 fe80::da77:9e16:6359:1029/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@node2 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
   Active: inactive (dead) since Wed 2022-08-31 22:43:46 CST; 12s ago
  Process: 25066 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
 Main PID: 25067 (code=exited, status=0/SUCCESS)

查看主

[root@node1 ~]# systemctl restart keepalived
[root@node1 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
   Active: active (running) since Wed 2022-08-31 22:44:26 CST; 11s ago
  Process: 21152 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
 Main PID: 21153 (keepalived)
    Tasks: 2 (limit: 11202)
   Memory: 1.8M
   CGroup: /system.slice/keepalived.service
           ├─21153 /usr/sbin/keepalived -D
           └─21154 /usr/sbin/keepalived -D
[root@node1 ~]# 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:d7:b0:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.152/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1121sec preferred_lft 1121sec
    inet 192.168.6.250/32 scope global ens160  # 起来以后有vip
       valid_lft forever preferred_lft forever
    inet6 fe80::6e9:511e:b6a8:693c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

 

 

让keepalived监控nginx负载均衡机

keepalived通过脚本来监控nginx负载均衡机的状态

在master上编写脚本

[root@node1 ~]# mkdir /scripts   # 创建一个脚本目录为了标准化
[root@node1 ~]# cd /scripts/
[root@node1 scripts]# vim check_n.sh   #编写健康检查脚本
[root@node1 scripts]# vim check_n.sh

#!/bin/bash
haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bhaproxy\b'|wc -l)
if [ $haproxy_status -lt 1 ];then
    systemctl stop keepalived
fi
[root@node1 scripts]# chmod +x check_n.sh   # 增加执行权限
[root@node1 scripts]# ll
total 4
-rwxr-xr-x 1 root root 142 Aug 30 23:28 check_n.sh

[root@node1 scripts]# vim notify.sh

#!/bin/bash
case "$1" in
  master)
        haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bhaproxy\b'|wc -l)
        if [ $haproxy_status -lt 1 ];then
            systemctl start haproxy
        fi
        sendmail
  ;;
  backup)
        haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bhaproxy\b'|wc -l)
        if [ $haproxy_status -gt 0 ];then
            systemctl stop haproxy
        fi
  ;;
  *)
        echo "Usage:$0 master|backup VIP"
  ;;
esac
[root@node1 scripts]# chmod +x notify.sh
[root@node1 scripts]# ll
total 8
-rwxr-xr-x 1 root root 142 Aug 30 23:28 check_n.sh
-rwxr-xr-x 1 root root 444 Aug 30 23:32 notify.sh

在slave上编写脚本

[root@node2 ~]# mkdir /scripts   #创建脚本目录为了标准化
[root@node2 ~]# cd /scripts/
[root@node2 scripts]# vim notify.sh
[root@node2 scripts]# vim notify.sh

#!/bin/bash
case "$1" in
  master)
        haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bhaproxy\b'|wc -l)
        if [ $haproxy_status -lt 1 ];then
            systemctl start haproxy
        fi
        sendmail
  ;;
  backup)
        haproxy_status=$(ps -ef|grep -Ev "grep|$0"|grep '\bhaproxy\b'|wc -l)
        if [ $haproxy_status -gt 0 ];then
            systemctl stop haproxy
        fi
  ;;
  *)
        echo "Usage:$0 master|backup VIP"
  ;;
esac
[root@node2 scripts]# chmod +x notify.sh   # 增加权限
[root@node2 scripts]# ll
total 4
-rwxr-xr-x 1 root root 445 Aug 30 23:39 notify.sh

配置keepalived加入监控脚本的配置

配置主keepalived

[root@node1 scripts]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb01
}

vrrp_script nginx_check {
    script "/scripts/check_n.sh"
    interval 1
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 023654
    }
    virtual_ipaddress {
        192.168.6.250
    }
    track_script {
        nginx_check
    }
    notify_master "/scripts/notify.sh master 192.168.6.250"
}

virtual_server 192.168.6.250 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

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

    real_server 192.168.6.153 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
[root@node1 scripts]# systemctl restart keepalived
[root@node1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
   Active: active (running) since Wed 2022-08-31 23:01:50 CST; 11s ago
  Process: 21227 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
 Main PID: 21228 (keepalived)
    Tasks: 3 (limit: 11202)
   Memory: 5.5M
   CGroup: /system.slice/keepalived.service
           ├─21228 /usr/sbin/keepalived -D
           ├─21229 /usr/sbin/keepalived -D
           └─21230 /usr/sbin/keepalived -D

配置备keepalived

backup无需检测nginx是否正常,当升级为MASTER时启动nginx,当降级为BACKUP时关闭

[root@node2 scripts]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 023654
    }
    virtual_ipaddress {
        192.168.6.250
    }
    notify_master "/scripts/notify.sh master 192.168.6.250"
    notify_backup "/scripts/notify.sh backup 192.168.6.250"
}

virtual_server 192.168.6.250 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

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

    real_server 192.168.6.153 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
[root@node2 scripts]# systemctl restart keepalived
[root@node2 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
   Active: active (running) since Wed 2022-08-31 23:08:00 CST; 8s ago
  Process: 25135 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
 Main PID: 25136 (keepalived)
    Tasks: 3 (limit: 11202)
   Memory: 4.0M
   CGroup: /system.slice/keepalived.service
           ├─25136 /usr/sbin/keepalived -D
           ├─25137 /usr/sbin/keepalived -D
           └─25138 /usr/sbin/keepalived -D

模拟主节点出现故障

[root@node1 scripts]# 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:d7:b0:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.152/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1440sec preferred_lft 1440sec
    inet 192.168.6.250/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::6e9:511e:b6a8:693c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@node1 scripts]# ss -antl
State     Recv-Q    Send-Q       Local Address:Port         Peer Address:Port    Process
LISTEN    0         128                0.0.0.0:8189              0.0.0.0:*
LISTEN    0         128                0.0.0.0:80                0.0.0.0:*
LISTEN    0         128                0.0.0.0:22                0.0.0.0:*
LISTEN    0         128                   [::]:22                   [::]:*
[root@node1 scripts]# systemctl stop haproxy  #停掉haproxy
[root@node1 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         128                   [::]:22                   [::]:*
[root@node1 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         128                   [::]:22                   [::]:*
[root@node1 scripts]# systemctl status keepalived  # keepalived也停掉了
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disa>
   Active: inactive (dead) since Wed 2022-08-31 23:11:32 CST; 1min 35s ago
  Process: 21227 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/>
 Main PID: 21228 (code=exited, status=0/SUCCESS)


备节点查看
[root@node2 scripts]# ss -antl  #端口起来了,备顶替了主
State     Recv-Q    Send-Q       Local Address:Port         Peer Address:Port    Process
LISTEN    0         128                0.0.0.0:8189              0.0.0.0:*
LISTEN    0         128                0.0.0.0:80                0.0.0.0:*
LISTEN    0         128                0.0.0.0:22                0.0.0.0:*
LISTEN    0         128                   [::]:22                   [::]:*
[root@node2 scripts]# 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:42:d0:bc brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.153/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 1272sec preferred_lft 1272sec
    inet 192.168.6.250/32 scope global ens160   #vip过来了
       valid_lft forever preferred_lft forever
    inet6 fe80::da77:9e16:6359:1029/64 scope link noprefixroute
       valid_lft forever preferred_lft forever


#模拟主节点修复好了
[root@node1 scripts]# systemctl restart haproxy keepalived  #启动haproxy keepalived
[root@node1 scripts]# 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 mq state UP group default qlen 1000
    link/ether 00:0c:29:d7:b0:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.152/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
       valid_lft 973sec preferred_lft 973sec
    inet 192.168.6.250/32 scope global ens160   #  vip又回来了
       valid_lft forever preferred_lft forever
    inet6 fe80::6e9:511e:b6a8:693c/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@node1 scripts]# ss -antl
State     Recv-Q    Send-Q       Local Address:Port         Peer Address:Port    Process
LISTEN    0         128                0.0.0.0:8189              0.0.0.0:*
LISTEN    0         128                0.0.0.0:80                0.0.0.0:*
LISTEN    0         128                0.0.0.0:22                0.0.0.0:*
LISTEN    0         128                   [::]:22                   [::]:*

#备节点释放vip和资源

[root@node2 scripts]# ip a    # vip没有了
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 mq state UP group default qlen 1000
link/ether 00:0c:29:42:d0:bc brd ff:ff:ff:ff:ff:ff
inet 192.168.6.153/24 brd 192.168.6.255 scope global dynamic noprefixroute ens160
valid_lft 956sec preferred_lft 956sec
inet6 fe80::da77:9e16:6359:1029/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@node2 scripts]# systemctl status haproxy    # haproxy自动停止了
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabl>
Active: inactive (dead)

 

posted @ 2022-08-31 23:26  孙一鸣  阅读(68)  评论(0编辑  收藏  举报