Keepalived軟件起初是專為L(zhǎng)VS負(fù)載均衡軟件設(shè)計(jì)的誊垢,用來管理并監(jiān)控LVS集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài)悔捶,后來又加入了可以實(shí)現(xiàn)高可用的VRRP功能响迂。因此拜马,Keepalived除了能夠管理LVS軟件外渗勘,還可以作為其他服務(wù)(例如:Nginx、Haproxy一膨、MySQL等)的高可用解決方案軟件呀邢。
高可用協(xié)議
Keepalived軟件主要是通過VRRP協(xié)議實(shí)現(xiàn)高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗余協(xié)議)的縮寫豹绪,VRRP出現(xiàn)的目的就是為了解決靜態(tài)路由單點(diǎn)故障問題的价淌,它能夠保證當(dāng)個(gè)別節(jié)點(diǎn)宕機(jī)時(shí),整個(gè)網(wǎng)絡(luò)可以不間斷地運(yùn)行瞒津。
VRRP ,全 稱 Virtual Router Redundancy Protocol ,中文名為虛擬路由冗余協(xié)議 蝉衣,VRRP的出現(xiàn)就是為了解決靜態(tài)踣甶的單點(diǎn)故障問題,VRRP是通過一種競(jìng)選機(jī)制來將路由的任務(wù)交給某臺(tái)VRRP路由器的巷蚪。
1) VRRP是通過一種竟選協(xié)議機(jī)制來將路由任務(wù)交給某臺(tái) VRRP路由器的病毡。
2) VRRP用 IP多播的方式(默認(rèn)多播地址(224.0.0.18))實(shí)現(xiàn)高可用對(duì)之間通信。
3) 工作時(shí)主節(jié)點(diǎn)發(fā)包屁柏,備節(jié)點(diǎn)接包啦膜,當(dāng)備節(jié)點(diǎn)接收不到主節(jié)點(diǎn)發(fā)的數(shù)據(jù)包的時(shí)候,就啟動(dòng)接管程序接管主節(jié)點(diǎn)的開源淌喻。備節(jié)點(diǎn)可以有多個(gè)僧家,通過優(yōu)先級(jí)競(jìng)選,但一般 Keepalived系統(tǒng)運(yùn)維工作中都是一對(duì)裸删。
虛擬IP配置
master
global_defs { #全局定義
# notification_email { #定義郵件
# alvin@126.com #定義郵件地址
# }
# notification_email_from alvin@126.com #定義郵件地址
# smtp_server mail.126.com #郵件服務(wù)器
# smtp_connect_timeout 30 #郵件超時(shí)時(shí)間
router_id LVS_DEVEL_1 #route_id標(biāo)識(shí)
}
vrrp_instance VI_1 { #定義VRR組八拱,
state MASTER #定義為MASTER主
interface ens33 #對(duì)外訪問的網(wǎng)絡(luò)接口
virtual_router_id 100 #虛擬路由標(biāo)識(shí)。注意主從要一致
priority 150 #主從優(yōu)先級(jí)涯塔,主的優(yōu)先級(jí)要高于從肌稻。注意
advert_int 1 #:廣播周期秒數(shù)
authentication {
auth_type PASS
auth_pass 2209
}
virtual_ipaddress {
192.168.112.137/32 dev ens33 #:虛擬VIP地址,真實(shí)環(huán)境這里應(yīng)該是公網(wǎng)IP
}
slave
global_defs { #全局定義
# notification_email { #定義郵件
# alvin@126.com #定義郵件地址
# }
# notification_email_from alvin@126.com #定義郵件地址
# smtp_server mail.126.com #郵件服務(wù)器
# smtp_connect_timeout 30 #郵件超時(shí)時(shí)間
router_id LVS_DEVEL_2 #route_id標(biāo)識(shí)不可與master相同
}
vrrp_instance VI_1 { #定義VRR組匕荸,
state BACKUP #定義為BACKUP
interface ens33 #對(duì)外訪問的網(wǎng)絡(luò)接口
virtual_router_id 100 #虛擬路由標(biāo)識(shí)爹谭。主從要*一致*
priority 100 #主從優(yōu)先級(jí),主的優(yōu)先級(jí)要高于從榛搔。注意
advert_int 1 #:廣播周期秒數(shù)
authentication {
auth_type PASS
auth_pass 2209
}
virtual_ipaddress {
192.168.112.137/32 dev ens33 #:虛擬VIP地址旦棉,真實(shí)環(huán)境這里應(yīng)該是公網(wǎng)IP
}
注意
1.配置時(shí)不要把主從IP弄混淆齿风。(我做的蠢事是,明明是配置兩個(gè)機(jī)器绑洛,結(jié)果在xshell中把一個(gè)IP設(shè)置為兩個(gè)登錄名救斑,結(jié)果就很尷尬,好似見鬼了)
2.做高可用時(shí)應(yīng)注意幾臺(tái)機(jī)器必須有一臺(tái)是MASTER真屯,否則會(huì)出現(xiàn)虛擬IP獲取不到的現(xiàn)象脸候。
3.配置啟動(dòng)時(shí),應(yīng)先啟動(dòng)master绑蔫,如果先啟動(dòng)backup运沦,backup不會(huì)有虛擬IP,只有master獲取到虛擬IP后vrrp的通訊才會(huì)開始配深,之后再關(guān)閉master携添,backup 就會(huì)獲取到虛擬IP了。
lvs(負(fù)載均衡配置)
負(fù)載均衡的配置主從配置是一樣的篓叶,本次事例配置lvs的DR模式烈掠,DR模式是互聯(lián)網(wǎng)使用最多的形式。
特點(diǎn)
當(dāng)一個(gè)client發(fā)送一個(gè)請(qǐng)求到VIP缸托,Director根據(jù)VIP選擇對(duì)應(yīng)的real-server的Pool左敌,根 據(jù)算法,在Pool中選擇一臺(tái)Real-server俐镐,然后將client的請(qǐng)求包發(fā)給選擇的Real-server矫限,最后選擇的Real-server 應(yīng) 答包直接傳給client ip。
Director端配置
1開啟端口轉(zhuǎn)發(fā)
[root@keepalived-master ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@keepalived-master ~]# sysctl -p
net.ipv4.ip_forward = 1
keepalived.conf
virtual_server 192.168.112.137 80 { #:虛擬VIP地址 與 端口佩抹,DR架構(gòu)WEB端口要和虛擬端口監(jiān)聽一致叼风。否則將無法訪問
delay_loop 6 #健康檢查時(shí)間間隔,單位是秒
lb_algo rr #調(diào)用算法為RR
lb_kind DR #調(diào)用架構(gòu)模式為DR
persistence_timeout 50 #:同一IP 50秒內(nèi)的請(qǐng)求都發(fā)到同個(gè)real server
protocol TCP #使用TCP協(xié)議
real_server 192.168.112.135 80 {
weight 1 #:轉(zhuǎn)發(fā)伐值棍苹,越高調(diào)用的越多
TCP_CHECK {
connect_timeout 10 #:連接超時(shí)為10秒
nb_get_retry 3
delay_before_retry 3
connect_port 80 #連接端口為80无宿,要和上面的保持一致
}
}
查看配置是否成功
[root@keepalived-master ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.112.137:80 0 0 0 0 0
-> 192.168.112.135:80 0 0 0 0 0
real-server端配置
配置腳本
[root@keepalived_backup ~]# cat realserver.sh
#!/bin/bash
# Written by NetSeek
# description: Config realserver lo and apply noarp
WEB_VIP="192.168.112.137"
. /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP
/sbin/route add -host $WEB_VIP dev lo:0
####后面四句的配置是忽略arp的響應(yīng)和應(yīng)答,由于配置的虛擬IP在回環(huán)口廊勃,mac地址是不對(duì)的。如果配置為0將會(huì)報(bào)錯(cuò)经窖,轉(zhuǎn)發(fā)模式無法進(jìn)行坡垫。
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $WEB_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $web_VIP`
if [ ! "$islothere" -o ! "isrothere" ]
then
echo "LVS-DR real server Stopped."
else
echo "LVS-DR Running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac
exit 0
啟動(dòng)腳本
[root@keepalived_backup ~]# . realserver.sh start
配置時(shí)的注意事項(xiàng)
1.lsof無法檢測(cè)配置是否成功,因?yàn)閐irector不會(huì)開啟響應(yīng)端口画侣。
2.director要直接能轉(zhuǎn)發(fā)到(直連)real-server冰悠,不要經(jīng)過路由器或其他服務(wù)器跳轉(zhuǎn)。