1.場景描述
? ? ? 在實(shí)際生產(chǎn)環(huán)境中負(fù)載均衡是一個至關(guān)重要的位置狗准,負(fù)載均衡關(guān)乎著整個網(wǎng)站訪問的命脈,所以運(yùn)維人員對于它的處理機(jī)制和高可用的重視非常高善涨,負(fù)載均衡存在單點(diǎn)故障無疑是對整個網(wǎng)站埋下了定時炸彈其骄,nginx +keeplive實(shí)現(xiàn)負(fù)載高可用,保障業(yè)務(wù)持續(xù)提供服務(wù)避免負(fù)載均衡的單點(diǎn)故障腊满。
2. 資源說明
角色? ? ? ? ? ? ? ? IP地址? ? ? ? ? ? ? ? 主機(jī)名
負(fù)載01? ? ? ? ? ? 10.0.0.2? ? ? ? ? ? ? ?LB01
負(fù)載02? ? ? ? ? ? 10.0.0.3? ? ? ? ? ? ? ?LB02
虛擬服務(wù)? ? ? ? ?10.0.0.4? ? ? ? ? ? ? ? ? ? ? ?
??
? ? ? 兩臺nginx負(fù)載均衡+keepalive實(shí)現(xiàn)負(fù)載高可用兩臺LB的IP地址分別為:10.0.0.2套么、10.0.0.3 keepalive的vip為:10.0.0.4,當(dāng)10.0.0.2正常在vip工作在10.0.0.2,10.0.0.3服務(wù)出現(xiàn)宕機(jī)則vip自動跳轉(zhuǎn)到10.0.0.3的LB
3.nginx負(fù)載配置
LB01的配置
[root@wencqlb-01 ~]# cat /etc/nginx/conf.d/lb01.conf
?upstream node {
?server 10.0.0.5:80;
?server 10.0.0.6:80;
}
server { listen 80;
?server_name 10.0.0.4;
?location / {
?proxy_pass http://node;
?include proxy_params;
?}
}
LB02的配置
[root@wencqlb02 ~]# cat /etc/nginx/conf.d/lb02.conf
?upstream node {
?server 10.0.0.5:80;
?server 10.0.0.6:80;
}
server {
?listen 80;
?server_name 10.0.0.4;
?location / {proxy_pass http://node;
?include proxy_params;
?}
}
4.keepalive配置
lb01
[root@wencqlb-01 conf.d]# yum install keepalived -y ##安裝keepalive
[root@wencqlb-01 ~]# cat /etc/keepalived/keepalived.conf?
global_defs {?
? ? ? router_id lb01?
}
vrrp_instance VI_1 {?
? ?state MASTER
? ? interface eth0?
? ?virtual_router_id 50
? ? priority 150
? ? advert_int 1
? ? authentication {?
? ? ? ?auth_type PASS
? ? ? ?auth_pass 1111
}?
? ?virtual_ipaddress {?
? ? ? ?10.0.0.4
? ? }
}
[root@wencqlb-01 conf.d]# systemctl start keepalived.service ##啟動keepalive
[root@wencqlb-01 conf.d]# systemctl enable keepalived.service ##開機(jī)自啟?
? ? 我們可以看見兩臺LB中的負(fù)載配置相同,server name為vip,當(dāng)請求到達(dá)vip所在的LB服務(wù)器則會代理到對應(yīng)的node池進(jìn)行負(fù)載均衡碳蛋,通過keepalive的vip漂移為我們的服務(wù)提供高可用汛蝙,保障網(wǎng)站7*24提供服務(wù)
lb02
[root@wencqlb-01 conf.d]# yum install keepalived -y
[root@wencqlb02 ~]# cat /etc/keepalived/keepalived.conf
bal_defs {
?router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
?interface eth0
virtual_router_id 50
?priority 100
?advert_int 1
?authentication {
auth_type PASS
?auth_pass 1111
?}
?virtual_ipaddress {
10.0.0.4
}
}
[root@wencqlb02 conf.d]# systemctl start keepalived.service
[root@wencqlb02 conf.d]# systemctl enable? keepalived.servicekeeplive
5.演示
? ? ? ? ?通過演示視頻我們模擬LB01宕機(jī)边翼,發(fā)現(xiàn)vip漂移至第二臺LB并且這個切換對于用戶是無感知的黎炉,今天nginx+keepalive的測試就到這里謝謝桃煎!
6.keepalive防止腦裂
主備服務(wù)器因?yàn)橛布蛘哕浖栴}(網(wǎng)線松動或者nginx進(jìn)程)造成keepalived服務(wù)無法檢測到心跳信息零蓉,nginx服務(wù)down掉keepalive還在正常運(yùn)行沒有進(jìn)行主備切換等等都會造成高可用沒有達(dá)到理想的效果我們可以通過主備機(jī)腳本來規(guī)避這些因素造成keepalive無法正常主備切換
備機(jī)檢測原理
????主機(jī)能不通穷缤,VIP在備機(jī)則認(rèn)為非正常主備切換可能主機(jī)狀態(tài)正常vip在主備機(jī)都存在
#!/bin/bash
LB01_vip=10.0.0.3
LB01_ip=10.0.0.5
while true;do
?????ping -c 2 -W 3 $LB01_ip &>/dev/null
#1.主機(jī)存活檢測
if [ $? -ne 0 -a `ip add|grep "$LB01_vip"|wc -l` -eq 1 ];then
#2.判斷主機(jī)down并且vip在備機(jī)發(fā)送郵件告知管理員
? ? ? ? ? echo "HA is split brain"? | mail -s LB-HA wen799923@163.com??
else?? ? ? ?
????????????echo "HA is ok"? ? ??
fi
sleep 5
done?
主機(jī)檢測原理
判斷主機(jī)nginx服務(wù)是否正常,如果nginx服務(wù)down掉嘗試啟動津肛,如果nginx嘗試啟動未成功則停掉主機(jī)keepalive服務(wù)切換至備機(jī)保證業(yè)務(wù)正常運(yùn)行??
#!/bin/bash
?nginxpid=$(ps -C nginx --no-header|wc -l)
?#1.判斷Nginx是否存活,如果不存活則嘗試啟動Nginx
if [ $nginxpid -eq 0 ];then
?systemctl start nginx
?sleep 3
?#2.等待3秒后再次獲取一次Nginx狀態(tài)
?nginxpid=$(ps -C nginx --no-header|wc -l)
?#3.再次進(jìn)行判斷, 如Nginx還不存活則停止Keepalived,讓地址進(jìn)行漂移,并退出腳本
?if [ $nginxpid -eq 0 ];then
?systemctl stop keepalived
?fi
fi? ??
總結(jié)
通過以上兩個腳本檢測章喉,我們能夠做到規(guī)避主備之間心跳檢測不正常,但是主備機(jī)服務(wù)正常會存在主備之間都會有VIP導(dǎo)致負(fù)載腦裂的問題以及負(fù)載服務(wù)down掉快耿,keepalive服務(wù)正常導(dǎo)致業(yè)務(wù)中斷問題囊陡。