文章目錄
一、企業案例背景
搭建了keepalived 主備集羣,master節點權重100,slave節點權重是80,按照評測的話,master和slave節點都啓動keepalived服務後,虛擬vip正常應該在master節點,slave節點不顯示虛擬vip;當master節點的keepalived服務宕機後,虛擬vip會漂移到slave節點上,繼續提供keepalived服務後服務。
二、異常現象
但是master和slave節點都出現了虛擬vip,這種現象和咱們預估的結果不一樣。但是關閉防火牆後和咱們預估的結果一樣,說明和防火牆有關。
三、分析結論+解決思路
3.1. 分析結論
通過不停的查找問題,我發現,只需要關閉備用負載均衡器的防火牆,那麼主備服務器都有VIP的情況就會得以解決。由此可以肯定,問題就是出現在了防火牆這裏。
首先用tcpdump
查看一下vrrp的組播
情況,這個隨便在同網絡的任意一臺服務器抓包即可:
tcpdump -i ens33 vrrp -n
查看下抓包的結果:
由上圖可以看到,192.168.0.114和192.168.0.112兩個IP在輪流發送組播信號。而正常的應該是由MASTER服務器發送組播,如果BACKUP收不到MASTER的組播信號了,那麼判定MASTER宕機了,BACKUP就會接手VIP。
3.2. 解決思路
如果關閉防火牆,keepalived問題解決了,那麼問題就簡單了,我們只需要讓VRRP組播其通過防火牆即可。
四、SElinux 處理
4.1. 查看SElinux的狀態:
getenforce
可能的結果有三個:
Enforcing #強制開啓
Permissive #寬容模式
Disabled #關閉
4.2. 關閉SElinux
#編輯config
sudo vim /etc/selinux/config
#2.把下面2行註釋掉
#SELINUX=enforcing
#SELINUXTYPE=targeted
#3.添加一行配置
SELINUX=disabled
:wq! #保存退出
setenforce 0 #使配置立即生效
五、Firewalld防火牆配置
centos 防火牆有兩種管理方式firewall, iptables兩者不能同時開啓
適用於centos7.x系統
5.1. 開啓vrrp 協議
主備都運行下面的命令
sudo firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT
5.2. 重新啓動防火牆
firewall-cmd --reload
5.3. 查看啓動日誌
master節點
slave節點
從上面截圖中可以看出,由於 with higher priority 100, ours 80
很明顯114權重比112的權重大,虛擬vip在192.168.0.114上。
5.4. 虛擬ip驗證
master節點
slave節點
5.5. 停止master節點的keepalived
master節點
slave節點
六、Iptables防火牆配置
適用於centos6.x系統
我們只需要在防火牆中增加一條規則即可:
6.1. 配置增加一條防火牆規則
-A INPUT -p vrrp -j ACCEPT
6.2. 防火牆規則注意事項
但是這裏有個坑,默認的防火牆中基本是如下配置:
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
添加規則一定不要在
-A INPUT -j REJECT --reject-with icmp-host-prohibited
之後,一定要加在其前面。
這時候重啓防火牆後查看BACKUP的ip,就會發現VIP已經不在了。
再關閉一下MASTER的keepalived,並打開BACKUP的日誌,就可以看到正確的內容