一、簡介
浮動IP、漂移IP地址又叫做VIP,也就是虛擬IP。
Keepalived 是一種高性能的服務器高可用或熱備解決方案。
Keepalived 可以用來防止服務器單點故障的發生,通過配合 Nginx 可以實現 web 前端服務的高可用。
Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。?
keepalived 提供健康檢查,故障轉移,提高系統的可用性!
二、方案規劃
VIP | IP | Nginx端口 | 默認主從 |
192.168.111.250 | 192.168.111.201 | 80 | MASTER |
192.168.111.250 | 192.168.111.202 | 80 | BACKUP |
master正常的情況下
master宕機的情況下
三、安裝Nginx?
# 安裝四個依賴
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -zxvf nginx-1.13.7.tar.gz
cd nginx-1.13.7
./configure --prefix=/usr/local/nginx
make && make install
修改 nginx 首頁面內容為節點的ip地址,方便測試觀察
vi /usr/local/nginx/html/index.html
<body>
<h1>192.168.111.201</h1>
</body>
<body>
<h1>192.168.111.202</h1>
</body>
啟動nginx
cd /usr/local/nginx/sbin/
./nginx
防火墻開啟80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
瀏覽器訪問Nginx
http://192.168.111.201
http://192.168.111.202
?
?四、安裝 Keepalived
方式一:
如果能聯網可以使用yum快速安裝:
yum install -y keepalived
方式二:?
可以去keepalived官網直接下載:https://www.keepalived.org/download.html
# 安裝依賴
yum -y install gcc openssl openssl-devel libnl libnl-devel libnfnetlink-devel
# 下載
yum -y install wget
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure --prefix=/usr/local/keepalived
make && make installmkdir /etc/keepalived
cp -p /usr/local/keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
編輯配置文件
vi /etc/keepalived/keepalived.conf
(1)編輯 MASTER(主)節點配置文件(192.168.111.201)
! Configuration File for keepalived# 全局配置
global_defs {# 路由ID,不能重復,通常為 hostnamerouter_id 192.168.111.201
}# keepalived會定時執行腳本并對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
# 如果腳本執行結果為0,并且weight配置的值大于0,則優先級相應的增加。
# 如果腳本執行結果非0,并且weight配置的值小于 0,則優先級相應的減少。
# 其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
vrrp_script chk_nginx {# 檢測 nginx 狀態的腳本路徑script "/etc/keepalived/nginx_check.sh"# #每2秒運行一次上面的腳本interval 2# 失敗一次,將自己的優先級-20,如果MASTER的priority=100,BACKUP的priority=70# 那么MASTER要失敗2次后變為60,低于BACKUP的70,MASTER節點會降級為BACKUP,而BACKUP節點升級為MASTERweight -20
}# 定義實例
vrrp_instance VI_1 {# 可選值為 MASTER 或者 BACKUPstate MASTER# 網卡名稱,與本機 IP 地址所在的網卡名稱相同interface ens32# 虛擬路由的ID,MASTER和BACKUP必須是一致的。virtual_router_id 51# 定義優先級,數字越大,優先級越高,MASTER的優先級必須大于BACKUP的優先級priority 100# 設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,單位為秒advert_int 1# 設置驗證類型和密碼,兩個節點必須一致authentication {# 認證方式,此處PASS表示為密碼auth_type PASS# 生產環境設置6位隨機密碼auth_pass 123456}# 設置虛擬IP地址virtual_ipaddress {192.168.111.250}# 執行腳本track_script {# 對應vrrp_script配置的腳本chk_nginx}
}
(2)編輯 BACKUP(備)節點配置文件(192.168.111.202)
! Configuration File for keepalivedglobal_defs {# 路由ID,不能重復,通常為 hostnamerouter_id 192.168.111.202
}vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"interval 2weight -20
}# 定義實例
vrrp_instance VI_1 {# 可選值為 MASTER 或者 BACKUPstate BACKUPinterface ens32virtual_router_id 51# 定義優先級,數字越大,優先級越高,MASTER的優先級必須大于BACKUP的優先級priority 99advert_int 1authentication {auth_type PASSauth_pass 123456}# 設置虛擬IP地址virtual_ipaddress {192.168.111.250}track_script {chk_nginx}
}
(3) 編寫 Nginx 狀態檢測腳本
vi /etc/keepalived/nginx_check.sh
方式一:
如果 nginx 停止運行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 進程, keepalied將虛擬 ip 綁定到 BACKUP 機器上。
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then# 這里需要替換成自己的nginx安裝路徑# 嘗試重新啟動nginx/usr/local/nginx/sbin/nginx# 睡眠2秒sleep 2if [ $A -eq 0 ];then#啟動失敗,將keepalived服務殺死。killall keepalivedfi
fi
?killall命令默認未安裝,會報錯?killall: 未找到命令。安裝方式如下:
yum install -y psmisc
?方式二:?
如下,返回0或者1。我比較喜歡這種方式。
這里換成其他組件,比如mysql 修改為`pidof mysql`?即可。
#!/bin/bash
# keepalived會定時執行腳本并對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
# 如果腳本執行結果為0,并且weight配置的值大于0,則優先級相應的增加。
# 如果腳本執行結果非0,并且weight配置的值小于 0,則優先級相應的減少。
# 其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi
給腳本添加執行權限
chmod +x /etc/keepalived/nginx_check.sh
?(4) 開啟組播防火墻
centos7放行組播地址224.0.0.18,協議vrrp
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens32 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
# 查看規則是否生效
firewall-cmd --permanent --direct --get-all-rules
--direct:指定將要使用直接規則
--permanent:表示永久生效 ,沒有此參數重啟后失效
--add-rule ipv4 filter:表示添加一個新的策略
設置一條IPV4規則,表為防火墻表 :filter, 處理輸入數據包 INPUT ,0 代表在頭部添加。后面就是常用的iptables語法
--in-interface ens32:設置網卡名,這里我的網卡名是ens32
--destination 224.0.0.18:設置目標ip地址,也就是設置放行組播地址224.0.0.18
--protocol vrrp:設置攔截的協議
-j ACCEPT:表示放行,-j DROP表示丟棄(不放行)
(5) 啟動 Keepalived
# 啟動
systemctl start keepalived.service
# 重啟
systemctl restart keepalived.service
# 停止
systemctl stop keepalived.service
# 查看運行狀態
systemctl status keepalived
# 查看運行進程
ps -ef|grep keepalived
MASTER(主)節點(192.168.111.201)成功標志
可以看到,192.168.111.201拿到了VIP 192.168.111.250。?
BACKUP(備)節點(192.168.111.202)成功標志
BACKUP上只有192.168.111.202這個ip,正常。
注意:MASTER節點正常的情況下,BACKUP節點一定不會有浮動IP,也就是VIP只能同時在一個節點上。
(6) 驗證VIP漂移
我們先關閉Master,驗證VIP是否會漂移到BACKUP上。
關閉 ?MASTER(主)節點(192.168.111.201) 的 keepalived:
systemctl stop keepalived.service
?VIP已經成功飄到BACKUP節點上了
五、Keepalived + Nginx 的高可用測試
訪問浮動VIP
http://192.168.111.250
?正常情況下,浮動ip飄到 MASTER(主)節點(192.168.111.201)上,所以訪問后顯示的主節點的nginx首頁
如果殺掉 MASTER(主)節點(192.168.111.201)的 nginx?
如果nginx進程不存在腳本返回1,nginx進程存在腳本返回0
腳本返回0,表示nginx進程存在,由于上面配置的weight為負數,priority 不會改變。
腳本返回1,表示nginx進程不存在,由于上面配置的weight為負數,priority 會減少,減少后的值?priority =?priority+weight
失敗一次,將自己的優先級-20,我這里MASTER的priority=100,BACKUP的priority=99
那么MASTER要失敗1次后變為80,低于BACKUP的99,MASTER節點會降級為BACKUP,而BACKUP節點升級為MASTER
#!/bin/bash
# keepalived會定時執行腳本并對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
# 如果腳本執行結果為0,并且weight配置的值大于0,則優先級相應的增加。
# 如果腳本執行結果非0,并且weight配置的值小于 0,則優先級相應的減少。
# 其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi
殺掉?MASTER(主)節點(192.168.111.201)的 nginx 后,再次訪問浮動VIP
http://192.168.111.250
六、常見錯誤
1、keepalived 配置了虛擬ip,發現無法ping 通這個虛擬ip。
解決方法,把配置文件中的 vrrp_strict 給注釋掉,重啟 keepalived 服務后再次ping就可以了。
2、啟動失敗、卡住
使用命令 journalctl -xe 查看日志,有這樣一行:
Failed to parse PID from file /usr/local/keepalived/var/run/keepalived.pid: Invalid argument
這里因為源碼安裝的方式,pid文件找不到,使用命令?systemctl status keepalived 查看 load文件路徑:loaded (/usr/lib/systemd/system/keepalived.service)
修改/usr/lib/systemd/system/keepalived.service該文件內容:PIDFile=/var/run/keepalived.pid
參考:
keepalived應用:漂移IP的實現_keepalived做ip漂移_Joy_B的博客-CSDN博客
keepalive實戰_sending/queueing gratuitous arps_程序員柒叔的博客-CSDN博客
linux防火墻下允許keepalived組播_keepalived 防火墻_老帽爬新坡的博客-CSDN博客