Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived

0x01:防火墙问题解决

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

会出现以下错误

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_02

不安装 gi 模块,执行执行如下 yum 命令

yum -y install firewall-config

执行完毕后,再次执行命令

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

又出现以下错误

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_03

通过 systemctl status firewalld 查看firewalld 状态,发现当前是 dead 状态,即防火墙未开启。

 

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_04

通过 systemctl start firewalld 开启防火墙,没有任何提示即开启成功;再次通过 systemctl status firewalld 查看 firewalld 状态,显示 running 即已开启了。

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_05

如果要关闭防火墙设置,可能通过 systemctl stop firewalld 指令来关闭该功能。再次执行执行命令

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

提示 success,表示设置成功。

重新加载防火墙配置

firewall-cmd --reload

以上这个问题,根据不同情况解决方案不一样。这是我在 CentOS 7.x 遇到的问题。

 

0x02:VIP 漂移问题解决

使用上篇 [ Nginx + Keepalived 高可用之主从配置 ] 的配置文件会出现keepalived 主备机器同时绑定 vip 的问题。

从主备机配置上来看,并没有会出现脑裂情况的配置,理论上主备机的配置只要注意:router_id 局域网内唯一,主备机不同;virtual_router_id 主备机配置一致;priority主 机高于备份机;virtual_ipaddress 主备机一致,差不多就可以了。但是启动 keepalived 之后,主机与备份机的vip绑定情况如下图。

  • 主机 keepalived 

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_06

  • 备份机 keepalived

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_07

在 192.168.56.9 主机使用 tcpdump 抓包,监控一下enp0s3,也就是绑定了vip 的网卡的报文

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_08

192.168.56.9(主)和192.168.56.10(备)两台机器在轮询往224.0.0.18(vrrp的组播地址)发送报文。理论上来说,主机处于活跃状态的时候,备份机收到报文之后是不会发送组播消息的,很明显就是备份机没收到主机的组播报文。

192.168.56.10 备份机使用 tcpdump 抓包,监控一下enp0s4,也就是绑定了vip 的网卡的报文,同样出现跟主机一样的情况。

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_09

说明主备机与组播 ip 之间的通信存在问题,查看 CentOS 对应的防火墙firewall 开启组播通信的方法,执行如下命令:

  • 192.168.56.9 主机

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

#刷新防火墙
firewall-cmd --reload;

其中INPUT 0 --in-interface enp03 这段的 enp03 是绑定了 vip 的网卡,需要替换成实际网卡。

  • 192.168.56.10 备份机

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp0s4 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

#刷新防火墙
firewall-cmd --reload;

配置文件要做以下调整

  • 192.168.56.9 主机

! 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_128
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#健康检测脚本,必须声明在vrrp_instance节点前
vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
        interval 3 ## 检测时间间隔
        weight -20 ## 如果条件成立,权重-20
}
#vrrp实例设置
vrrp_instance VI_1 {
    state MASTER  #MASTER为主机
    interface enp0s3  #虚拟ip绑定的网卡
    virtual_router_id 99 #虚拟路由ID标识,一组的keepalived配置中主备都是设置一致
    priority 100   #优先级,主机应高于备份机即可
    advert_int 1 
    authentication {
        auth_type PASS #认证方式
        auth_pass 123456  #认证密码
    }
    virtual_ipaddress {
        192.168.56.120 #虚拟ip
    }
    track_script {
        chk_nginx ## 执行 Nginx 监控的服务
    }
}
  • 192.168.56.10 备份机

! 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_129
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
        interval 3 ## 检测时间间隔
        weight -20 ## 如果条件成立,权重-20
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s4
    virtual_router_id 99
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.56.120
    }
    track_script {
        chk_nginx ## 执行 Nginx 监控的服务
     }
}


0x03:验证

首先在主备服务器分别执行 systemctl start keepalived.service开启 keepalived

通过 ip addr 命令分别查看主备两台机器,只有主服务器可以看到 vip

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_10

在主服务器执行 systemctl stop keepalived.service 停止 keepalived;

通过 ip addr 命令查看备服务的 ip, 会发现可以看到 vip;

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_11

在主服务器执行systemctl start keepalived.service,再次启动 keepalived;通过 ip addr 命令分别查看主备两台机器,只有主服务器可以看到 vip;

Nginx + Keepalived 高可用之主从配置 二_Nginx + Keepalived_12