Loading

HA-Keepalived-01-Keepalived

简介

基本原理

引入的VIP即虚拟ip,不是nginx服务器的真实IP,而是一个虚拟的"漂移的"IP,为实现nginx服务的高可用,nginx将存在多台服务器(>=2),每台对应的后端应用服务器集群的配置应保持一致,为保障nginx能7*24的提供负载均衡或反向代理的服务,在多台nginx服务器中选择1台进行服务,那么怎么选择这台呢?这就是VIP的意义,根据keepalived中配置的规则(优先级排序),priority最高的那个将绑定VIP,成为master,其余主机成为BACKUP,master将一直发送组播信息,而当master挂或者由于priority降低将导致它退出master的角色,backup收不到组播信息后就认为master已挂,这时他们之间会进行抢占、选举,再根据priority选出新的master。

简单的说,虽然配置了多台nginx服务器,但只有一台会绑定VIP,提供nginx服务,当这台服务挂掉后,自动退出master角色,在剩下的backup中选出一台成为master,绑定VIP,继续提供nginx服务。

主从模式

前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。

主主模式

前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠。

前提条件

CentOS7:2009

环境

Keepalived:1.3.5

服务器

主机名称 IP IP所在网卡
HA1 192.168.62.127 ens33
HA2 192.168.62.128 ens33

主备模式

VIP: 192.168.62.126

主从模式

VIP1:192.168.62.125

VIP2:192.168.62.126

安装

直接安装二进制

# 安装epel(Extra Packages for Enterprise Linux)企业Linux扩展包
yum install -y epel-release
# 安装keepalived
yum install -y keepalived

配置

自动启动

 # 启用开机启动
systemctl enable keepalived
# 确认开机启动已启用
systemctl is-enabled keepalived

启动

# 启动
systemctl start keepalived
# 查看状态
systemctl status keepalived

路由[好像不必要]

# VIP的80端口可以访问
iptables -I INPUT -p tcp -dport 80 -j ACCEPT

# 允许VRRP协议,防止同时两个服务器拥有相同网络的同一VIP 否则会脑裂
iptables -I INPUT -p ah -j ACCEPT
iptables -I INPUT -p vrrp -j ACCEPT

iptables -A INPUT -p vrrp -j ACCEPT

systemctl restart iptables

防火墙

增加VRRP(Virtual Router Redundancy Protocol) 虚拟路由冗余协议的例外规则

firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload

配置主从模式

主从都需要执行

注意:需要禁用SELinux否则脚本执行不正常

新增脚本文件/etc/keepalived/nginx_check.sh

cat >/etc/keepalived/nginx-check.sh <<EOF
#!/bin/bash
# description:
# 定时查看nginx是否存在,如果不存在则启动nginx
# 如果启动失败,则停止keepalived
status=$(ps -C nginx --no-headers|wc -l)
if [ "${status}" = "0" ]; then
    systemctl restart nginx
    sleep 3
    status2=$(ps -C nginx --no-headers|wc -l)
    status3=$(ps -C keepalived --no-headers|wc -l)
    if [ "${status2}" = "0"  ]; then
        systemctl stop keepalived
    elif [ "${status3}" = "0" ]; then
        systemctl restart keepalived
    fi
fi
EOF
# 将脚本赋予可执行权限
chmod +x /etc/keepalived/nginx-check.sh

主服务器

在/etc/keepalived/keepalived.conf 文件中

cat >/etc/keepalived/keepalived.conf <<EOF
! 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 # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script nginx_check {
    # 脚本两种写法
    # 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
    # script "/usr/bin/killall -0 nginx"
    # 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
    script "/etc/keepalived/nginx-check.sh"
    interval 5 # 脚本执行间隔5s
    # 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
    # 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
    # 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
    weight -5
    fall 3 # 检测失败3次就定义为down状态
    rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 100 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.127 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换
    nopreempt

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.125 #虚拟IP, 主从应该填写一致
        192.168.62.126 #虚拟IP, 主从应该填写一致
    }

    notify /etc/keepalived/notify-nginx.sh
}
EOF

备服务器

cat >/etc/keepalived/keepalived.conf <<EOF
! 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 # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script nginx_check {
    # 脚本两种写法
    # 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
    # script "/usr/bin/killall -0 nginx"
    # 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
    script "/etc/keepalived/nginx-check.sh"
    interval 5 # 脚本执行间隔5s
    # 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
    # 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
    # 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
    weight -5
    fall 3 # 检测失败3次就定义为down状态
    rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}

vrrp_instance VI_1 {
    state BACKUP #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 98 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.128 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换
    nopreempt

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.125 #虚拟IP, 主从应该填写一致
        192.168.62.126 #虚拟IP, 主从应该填写一致
    }

    notify /etc/keepalived/notify-nginx.sh
}
EOF

配置主主模式

主从都需要执行

注意:需要禁用SELinux否则脚本执行不正常

新增脚本文件/etc/keepalived/nginx_check.sh

cat >/etc/keepalived/nginx-check.conf <<EOF
#!/bin/bash
# description:
# 定时查看nginx是否存在,如果不存在则启动nginx
# 如果启动失败,则停止keepalived
status=$(ps -C nginx --no-headers|wc -l)
if [ "${status}" = "0" ]; then
    systemctl restart nginx
    sleep 3
    status2=$(ps -C nginx --no-headers|wc -l)
    status3=$(ps -C keepalived --no-headers|wc -l)
    if [ "${status2}" = "0"  ]; then
        systemctl stop keepalived
    elif [ "${status3}" = "0" ]; then
        systemctl restart keepalived
    fi
fi
EOF
# 将脚本赋予可执行权限
chmod +x /etc/keepalived/nginx-check.sh

主服务器

cat >/etc/keepalived/keepalived.conf <<EOF
! 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 # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script check-nginx {
    # 脚本两种写法
    # 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
    # script "/usr/bin/killall -0 nginx"
    # 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
    script "/etc/keepalived/check-nginx.sh"
    interval 5 # 脚本执行间隔5s
    # 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
    # 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
    # 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
    weight -5
    fall 3 # 检测失败3次就定义为down状态
    rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}

# 双主模式 该配置是第一个VIP的Master
vrrp_instance VI_1 {
    state MASTER #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 100 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.127 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.125 #虚拟IP, 主从应该填写一致
    }
}

# 双主模式 该配置是第二个VIP的Backup
vrrp_instance VI_2 {
    state BACKUP #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 52 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 90 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.127 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        check-nginx # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.126 #虚拟IP, 主从应该填写一致
    }
}
EOF

备服务器

cat >/etc/keepalived/keepalived.conf <<EOF
! 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 # 机器标识,在一个网络中应该唯一,通常可设为hostname。故障发生时,邮件通知会用到
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 优先级不会不断的提高或者降低
# 可以编写多个检测脚本并为每个检测脚本设置不同的weight(在配置中列出就行)
vrrp_script check-nginx {
    # 脚本两种写法
    # 1、通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定
    # script "/usr/bin/killall -0 nginx"
    # 2、脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP
    script "/etc/keepalived/check-nginx.sh"
    interval 5 # 脚本执行间隔5s
    # 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
    # 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
    # 其他情况,原本配置的优先级不变,即配置文件中priority对应的值
    weight -5
    fall 3 # 检测失败3次就定义为down状态
    rise 2 # 检测失败后,检测成功超过2次就定义为up状态,但不修改优先级
}

# 双主模式 该配置是第一个VIP的Master
vrrp_instance VI_1 {
    state BACKUP #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 51 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 90 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.128 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        nginx_check # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.125 #虚拟IP, 主从应该填写一致
    }
}

# 双主模式 该配置是第二个VIP的Backup
vrrp_instance VI_2 {
    state MASTER #指定初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER.
    interface ens33 #支持MULTICAST多播的网卡名 ip a 获取
    virtual_router_id 52 # 虚拟路由ID标识,一组的keepalived配置中主备都是设置一致, 相同的VRID为一个组,它将决定多播的MAC地址
    priority 100 # 1-254 设置本节点的优先级,优先级高的为MASTER,所以MASTER必须大于BACKUP
    advert_int 2 # 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    mcast_src_ip 192.168.62.128 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址

#     # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式
#     # 本机ip
#     unicast_src_ip 192.168.124.14
#     unicast_peer {
#         # 其他机器ip
#         192.168.124.13
#     }

    # 认证方式,主从需要一致否则无法通信导致脑裂
    authentication {
        auth_type PASS # 密码认证
        auth_pass 1111 # 密码最多8位
    }

    track_script {
        check-nginx # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行该脚本改变优先级,并最终引发主从切换
    }

    # 虚拟IP地址,它随着state的变化而增加删除,当state为MASTER的时候就添加,当state为backup的时候删除
    # 这里主要是由优先级来决定的,和state设置的值没有多大关系
    # 如果有多个虚拟IP 换行填写多个
    virtual_ipaddress {
        192.168.62.126 #虚拟IP, 主从应该填写一致
    }
}
EOF

调试

# 查看keepalived日志
journalctl -u keepalived -f

测试

主从模式

正常测试

操作:正常访问VIP

期望:应该负载均衡的访问到两个服务器, 并且只有Keepalived的Master服务由虚拟IP

步骤:

1、

# Keepalived当前为Backup角色的服务器执行,应该不包含虚拟IP
ip a

2、

# Keepalived当前为Master角色的服务器执行,应该包含虚拟IP
ip a

测试其中一Nginx关闭

操作:关闭其中一台服务器上的Nginx,访问VIP

期望:Keepalived重启当前服务器中的Nginx,访问到当前服务器上的Nginx

步骤:

1、

# 停掉Backup角色的nginx服务
systemctl stop nginx
# 当前Backup角色的nginx服务应该还是启动的
systemctl status nginx

2、

# 停掉Master角色的nginx服务
systemctl stop nginx
# 当前Master角色的nginx服务应该还是启动的
systemctl status nginx

测试其中一Keepalived关闭

操作:关闭其中一台服务器上的Keepalived,访问VIP

期望:应该访问到另一台服务器上的Nginx

步骤:

1、

# 停掉Backup角色的Keepalived服务
systemctl stop keepalived
# 另一个Master角色的Keepalived服务还是Master角色并包含虚拟IP
ip a
# 重新启动原Backup角色的Keepalived服务
systemctl start keepalived

2、

# 停掉Master角色的Keepalived服务
systemctl stop keepalived
# 另一个Backup角色的Keepalived服务应该切换为Master并包含虚拟IP
ip a
# 重新启动原Master角色的Keepalived服务
systemctl start keepalived
# 另一个原Backup角色的Keepalived服务应该保持Master角色并保留虚拟IP
# 因为nopreempt配置的原因,即使原Master已恢复也不会切换,防止来回切换导致服务中断
ip a

测试其中一个服务器关闭

操作:关闭其中一台服务器,访问VIP

期望:应该访问到另一台服务器上的Nginx

步骤:

1、

# 关闭Backup角色的服务器
shutdown now
# 在Master角色服务器访问VIP,应该访问到Master角色上的Nginx
curl <VIP>
# 手动开启Backup角色的服务器

# 开机后访问VIP,应该还是访问到Master角色上的Nginx
curl <VIP>

2、

# 关闭Master角色的服务器
shutdown now
# 原Backup角色服务器应该变为Master角色,并拥有VIP
ip a
# 在原Backup角色服务器访问VIP,应该访问到原Backup角色上的Nginx
curl <VIP>
# 手动开启Master角色的服务器

# 开机后访问VIP,应该还是访问到原Backup角色上的Nginx
curl <VIP>

主主模式

正常测试

操作:正常访问VIP

期望:应该负载均衡的访问到两个服务器, 并且只有Keepalived的Master服务由虚拟IP

步骤:

1、

# Keepalived第一组网络当前为Backup角色的服务器执行,应该包含虚拟IP1
ip a

2、

# Keepalived第二组网络当前为Master角色的服务器执行,应该包含虚拟IP2
ip a

测试其中一Nginx关闭

操作:关闭其中一台服务器上的Nginx,访问VIP

期望:Keepalived重启当前服务器中的Nginx,访问到当前服务器上的Nginx

步骤:

1、

# 停掉HA1的nginx服务
systemctl stop nginx
# HA1的nginx服务应该还是启动的
systemctl status nginx

2、

# 停掉HA2的nginx服务
systemctl stop nginx
# HA2的nginx服务应该还是启动的
systemctl status nginx

测试其中一Keepalived关闭

操作:关闭其中一台服务器上的Keepalived,访问VIP

期望:应该访问到另一台服务器上的Nginx

步骤:

1、

# 停掉HA1的Keepalived服务
systemctl stop keepalived
# HA2的IP地址包含VIP1
ip a
# 重新启动HA1的Keepalived服务
systemctl start keepalived
# HA1的IP地址包含VIP1
ip a

2、

# 停掉HA2的Keepalived服务
systemctl stop keepalived
# HA1的IP地址包含VIP2
ip a
# 重新启动HA2的Keepalived服务
systemctl start keepalived
# HA2的IP地址包含VIP2
ip a

测试其中一个服务器关闭

操作:关闭其中一台服务器,访问VIP

期望:应该访问到另一台服务器上的Nginx

步骤:

1、

# 关闭HA1服务器
shutdown now
# HA2的IP地址包含VIP1
ip a
# 手动开启HA1服务器

# HA1服务器IP地址包含VIP1
ip a

2、

# 关闭HA2服务器
shutdown now
# HA1的IP地址包含VIP2
ip a
# 手动开启HA2服务器

# HA2服务器IP地址包含VIP2
ip a

FAQ

Q1: /etc/keepalived/nginx-check.sh exited due to signal 15
A1: 修改vrrp_script chk_nginx配置项中interval的时间必须大于脚本中设置的sleep时间,3秒不行就5秒

Q2: /etc/keepalived/nginx-check.sh exited with status 127或126
A2: 脚本错误,查看脚本中的命令如nginx所在位置

Q3: /etc/keepalived/nginx-check.sh exited with status 1
A3: SELinux是否禁用

posted @ 2022-12-11 15:47  知科行技  阅读(239)  评论(0编辑  收藏  举报