參考案例二:雙主模式
主備模式的缺點(diǎn)就是始終只有一臺(tái)機(jī)器位于工作狀態(tài),另外一臺(tái)機(jī)器永遠(yuǎn)是備用狀態(tài),存在資源浪費(fèi)之問(wèn)題。
雙主模式允許兩臺(tái)機(jī)器均處于工作狀態(tài)并互相作為備份。
搭建keepalived雙方模式的要素:
1. 必須有兩個(gè)虛擬IP, 分別綁定至兩個(gè)節(jié)點(diǎn)上
2. 每個(gè)節(jié)點(diǎn)作為某個(gè)虛擬IP的主節(jié)點(diǎn),并同時(shí)作為另外一個(gè)虛擬IP的備用節(jié)點(diǎn)。
3. 當(dāng)某個(gè)節(jié)點(diǎn)產(chǎn)生故障時(shí),兩個(gè)虛擬IP自動(dòng)綁定至正常節(jié)點(diǎn)上
參閱相關(guān)文章,這就相當(dāng)于使用兩臺(tái)物理路由器(普通主機(jī)視為路由器即可),構(gòu)造出兩個(gè)虛擬VRRP路由器。

也就是說(shuō),兩個(gè)節(jié)點(diǎn)的配置應(yīng)該是交叉的,對(duì)同個(gè)虛擬IP,交叉互為主備。
節(jié)點(diǎn)A的關(guān)鍵配置:
vrrp_instance vip1 {
state MASTER
interface eth0
virtual_router_id 51 #本機(jī)兩個(gè)vrrp_instance組的此值不能相同,但對(duì)應(yīng)備用節(jié)點(diǎn)的此值必須相同
priority 99 #對(duì)應(yīng)備用節(jié)點(diǎn)值應(yīng)該比此值小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.1 /24
}
}
vrrp_instance vip2 {
state BACKUP
interface eth0
virtual_router_id 52 #本機(jī)兩個(gè)vrrp_instance組的此值不能相同,但對(duì)應(yīng)主節(jié)點(diǎn)的此值必須相同
priority 90 #主節(jié)點(diǎn)的值應(yīng)該比此值大
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.2 /24
}
}
復(fù)制節(jié)點(diǎn)A的配置至B節(jié)點(diǎn),并將MASTER修改為BACKUP, 同時(shí)將BACKUP修改為MASTER。優(yōu)先級(jí)和虛擬路由器組id(virtual_route_id)要特別注意其它配置必須保持相同。
B節(jié)點(diǎn)的配置:
vrrp_instance vip1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.1 /24
}
}
vrrp_instance vip2 {
state MASTER
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.2 /24
}
}
另外,為了保證服務(wù)可靠性,我們應(yīng)該在每個(gè)節(jié)點(diǎn)運(yùn)行shell腳本檢測(cè)本機(jī)的服務(wù)是否正常,一旦檢測(cè)到服務(wù)異常時(shí),停止掉本機(jī)的
keepalived,
如此虛擬IP自動(dòng)轉(zhuǎn)移到備用機(jī)器之上,如每隔3秒檢測(cè)一次本機(jī)服務(wù)狀態(tài),如果連接3次檢測(cè)失敗,則停止掉keepalived實(shí)例。同時(shí)如果本機(jī)服務(wù)是正
常的,但是keepalived沒(méi)有啟動(dòng)(故障恢復(fù)之后),則啟動(dòng)keepalived,以達(dá)到故障恢復(fù)之目的。
check_service.sh文件的內(nèi)容
#!/bin/bash
pidfile=/var/lock/subsys/`basename $0`.pid
if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then
exit 1
fi
trap "rm -fr $pidfile ; exit 0" 1 2 3 15
echo $$ > $pidfile
maxfails=3
fails=0
success=0
while [ 1 ]
do
/usr/bin/wget --timeout=3 --tries=1 http://127.0.0.1/ -q -O /dev/null
if [ $? -ne 0 ] ; then
let fails=$[$fails+1]
success=0
else
fails=0
let success=$[$success+1]
fi
if [ $fails -ge $maxfails ] ; then
fails=0
success=0
#check keepalived is running ? try to stop it
service keepalived status | grep running
if [ $? -eq 0 ] ; then
logger -is "local service fails $maxfails times ... try to stop keepalived."
service keepalived stop 2>&1 | logger
fi
fi
if [ $success -gt $maxfails ] ; then
#check keepalived is stopped ? try to start it
service keepalived status | grep stopped
if [ $? -eq 0 ] ; then
logger -is "service changes normal, try to start keepalived ."
service keepalived start
fi
success=0
fi
sleep 3
done
兩個(gè)節(jié)點(diǎn)上均應(yīng)運(yùn)行此腳本,請(qǐng)將此腳本加入到cron任務(wù)中(此程序已經(jīng)作了單實(shí)例運(yùn)行機(jī)制,加入計(jì)劃任務(wù)的作用就是防止腳本意外中斷后檢測(cè)功能失效),可實(shí)現(xiàn)的功能:
如果本地服務(wù)連續(xù)三次檢測(cè)失敗,就嘗試停止keepalived服務(wù)(如果keepalived處于運(yùn)行狀態(tài))
如果本地服務(wù)連接三次檢測(cè)成功,但keepalived沒(méi)有啟動(dòng),則啟動(dòng)之
關(guān)鍵的執(zhí)行點(diǎn),均已經(jīng)記錄到系統(tǒng)日志中(/var/log/messages)
執(zhí)行crontab -e , 加入以下內(nèi)容:
*/1 * * * * /root/check_service.sh
此腳本的原始文件
下載在Linux公社的1號(hào)FTP服務(wù)器里,下載地址:
FTP地址:ftp://www.
用戶(hù)名:www.
密碼:www.muu.cc
在 2012年LinuxIDC.com\8月\Keepalived配置及典型應(yīng)用案例
下載方法見(jiàn) http://www./thread-1187-1-1.html
停止掉本機(jī)的keepalived, 稍過(guò)一會(huì),就會(huì)keepalived服務(wù)被自動(dòng)啟動(dòng)了(這是因?yàn)楸镜胤?wù)檢測(cè)正常)
停止掉本機(jī)的nginx, 稍過(guò)一會(huì),就會(huì)發(fā)現(xiàn)keepalived服務(wù)也被停止掉了
再啟動(dòng)nginx, 稍過(guò)一會(huì),發(fā)現(xiàn)keepalived也被正常啟動(dòng),并綁定了正確的虛擬IP
我們可根據(jù)具體環(huán)境,將服務(wù)的檢測(cè)功能強(qiáng)化(如檢測(cè)到網(wǎng)關(guān)的連接性),以達(dá)到較好的故障轉(zhuǎn)移效果。
