Nginx + Keepalived 高可用之主从配置 二
0x01:防火墙问题解决
上篇 [ Nginx + Keepalived 高可用之主从配置 ],在执行以下命令时
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
会出现以下错误
按照博客
https://blog.csdn.net/a1010256340/article/details/86612521
不安装 gi 模块,执行执行如下 yum 命令
yum -y install firewall-config
执行完毕后,再次执行命令
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
又出现以下错误
通过 systemctl status firewalld 查看firewalld 状态,发现当前是 dead 状态,即防火墙未开启。
通过 systemctl start firewalld 开启防火墙,没有任何提示即开启成功;再次通过 systemctl status firewalld 查看 firewalld 状态,显示 running 即已开启了。
如果要关闭防火墙设置,可能通过 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
备份机 keepalived
在 192.168.56.9 主机使用 tcpdump 抓包,监控一下enp0s3,也就是绑定了vip 的网卡的报文
192.168.56.9(主)和192.168.56.10(备)两台机器在轮询往224.0.0.18(vrrp的组播地址)发送报文。理论上来说,主机处于活跃状态的时候,备份机收到报文之后是不会发送组播消息的,很明显就是备份机没收到主机的组播报文。
192.168.56.10 备份机使用 tcpdump 抓包,监控一下enp0s4,也就是绑定了vip 的网卡的报文,同样出现跟主机一样的情况。
说明主备机与组播 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
在主服务器执行 systemctl stop keepalived.service 停止 keepalived;
通过 ip addr 命令查看备服务的 ip, 会发现可以看到 vip;
在主服务器执行systemctl start keepalived.service,再次启动 keepalived;通过 ip addr 命令分别查看主备两台机器,只有主服务器可以看到 vip;
欢迎关注微信公众号:互联网全栈架构,收取更多有价值的信息。