Nginx + Keepalived 高可用之主從配置 二
0x01:防火墻問題解決
上篇 [ Nginx + Keepalived 高可用之主從配置 ],在執(zhí)行以下命令時
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
會出現(xiàn)以下錯誤

按照博客
https://blog.csdn.net/a1010256340/article/details/86612521
不安裝 gi 模塊,執(zhí)行執(zhí)行如下 yum 命令
yum -y install firewall-config
執(zhí)行完畢后,再次執(zhí)行命令
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
又出現(xiàn)以下錯誤

通過 systemctl status firewalld 查看firewalld 狀態(tài),發(fā)現(xiàn)當前是 dead 狀態(tài),即防火墻未開啟。

通過 systemctl start firewalld 開啟防火墻,沒有任何提示即開啟成功;再次通過 systemctl status firewalld 查看 firewalld 狀態(tài),顯示 running 即已開啟了。

如果要關(guān)閉防火墻設(shè)置,可能通過 systemctl stop firewalld 指令來關(guān)閉該功能。再次執(zhí)行執(zhí)行命令
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
提示 success,表示設(shè)置成功。
重新加載防火墻配置
firewall-cmd --reload
以上這個問題,根據(jù)不同情況解決方案不一樣。這是我在 CentOS 7.x 遇到的問題。
0x02:VIP 漂移問題解決
使用上篇 [ Nginx + Keepalived 高可用之主從配置 ] 的配置文件會出現(xiàn)keepalived 主備機器同時綁定 vip 的問題。
從主備機配置上來看,并沒有會出現(xiàn)腦裂情況的配置,理論上主備機的配置只要注意:router_id 局域網(wǎng)內(nèi)唯一,主備機不同;virtual_router_id 主備機配置一致;priority主 機高于備份機;virtual_ipaddress 主備機一致,差不多就可以了。但是啟動 keepalived 之后,主機與備份機的vip綁定情況如下圖。
主機 keepalived

備份機 keepalived

在 192.168.56.9 主機使用 tcpdump 抓包,監(jiān)控一下enp0s3,也就是綁定了vip 的網(wǎng)卡的報文

192.168.56.9(主)和192.168.56.10(備)兩臺機器在輪詢往224.0.0.18(vrrp的組播地址)發(fā)送報文。理論上來說,主機處于活躍狀態(tài)的時候,備份機收到報文之后是不會發(fā)送組播消息的,很明顯就是備份機沒收到主機的組播報文。
192.168.56.10 備份機使用 tcpdump 抓包,監(jiān)控一下enp0s4,也就是綁定了vip 的網(wǎng)卡的報文,同樣出現(xiàn)跟主機一樣的情況。

說明主備機與組播 ip 之間的通信存在問題,查看 CentOS 對應的防火墻firewall 開啟組播通信的方法,執(zhí)行如下命令:
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 的網(wǎng)卡,需要替換成實際網(wǎng)卡。
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;
配置文件要做以下調(diào)整
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節(jié)點前
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態(tài)的腳本路徑
interval 3 ## 檢測時間間隔
weight -20 ## 如果條件成立,權(quán)重-20
}
#vrrp實例設(shè)置
vrrp_instance VI_1 {
state MASTER #MASTER為主機
interface enp0s3 #虛擬ip綁定的網(wǎng)卡
virtual_router_id 99 #虛擬路由ID標識,一組的keepalived配置中主備都是設(shè)置一致
priority 100 #優(yōu)先級,主機應高于備份機即可
advert_int 1
authentication {
auth_type PASS #認證方式
auth_pass 123456 #認證密碼
}
virtual_ipaddress {
192.168.56.120 #虛擬ip
}
track_script {
chk_nginx ## 執(zhí)行 Nginx 監(jiān)控的服務
}
}
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 狀態(tài)的腳本路徑
interval 3 ## 檢測時間間隔
weight -20 ## 如果條件成立,權(quán)重-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 ## 執(zhí)行 Nginx 監(jiān)控的服務
}
}
0x03:驗證
首先在主備服務器分別執(zhí)行 systemctl start keepalived.service開啟 keepalived
通過 ip addr 命令分別查看主備兩臺機器,只有主服務器可以看到 vip

在主服務器執(zhí)行 systemctl stop keepalived.service 停止 keepalived;
通過 ip addr 命令查看備服務的 ip, 會發(fā)現(xiàn)可以看到 vip;

在主服務器執(zhí)行systemctl start keepalived.service,再次啟動 keepalived;通過 ip addr 命令分別查看主備兩臺機器,只有主服務器可以看到 vip;

歡迎關(guān)注微信公眾號:互聯(lián)網(wǎng)全棧架構(gòu),收取更多有價值的信息。
