簡(jiǎn)介
上一篇文章學(xué)習(xí)了一些KeepAlive基礎(chǔ),了解到KeepAlive使用VRRP協(xié)議實(shí)現(xiàn)高可用,主要有兩個(gè)功能,分別是管理LVS的后端RealServer以及對(duì)Director的高可用,現(xiàn)在我們把這兩個(gè)功能分開(kāi),先來(lái)對(duì)KeepAlived的高可用做實(shí)驗(yàn)。另外說(shuō)下KeepAlived的常見(jiàn)工作模式。
- 主/備模式:即單實(shí)例模式
- 主/主模式:即多實(shí)例模式,也稱雙主模型, 即在配置文件中加入第二個(gè)虛擬IP,但是2個(gè)VIP所做的事情是一樣的,這樣的好處在于,能在實(shí)現(xiàn)高可用的同時(shí),還能實(shí)現(xiàn)負(fù)載均衡的目的。
單實(shí)例模型的高可用
拓?fù)鋱D
.png)
2臺(tái)KeepAlived的服務(wù)器共同維護(hù)一個(gè)實(shí)例,默認(rèn)A為MASTER,B為BACKUP當(dāng)A發(fā)生故障后,由B接替。
同步時(shí)間:
[root@dr1 ~]# vim /etc/chrony.conf
server ntp1.aliyun.com iburst #修改為阿里云的時(shí)間服務(wù)器
server ntp2.aliyun.com iburst
[root@dr2 ~]# vim /etc/chrony.conf
server ntp1.aliyun.com iburst #修改為阿里云的時(shí)間服務(wù)器
server ntp2.aliyun.com iburst
安裝keepalive
[root@dr1 ~]# yum install keepalived -y
[root@dr2 ~]# yum install keepalived -y
清空防火墻規(guī)則和關(guān)閉SELINUX
[root@dr1 ~]# iptables -F
[root@dr2 ~]# iptables -F
對(duì)默認(rèn)的配置文件先做一個(gè)備份
[root@dr1 keepalived]# cp keepalived.conf{,.bak}
[root@dr2 keepalived]# cp keepalived.conf{,.bak}
編輯配置文件
DR1的配置
! Configuration File for keepalived
global_defs {
notification_email { #報(bào)警郵件
root@localhost #收件人地址
}
notification_email_from keepalive@localhost #發(fā)件人地址
smtp_server 127.0.0.1 #smtp服務(wù)器
smtp_connect_timeout 30 #超時(shí)時(shí)間
router_id DR1 #用于標(biāo)識(shí)該機(jī)器的RID,應(yīng)當(dāng)是唯一的
vrrp_garp_master_repeat 1 #當(dāng)轉(zhuǎn)換為MASTER狀態(tài)時(shí),在一組中一次發(fā)送的免費(fèi)ARP數(shù)量。默認(rèn)是5
vrrp_mcast_group4 224.0.1.11 #用于發(fā)送和接受VRRP協(xié)議的組播地址
}
vrrp_instance VI_1 {
state MASTER #指定為MASTER
interface ens33 #綁定在哪個(gè)網(wǎng)卡上
virtual_router_id 51 #用于識(shí)別實(shí)例的VRID,同一實(shí)例中的VRID應(yīng)當(dāng)是相同的
priority 100 #優(yōu)先級(jí)
advert_int 1 #通告發(fā)送間隔
authentication { #認(rèn)證
auth_type PASS
auth_pass abc123
}
virtual_ipaddress { #VIP設(shè)置
172.16.1.99/24 dev ens33 label ens33:0
}
}
DR2的配置
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalive@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id DR2
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 224.0.1.11
vrrp_garp_master_repeat 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 96
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
172.16.1.99/24 dev ens33 label ens33:0
}
}
抓包分析
在BACKUP的節(jié)點(diǎn)上對(duì)組播IP地址抓包,能抓到MASTER發(fā)過(guò)來(lái)的報(bào)文
[root@dr2 keepalived]# tcpdump -i ens33 -nn host 224.0.1.11
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
16:13:24.656748 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
16:13:25.658750 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
測(cè)試能否冗余
在MASTER上把KeepAlived服務(wù)停掉,查看故障轉(zhuǎn)移是否工作正常
未轉(zhuǎn)移前的狀態(tài)信息:
[root@dr2 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service;
7月 02 16:25:20 dr2 Keepalived_vrrp[16878]: Registering gratuitous ARP shared channel
7月 02 16:25:20 dr2 Keepalived_vrrp[16878]: Opening file '/etc/keepalived/keepalived.conf'.
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) removing protocol VIPs.
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: Using LinkWatch kernel netlink reflector...
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Entering BACKUP STATE
7月 02 16:25:30 dr2 Keepalived_vrrp[16878]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
把MASTER停止后,BACKUP的狀態(tài)信息
7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Entering MASTER STATE #轉(zhuǎn)換為MASTER狀態(tài)
7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) setting protocol VIPs. #設(shè)置VIP
7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: Sending gratuitous ARP on ens33 for 172.16.1.99
7月 02 16:30:26 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for....1.99 #在ens33上發(fā)送免費(fèi)ARP
7月 02 16:30:31 dr2 Keepalived_vrrp[16878]: Sending gratuitous ARP on ens33 for 172.16.1.99
7月 02 16:30:31 dr2 Keepalived_vrrp[16878]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for....1.99
Hint: Some lines were ellipsized, use -l to show in full.
轉(zhuǎn)換時(shí)的抓包信息
[root@dr2 ~]# tcpdump -i ens33 -nn host 224.0.1.11
#以下是MASTER發(fā)出的VRRP通告,priorty為100
16:30:21.716547 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20
#當(dāng)STOP掉MASTER的KeepAlived后,MASTER發(fā)出一個(gè)優(yōu)先級(jí)為0的通告
16:30:25.026892 IP 192.168.30.99 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 0, authtype simple, intvl 1s, length 20
#隨即,BACKUP就會(huì)搶掉該實(shí)例的MASTER位置
16:30:25.653251 IP 192.168.30.98 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 96, authtype simple, intvl 1s, length 20
#轉(zhuǎn)為MASTER后,一直發(fā)出通告,此時(shí)priorty為96
16:30:26.655380 IP 192.168.30.98 > 224.0.1.11: VRRPv2, Advertisement, vrid 51, prio 96, authtype simple, intvl 1s, length 20
自定義報(bào)警腳本
腳本內(nèi)容:
#!/bin/bash
#
sendto=root@localhost
notify() {
subject="$(hostname) to be $1 ,vip floating"
body="$(date +%F" "%T):VRRP transition $(hostname) to be $1"
echo "$body" | mail -s "$subject" $sendto
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
寫(xiě)好后,在vrrp實(shí)例中調(diào)用。
[root@dr1 keepalived]# vim keepalived.conf
vrrp_instance VI_1 {
notify_master "/etc/keepalived master"
notify_backup "/etc/keepalived backup"
notify_fault "/etc/keepalived fault"
}
當(dāng)發(fā)生狀態(tài)切換時(shí),能夠能夠發(fā)送郵件
[root@dr1 keepalived]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 3 messages 2 unread
>U 1 root Mon Jul 2 17:36 19/667 "dr1 to be master ,vip floating"
U 2 root Mon Jul 2 17:38 19/667 "dr1 to be backup ,vip floating"
3 root Mon Jul 2 17:40 19/668 "dr1 to be master ,vip floating"
使用腳本更好的調(diào)試KeepAlived
在調(diào)試中,可能需要對(duì)KeepAlived進(jìn)行多次轉(zhuǎn)移操作,此時(shí)可以預(yù)先設(shè)置一個(gè)腳本,如果腳本返回非0值,則減少該實(shí)例的優(yōu)先級(jí),可以讓BACKUP搶占。
首先定義一個(gè)腳本
[root@dr1 keepalived]# vim chk_down.sh
#!/bin/bash
[ -f /etc/keepalived/down ] && exit 1 || exit 0
#此腳本的作用就是檢查/etc/keepalived/是否存在down這個(gè)文件,如果存在則返回1,如果不存在此文件則返回0
在配置中定義一個(gè)腳本,并調(diào)用(單獨(dú)一個(gè)新的上下文定義)
[root@dr1 keepalived]# vim keepalived.conf
vrrp_script chk_down {
script "/etc/keepalived/chk_down.sh" #檢查/etc/keepalived/是否有down文件,如果有,則返回exit1,如果不存在則返回0
interval 1 #檢查間隔
weight -5 #當(dāng)檢查失敗,腳本返回非0值,即-5的優(yōu)先級(jí)
}
定義好后,在實(shí)例中啟用腳本
vrrp_instance VI_1 {
track_script { #追蹤此腳本
chk_down
}
}
當(dāng)在當(dāng)前節(jié)點(diǎn)上面的/etc/keepalived目錄下創(chuàng)建了一個(gè)叫down的文件,keepalived在執(zhí)行腳本的時(shí)候?qū)?huì)檢查出,并且根據(jù)事先定義好的腳本規(guī)則,把優(yōu)先級(jí)-5,小于BACKUP的優(yōu)先級(jí),BACKUP將會(huì)搶占該實(shí)例的MASTER位置;同理,如果刪除該文件后,優(yōu)先級(jí)將會(huì)+5,這時(shí),就會(huì)搶回MASTER位置。
雙主模型

簡(jiǎn)介
雙主模型簡(jiǎn)單來(lái)說(shuō)就是增加多一個(gè)實(shí)例,使用不同的VIP,如圖所示,在實(shí)例1(VIP1)中,A為主(MASTER)B為備(BACKUP),在實(shí)例2(VIP2)中,A為備,B為主。
配置
在ServerA上增加一個(gè)實(shí)例,設(shè)置為備
[root@dr1 keepalived]# vim keepalived.conf
vrrp_instance VI_2 {
state BACKUP #設(shè)置為BACKUP
interface ens33 #一個(gè)網(wǎng)卡能綁定多個(gè)實(shí)例。
virtual_router_id 52 #VRID不同實(shí)例不能一樣
priority 96 #優(yōu)先級(jí)
advert_int 1 #VRRP報(bào)文的通告間隔
authentication { #認(rèn)證相關(guān)
auth_type PASS
auth_pass ABC123
}
virtual_ipaddress { #設(shè)置虛擬IP
172.16.1.98/24 dev ens33 label ens33:1
}
track_script {
chk_down
}
#notify_master "/etc/keepalived/notify.sh master"
##notify_backup "/etc/keepalived/notify.sh backup"
#notify_fault "/etc/keepalived/notify.sh fault"
}
把配置復(fù)制到ServerB上,修改相應(yīng)配置
[root@dr2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass ABC123
}
virtual_ipaddress {
172.16.1.98/24 dev ens33 label ens33:1
}
track_script {
chk_down
}
#notify_master "/etc/keepalived/notify.sh master"
##notify_backup "/etc/keepalived/notify.sh backup"
#notify_fault "/etc/keepalived/notify.sh fault"
}
重啟服務(wù)
[root@dr1 ~]# systemctl restart keepalived
[root@dr2 ~]# systemctl restart keepalived
分別查看ServerA和ServerB的IP情況
[root@dr1 keepalived]# ifconfig #ServerA
...
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.99 netmask 255.255.255.0 broadcast \
[root@dr2 ~]# ifconfig #ServerB
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.98 netmask 255.255.255.0 broadcast 0.0.0.0
ether 00:0c:29:1e:7a:1a txqueuelen 1000 (Ethernet)
測(cè)試
先來(lái)檢查ServerA的172.16.1.99故障轉(zhuǎn)移能否工作
在前面已經(jīng)指定了腳本,在此目錄下一旦有名字down的文件,優(yōu)先級(jí)將會(huì)減少5。此時(shí)BACKUP會(huì)搶占MASTER位置
在ServerA的/etc/keepalived/目錄下新建down文件
[root@dr1 keepalived]# touch down
此時(shí),實(shí)例1的VIP已經(jīng)轉(zhuǎn)移到了ServerB上
[root@dr2 ~]# tail -n 10 /var/log/messages
Jul 2 22:40:46 node1 Keepalived_vrrp[21878]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul 2 22:40:47 node1 Keepalived_vrrp[21878]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul 2 22:40:47 node1 Keepalived_vrrp[21878]: VRRP_Instance(VI_1) setting protocol VIPs.
把ServerA的down文件刪除,此時(shí)ServerA會(huì)重新?lián)屨紝?shí)例1 MASTER的位置
[root@dr1 keepalived]# tail -n 10 /var/log/messages
Jul 2 22:43:37 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul 2 22:43:38 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul 2 22:43:38 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_1) setting protocol VIPs.
Jul 2 22:43:38 node1 Keepalived_vrrp[24055]: Sending gratuitous ARP on ens33 for 172.16.1.99
接下來(lái)再來(lái)檢查ServerB的172.16.1.98故障轉(zhuǎn)移能否工作。
在ServerB的/etc/keepalived/目錄下新建down文件
[root@dr2 keepalived]# touch down
此時(shí),實(shí)例2的VIP已經(jīng)轉(zhuǎn)移到了ServerA上
[root@dr1 keepalived]# tail /var/log/messages
Jul 2 22:46:12 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) forcing a new MASTER election
Jul 2 22:46:13 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) Transition to MASTER STATE
Jul 2 22:46:14 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) Entering MASTER STATE
Jul 2 22:46:14 node1 Keepalived_vrrp[24055]: VRRP_Instance(VI_2) setting protocol VIPs.
Jul 2 22:46:14 node1 Keepalived_vrrp[24055]: Sending gratuitous ARP on ens33 for 172.16.1.98