在上節 nginx負載均衡 後,本次添加了 keepalived 的使用例子。
準備工作:
兩臺虛擬機:centos7_1(192.168.1.201)、centos7_2(192.168.1.186)
兩臺虛擬機都裝有 nginx 和 三個 tomcat(負載均衡)
配置 201 的 keepalived,路徑:/etc/keepalived/keepalived.conf,配置比較簡單,都是從其他地方抄的
global_defs {
router_id proxy1
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2 #健康檢查週期
weight -2 #優先級變化幅度
fall 2 #判定服務異常的檢查次數
rise 1 #判定服務正常的檢查次數
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.205
}
track_script {
chk_nginx
}
}
檢查腳本 /etc/keepalived/nginx_check.sh,注意 nginx 路徑
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/mine/nginx/sbin/nginx #嘗試重新啓動nginx
sleep 2 #睡眠2秒
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived #啓動失敗,將keepalived服務殺死。將vip漂移到其它備份節點
fi
fi
配置 186 的 keepalived.conf,路徑:/etc/keepalived/keepalived.conf,腳本和上面是一樣的
global_defs {
router_id proxy2
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -2
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.205
}
track_script {
chk_nginx
}
}
然後,啓動兩個 keepalived
啓動後就可以訪問 虛擬 ip 192.168.1.205 了
201 關閉 keepalived 後,就由 186 提供服務,自動切換
重新啓動 201 的 keepalived,就又變成 201 提供服務,原因是重新啓動後 priority 100,比 186 的 priority 大,201 自動變成 master
兩邊都 killall keepalived 後,虛擬 ip 就無法再訪問了(但 201 和 186 還是能訪問的,只是由兩個 keepalived 綁定的 vip 205 無法訪問)
中間遇到的問題:
備用機 186 的 keepalived 一啓動就自動變成 master
原因:centos7 的防火牆問題,解決方法:關閉 201 的防火牆就可以了, systemctl stop firewalld,其他方法未知
參考:
https://blog.51cto.com/xiexinmiao/1650888
https://blog.51cto.com/h11345/1570786