Nginx一般用來做服務網(wǎng)關囊咏,雖然Nginx的性能非常高,但是還是有宕機的風險,所以Nginx的高可用也是我們需要考慮的。常見的Nginx的高可用方案是使用keepalived
浮動IP技術來實現(xiàn)络拌。
通過keepalived
虛擬一個vip
出來作為虛擬網(wǎng)關,所有請求都先通過虛擬網(wǎng)關找到真正網(wǎng)關回溺,再往下走。當主宕機了后混萝,從會接過主的責任對外提供服務遗遵,當主復活后從又會將權限還給主,如圖:
keepalived主要功能
- 管理LVS負載均衡軟件
- 實現(xiàn)LVS集群節(jié)點的健康檢查
- 作為系統(tǒng)網(wǎng)絡服務的高可用性(failover)
使用keepalived來監(jiān)控nginx
keepalived
通過shell
腳本的方式來監(jiān)控nginx
的進程數(shù)量逸嘀,從而判斷nginx
是否死掉车要,如果死掉就通過命令重啟Nginx,腳本文件/usr/local/src/chk_nginx_pid.sh
如下:
#!/bin/bash
A=`ps -C nginx --no-header |wc -l` #統(tǒng)計nginx進程數(shù)
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #重啟nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重啟失敗崭倘,則停掉keepalived服務翼岁,進行VIP轉移
killall keepalived #殺掉类垫,vip就漫游到另一臺機器
fi
fi
- 統(tǒng)計nginx進程數(shù) ,如果進程數(shù)為0則重啟nginx琅坡。
- 重啟nginx后重新統(tǒng)計nginx進程數(shù)悉患,如果還是0表示nginx重啟失敗。
- nginx重啟失敗榆俺,則殺掉本機
keepalived
進程售躁,這時虛IP就會浮動到從Nginx服務器上。
keepalived配置
keepalived
需要和nginx
安裝在一臺機器上茴晋,然后打開/etc/keepalived/keepalived.conf
配置keepalived陪捷。
keepalived主:
! Configuration File for keepalived
global_defs {
router_id LVS_1
}
vrrp_script chk_http_port {
script "/usr/local/src/chk_nginx_pid.sh" #心跳執(zhí)行的腳本
interval 2 #(檢測腳本執(zhí)行的間隔,單位是秒)
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0 #系統(tǒng)網(wǎng)卡
virtual_router_id 51 #主備兩機器一致
priority 100 #值大的機器诺擅,勝出
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port #(調用檢測腳本)
}
virtual_ipaddress { #可虛擬多個ip
192.168.244.200
}
}
keepalived從:
! Configuration File for keepalived
global_defs {
router_id LVS_2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.244.200
}
}
主從差異配置只有兩個市袖,如下:
-
state BACKUP
:指定keepalived
的角色,MASTER
為主烁涌,BACKUP
為備苍碟。 -
priority 50
:優(yōu)先級,數(shù)值越大烹玉,處理請求的優(yōu)先級越高驰怎,備用數(shù)字小些。
keepalived腦裂
keepalived
的主節(jié)點會定期往備節(jié)點發(fā)送心跳包二打,當備節(jié)點沒有接收到心跳包的時候县忌,會認為主節(jié)點掛了,那么他就會接過主節(jié)點的責任對外提供服務继效,表現(xiàn)形式就是備節(jié)點上出現(xiàn)了虛擬IP症杏。這時有可能發(fā)生腦裂情況,所以我們還需要通過shell
腳本監(jiān)控keepalived
的腦裂情況瑞信,腳本如下:
#!/bin/bash
# 檢查腦裂的腳本厉颤,在備節(jié)點上進行部署
LB01_VIP=10.10.10.229
LB01_IP=10.10.10.129
LB02_IP=10.10.10.130
while true
do
ping -c 2 -W 3 $LB01_VIP &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then
echo "ha is brain."
else
echo "ha is ok"
fi
sleep 5
done