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

按照博客
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)以下錯(cuò)誤

通過 systemctl status firewalld 查看firewalld 狀態(tài),發(fā)現(xiàn)當(dāng)前是 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
以上這個(gè)問題,根據(jù)不同情況解決方案不一樣。這是我在 CentOS 7.x 遇到的問題。
0x02:VIP 漂移問題解決
使用上篇 [ Nginx + Keepalived 高可用之主從配置 ] 的配置文件會(huì)出現(xiàn)keepalived 主備機(jī)器同時(shí)綁定 vip 的問題。
從主備機(jī)配置上來看,并沒有會(huì)出現(xiàn)腦裂情況的配置,理論上主備機(jī)的配置只要注意:router_id 局域網(wǎng)內(nèi)唯一,主備機(jī)不同;virtual_router_id 主備機(jī)配置一致;priority主 機(jī)高于備份機(jī);virtual_ipaddress 主備機(jī)一致,差不多就可以了。但是啟動(dòng) keepalived 之后,主機(jī)與備份機(jī)的vip綁定情況如下圖。
主機(jī) keepalived

備份機(jī) keepalived

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

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

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

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

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


喜歡,在看
