Linux keepalived與lvs的深刻分析

一)概述
在本篇文章裏,咱們會涉及兩部分內容,一個是LVS,另外一個則是keepalived.
即咱們用LVS和keepalived實現了負載均衡及高可用的服務器.
 
LVS有實現三種IP負載均衡技術和八種鏈接調度算法.而且LVS集羣採用三層結構,即負載調度器,服務器池,共享存儲.
 
1)負載調度器
負載調度器是LVS集羣的惟一入口,它採用IP負載均衡技術,基於內容分發技術或二者並結合.
在IP負載均衡技術中,須要服務器池擁有相同的內容提供相同的服務.當客戶請求到達時,調度器只根據服務器負載狀況和設定調度算法從服務器池中選出一臺機器,將請求轉發給選出的機器,並記錄這個調度.當這個請求的其餘報文到達,也會被轉發到前面選出的服務器.
在基於內容分發技術中,服務器能夠提供不一樣的服務,當客戶請求到達時,調度器可根據請求的內容選擇服務器執行請求.
 
2)服務器池
服務器池也就是real server,是真正處理應用的服務器.
 
3)共享存儲
它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務.
 
 
keepalive
Keepalived在這裏主要用做RealServer的健康狀態檢查以及Master主機和Backup主機之間failover的實現.
 
 
 
二)測試環境介紹
 
負載調度服務器(master): 10.1.1.160
負載調度服務器(slave): 10.1.1.162
vip爲10.1.1.166
 
real server1:10.1.1.163
real server2:10.1.1.164
 
測試機:10.1.1.165
 
以上5臺服務器咱們均安裝debian 5.0.
咱們首先在負載調度服務器10.1.1.160及10.1.1.162安裝lvs及keepalived
在real server安裝apache2.0
 
 
 
 
三)keepalived/lvs的安裝配置
 
 
1)在負載調度服務器(10.1.1.160)安裝keepalived和ipvsadm,以下:
 
安裝keepalived
apt-get install keepalived
 
安裝ipvsadm
apt-get install ipvsadm
 
修改並建立keepalived配置文件以下:
vi /etc/keepalived/keepalived.conf
 
! Configuration File for keepalived
 
global_defs {
router_id LVS_1   
}
 
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
 
virtual_ipaddress {
10.1.1.166
}
}
 
 
virtual_server 10.1.1.166 80 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 60
protocol TCP
real_server 10.1.1.163 80 {
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.1.1.164 80 {
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
注:這裏咱們採用的IP負載均衡技術是DR.
 
 
2)在負載調度服務器(10.1.1.162)安裝keepalived和ipvsadm,以下:
 
安裝keepalived
apt-get install keepalived
 
安裝ipvsadm
apt-get install ipvsadm
 
! 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 {
10.1.1.166
}
}
 
 
virtual_server 10.1.1.166 80 {
delay_loop 6
lb_algo rr
lb_kind DR
# persistence_timeout 60
protocol TCP
real_server 10.1.1.163 80 {
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.1.1.164 80 {
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
 
 
3)配置real server
 
3.1)在real server上建立新的網絡介質,這裏爲lo:0 10.1.1.166
ifconfig lo:0 10.1.1.166 broadcast 10.1.1.166 netmask255.255.255.255 up
 
 
3.2)關閉ARP廣播響應
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
 
 
3.3)安裝apache
apt-get install apache2
 
echo "real server no1" >>/var/www/index.html
 
注:兩臺real server執行一樣的操做.
 
 
 
5)測試
 
5.1)啓動keepalived服務:
 
lvs1:
/etc/init.d/keepalived restart
 
lvs2:
/etc/init.d/keepalived restart
 
 
5.2)測試機測試:
ping 10.1.1.166 
PING 10.1.1.166 (10.1.1.166) 56(84) bytes of data.
64 bytes from 10.1.1.166: icmp_req=1 ttl=64 time=0.225 ms
64 bytes from 10.1.1.166: icmp_req=2 ttl=64 time=0.179 ms
64 bytes from 10.1.1.166: icmp_req=3 ttl=64 time=0.163 ms
64 bytes from 10.1.1.166: icmp_req=4 ttl=64 time=0.226 ms
64 bytes from 10.1.1.166: icmp_req=5 ttl=64 time=0.218 ms
 
在lvs1上抓包以下:
tcpdump -p icmp -i eth0 
tcpdump: verbose output suppressed, use -v or -vv for full protocoldecode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes
09:45:12.572695 IP 10.1.1.165 > 10.1.1.166: ICMPecho request, id 17181, seq 4, length 64
09:45:12.572713 IP 10.1.1.166 > 10.1.1.165: ICMPecho reply, id 17181, seq 4, length 64
09:45:13.572693 IP 10.1.1.165 > 10.1.1.166: ICMPecho request, id 17181, seq 5, length 64
09:45:13.572708 IP 10.1.1.166 > 10.1.1.165: ICMPecho reply, id 17181, seq 5, length 64
09:45:14.572724 IP 10.1.1.165 > 10.1.1.166: ICMPecho request, id 17181, seq 6, length 64
09:45:14.572741 IP 10.1.1.166 > 10.1.1.165: ICMPecho reply, id 17181, seq 6, length 64
09:45:15.572738 IP 10.1.1.165 > 10.1.1.166: ICMPecho request, id 17181, seq 7, length 64
09:45:15.572756 IP 10.1.1.166 > 10.1.1.165: ICMPecho reply, id 17181, seq 7, length 64
09:45:16.572694 IP 10.1.1.165 > 10.1.1.166: ICMPecho request, id 17181, seq 8, length 64
09:45:16.572710 IP 10.1.1.166 > 10.1.1.165: ICMPecho reply, id 17181, seq 8, length 64
說明如今lvs是在lvs1的服務器.
 
 
 
 
四)keepalived主/從通信分析
 
 
1)vrrp協議與主/從切換機制
 
keepalived的master與slave是經過vrrp2協議進行通信.以決定各自的狀態及vip等相關信息,MASTER會發送廣播包,廣播地址爲224.0.0.18.
咱們經過抓包以下:
tcpdump -X -n -vvv 'dst 224.0.0.18'
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capturesize 65535 bytes
09:43:04.295639 IP (tos 0x0, ttl 255, id 51508, offset 0, flags[none], proto VRRP (112), length 40)
    10.1.1.160 >224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 200, authtypesimple, intvl 1s, length 20, addrs: 10.1.1.166 auth"1111^@^@^@^@"
0x0000:  4500 0028 c934 0000 ff70 067e 0a01 01a0 E..(.4...p.~....
0x0010:  e000 0012 2133 c801 0101 a7c0 0a01 01a6 ....!3..........
0x0020:  3131 3131 0000 0000                  1111....
09:43:05.295686 IP (tos 0x0, ttl 255, id 55831, offset 0, flags[none], proto VRRP (112), length 40)
    10.1.1.162 >224.0.0.18: VRRPv2, Advertisement, vrid 52, prio 100, authtypesimple, intvl 1s, length 20, addrs: 10.1.1.166 auth"1111^@^@^@^@"
0x0000:  4500 0028 da17 0000 ff70 f598 0a01 01a2 E..(.....p......
0x0010:  e000 0012 2134 6401 0101 0bc0 0a01 01a6 ....!4d.........
0x0020:  3131 3131 0000 0000                  1111....
09:43:05.296837 IP (tos 0x0, ttl 255, id 51509, offset 0, flags[none], proto VRRP (112), length 40)
    10.1.1.160 >224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 200, authtypesimple, intvl 1s, length 20, addrs: 10.1.1.166 auth"1111^@^@^@^@"
0x0000:  4500 0028 c935 0000 ff70 067d 0a01 01a0 E..(.5...p.}....
0x0010:  e000 0012 2133 c801 0101 a7c0 0a01 01a6 ....!3..........
0x0020:  3131 3131 0000 0000                  1111....
 
 
以10.1.1.160服務器發廣播數據爲例,以下:
10.1.1.160 > 224.0.0.18: VRRPv2, Advertisement, vrid51, prio 200, authtype simple, intvl 1s, length 20, addrs:10.1.1.166 auth "1111^@^@^@^@"
0x0000:  4500 0028 c934 0000 ff70 067e 0a01 01a0 E..(.4...p.~....
0x0010:  e000 0012 2133 c801 0101 a7c0 0a01 01a6 ....!3..........
0x0020:  3131 3131 0000 0000                  1111....
 
vrrpv2的協議的消息從這裏開始:
0x0014: 2133 c801 0101 a7c0 0a01 01a6 ....!3..........
0x0020: 3131 3131 0000 0000
 
version: 版本號4位,在RFC中定義爲2,因此這裏是2.
type: 類型,4位,目前只定義一種類型,就是Advertisement,表示通告信息,取值爲1.因此這裏是1
VirtualID:虛擬路由器ID,8位,由於在lvs1中的keepalived定義的virtual_router_id爲51,因此轉換爲16進制就是33.
Priority:優先級,8位,由於在lvs1中的keepalived定義的Priority爲200,因此轉換爲16進制就是C8
count ip addrs:VRRP包中的IP地址數量,8位.這裏只有一個ip地址,因此就是01
authtype:認證類型,8位,在RFC3768中認證功能已經取消.因此該字段爲01,其實這樣只對老版本的兼容.若是取消則爲00.
adver int:通告包的發送間隔時間,缺省爲1秒,咱們的配置也是1秒,因此這裏的值爲01
checksum:檢驗和,16位.這裏的校驗數據範圍只是VRRP數據,並不包括IP頭.
ip address:vip地址,這裏是16位,咱們的vip地址爲10.1.1.166,因此轉換爲十六進制就是0a0101a6
auth data:驗證的密碼,密碼的最大長度爲8個字符,也就是32位,不足32位的,以0補全,因此這裏就是3131 31310000 0000
 
 
2)keepalived的vrrp配置
 
這裏是master的配置,以下: 
! Configuration File for keepalived
 
global_defs {
router_id LVS1
}
 
 
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 200
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
 
virtual_ipaddress {
10.1.1.166
}
}
 
 
這裏是backup的配置,以下:
! Configuration File for keepalived
 
global_defs {
router_id LVS2
}
 
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority  90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
 
virtual_ipaddress {
10.1.1.166
}
}
 
注:
global_defs{}是全局配置.
router_id是虛擬路由器ID,能夠是任意值,建議是當前的主機名.
 
vrrp_instance 實例名{}是配置VRRP的實例,咱們這裏只作最基本的介紹.
state MASTER:表明當前的keepalived所在的服務器是主機仍是備用機.若是是備用機則用BACKUP.
 
問題一:
若是咱們這裏兩臺機器都是MASTER,誰是主誰是備呢?
答案是要看兩臺機器的優先級(priority配置項).state並不在vrrp協議中定義,因此決定權在priority配置項.
下面是把兩臺機器的keepalived都改爲MASTER.以下:
 
lvs1:
Sep  6 13:45:45 10 kernel: [ 7290.447277] IPVS:sync thread started: state = MASTER, mcast_ifn = eth0, syncid =51
Sep  6 13:45:46 10 Keepalived_vrrp:VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  6 13:45:47 10 Keepalived_vrrp:VRRP_Instance(VI_1) Entering MASTER STATE
Sep  6 14:44:57 10 Keepalived_vrrp:VRRP_Instance(VI_1) Received lower prio advert, forcing newelection
 
lvs2:
Sep  6 14:44:56 debian kernel: [536121.748395]IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid= 51
Sep  6 14:44:57 debian Keepalived_vrrp:VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  6 14:44:57 debian Keepalived_vrrp:VRRP_Instance(VI_1) Received higher prio advert
Sep  6 14:44:57 debian Keepalived_vrrp:VRRP_Instance(VI_1) Entering BACKUP STATE
 
注意:
咱們的MASTER在lvs1上,這時將lvs2更改成MASTER,並重啓keepalived,致使有兩個MASTER使用同一個virtul_router_id,因此要經過優先級決定,誰是主,誰是備.
就有了下面的日誌輸出:
lvs1:
Sep  6 14:44:57 10 Keepalived_vrrp:VRRP_Instance(VI_1) Received lower prio advert, forcing newelection
 
lvs2:
Sep  6 14:44:57 debian Keepalived_vrrp:VRRP_Instance(VI_1) Received higher prio advert
Sep  6 14:44:57 debian Keepalived_vrrp:VRRP_Instance(VI_1) Entering BACKUP STATE
 
若是優先級再相同呢?
答案是兩個keepalived都將成爲MASTER,而且也都會配置VIP.這樣會致使地址衝突.
 
 
問題二:
若是MASTER的keepalived被停掉,BACKUP是如何接管的?
 
首先MASTER在運行時會向本網段發送VRRPv2組播報文,以下:
tcpdump -X -n -vvv 'dst 224.0.0.18'
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capturesize 65535 bytes
16:54:47.816024 IP (tos 0x0, ttl 255, id 2250, offset 0, flags[none], proto VRRP (112), length 40)
    10.1.1.160 >224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtypesimple, intvl 1s, length 20, addrs: 10.1.1.166 auth"1111^@^@^@^@"
0x0000:  4500 0028 08ca 0000 ff70 c6e8 0a01 01a0 E..(.....p......
0x0010:  e000 0012 2133 6401 0101 0bc1 0a01 01a6 ....!3d.........
0x0020:  3131 3131 0000 0000                  1111....
注:
組播報文咱們以前分析過.這裏要說明的是BACKUP是不發組播報文的.
 
可是若是MASTER當掉,這時BACKUP在確認沒有收到MASTER的組播報文後,會主動發送組播報文,聲明本身的keepalived狀態,隨後啓用VIP.正式接管keepliaved.
 
 
問題三:
在MASTER被當掉,而又再次啓用後,BACKUP處於什麼狀態,keepalived如何處理?
 
在上面的配置中,若是lvs1當掉,lvs2會接管vip,狀態升級爲MASTER,但若是以前的lvs1恢復後,它會從新接管VIP,並更新狀態爲MASTER.
而lvs2會降級爲BACKUP.
 
有辦法在lvs1恢復後,不切換系統嗎?
答案是確定的.
nopreempt選項會解決這個問題.
 
修改lvs1相關配置以下:
cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
 
global_defs {
router_id LVS1
}
 
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
 
virtual_ipaddress {
10.1.1.166
}
}
這裏修改state爲BACKUP,也就是說兩臺keepalived有兩個BACKUP.
 
修改lvs2相關配置以下:
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
       router_id LVS2
}
 
vrrp_instance VI_1 {
       state BACKUP
       interface eth0
       virtual_router_id 51
       priority  150
       advert_int 1
       nopreempt
       authentication {
              auth_type PASS
              auth_pass 1111
       }
 
virtual_ipaddress {
              10.1.1.166
       }
}
在這裏加入nopreempt選項,同時將優先級調整爲150,即高於lvs1的優先級100.
 
下面咱們模擬backup的切換.
如今MASTER在lvs1上,日誌以下:
Sep  7 10:54:10 10 Keepalived_vrrp:VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  7 10:54:11 10 Keepalived_vrrp:VRRP_Instance(VI_1) Entering MASTER STATE
Sep  7 10:54:11 10 kernel: [80003.605718] IPVS:stopping backup sync thread 5160 ...
Sep  7 10:54:11 10 kernel: [80003.606177] IPVS:sync thread started: state = MASTER, mcast_ifn = eth0, syncid =51
 
咱們關閉lvs1的keepalived服務以下:
/etc/init.d/keepalived stop
 
觀察lvs2的message日誌,以下:
tail -f /var/log/message
Sep  7 10:53:58 debian Keepalived_vrrp:VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  7 10:53:59 debian Keepalived_vrrp:VRRP_Instance(VI_1) Entering MASTER STATE
Sep  7 10:54:06 debian Keepalived_vrrp:Terminating VRRP child process on signal
Sep  7 10:54:06 debian Keepalived_healthcheckers:Terminating Healthchecker child process on signal
 
注:咱們看到lvs2由BACKUP的狀態變爲MASTER.
 
此時咱們開啓lvs1的keepalived服務,以下:
/etc/init.d/keepalived start
 
查看lvs1的日誌,以下:
Sep  7 11:08:52 10 Keepalived_vrrp:VRRP_Instance(VI_1) Entering BACKUP STATE
Sep  7 11:08:52 10 Keepalived_healthcheckers:Using LinkWatch kernel netlink reflector...
Sep  7 11:08:52 10 kernel: [80885.206211] IPVS:sync thread started: state = BACKUP, mcast_ifn = eth0, syncid =51
注:咱們看到lvs1的狀態在重啓keepalived以後依然是BACKUP.
這裏理一下思路:
爲何要配置兩個BACKUP狀態呢?由於要保證互不搶佔.
而爲何一臺要比另外一個的優先級高呢?由於咱們在高優先級的服務器上配置了nopreempt,致使高的優先級也不會搶佔低的優先級.
也就是說只有在一臺keepalived失敗的時候,另外一臺纔會接管.
 
 
interface eth0:表明當前進行vrrp通信的網絡接口卡.
 
 
virtual_router_id:表明組播ID.
事實上在一組MASTER/BACKUP實例中,virtual_router_id必定要相同,若是不一樣,則MASTER/BACKUP都會發送組播數據包.
即vip在兩臺機器上都會生效.致使地址衝突.
 
 
priority 100:表明優先級,即高優先級成爲MASTER.
若是state爲MASTER,而優先級還比另外一臺爲BACKUP的低,那麼它就直接降級爲BACKUP.
優先級不能相同,若是相同,則兩個keepalived都會生效.併發送組播包.
 
 
advert_int 1:VRRP組播週期秒數.
 
將advert_int調整爲5秒,即5秒發一次組播包,以下:
 
tcpdump vrrp
tcpdump: verbose output suppressed, use -v or -vv for full protocoldecode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes
14:14:51.683320 IP 10.1.1.160 > vrrp.mcast.net:VRRPv2, Advertisement, vrid 51, prio 150, authtype simple, intvl5s, length 20
14:14:56.684241 IP 10.1.1.160 > vrrp.mcast.net:VRRPv2, Advertisement, vrid 51, prio 150, authtype simple, intvl5s, length 20
14:15:01.685193 IP 10.1.1.160 > vrrp.mcast.net:VRRPv2, Advertisement, vrid 51, prio 150, authtype simple, intvl5s, length 20
14:15:06.686163 IP 10.1.1.160 > vrrp.mcast.net:VRRPv2, Advertisement, vrid 51, prio 150, authtype simple, intvl5s, length 20
14:15:11.687132 IP 10.1.1.160 > vrrp.mcast.net:VRRPv2, Advertisement, vrid 51, prio 150, authtype simple, intvl5s, length 20
 
這裏注意,若是master/backup的組播週期不一至,好比master爲5秒,backup爲1秒,結果是backup生效,master的keepalived失效,此時只有backup在發組播包.
在master端查看日誌以下:
 
tail -f /var/log/message
Sep  7 14:21:16 10 Keepalived_vrrp: advertissementinterval mismatch mine=5000000 rcved=1
Sep  7 14:21:16 10 Keepalived_vrrp: Sync instanceneeded on eth0 !!!
Sep  7 14:21:16 10 Keepalived_vrrp:VRRP_Instance(VI_1) Dropping received VRRP packet...
 
 
authentication {
auth_type PASS
auth_pass 1111
}
確認MASTER/BACKUP的驗證方式及口令.
注意:若是MASTER/BACKUP口令不一致,會致使keepalived處理失敗,以下:
ep  7 14:34:43 debian Keepalived_vrrp: bogus VRRPpacket received on eth0 !!!
Sep  7 14:34:43 debian Keepalived_vrrp:VRRP_Instance(VI_1) Dropping received VRRP packet...
Sep  7 14:34:44 debian Keepalived_vrrp: receive aninvalid passwd!
 
 
virtual_ipaddress {
10.1.1.166
}
VRRP HA虛擬地址,也就是vip.
這裏要注意的是,VIP在定義域裏能夠有多個,以下:
virtual_ipaddress {
       10.1.1.166
       10.1.1.167
}
查看vip地址,以下:
ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu16436 qdisc noqueue state UNKNOWN 
    link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope hostlo
    inet6 ::1/128 scopehost 
      valid_lft forever preferred_lft forever
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 6c:62:6d:4c:3a:5dbrd ff:ff:ff:ff:ff:ff
    inet 10.1.1.162/24 brd10.1.1.255 scope global eth0
    inet 10.1.1.166/32 scopeglobal eth0
    inet 10.1.1.167/32 scopeglobal eth0
    inet6fe80::6e62:6dff:fe4c:3a5d/64 scope link 
      valid_lft forever preferred_lft forever
 
 
 
五)經過自定義腳本檢查
 
vrrp_script 腳本名稱 {}
咱們能夠經過腳本/命令檢查系統,若是發現執行失敗,則進行master/backup的切換.
 
下面是加了腳本的lvs1,以下:
! Configuration File for keepalived
 
global_defs {
router_id LVS1
}
 
vrrp_script chk_nfs {
   script "/bin/pidof nfsd"
   interval10 
   weight -90  
   fall   3    
   rise   1    
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
preempt_delay 300
 
track_script {
        chk_nfs
       }
 
authentication {
auth_type PASS
auth_pass 1111
}
 
virtual_ipaddress {
10.1.1.166
}
}
 
 
下面是加了腳本的lvs2,以下:
! Configuration File for keepalived
 
global_defs {
       router_id LVS1
}
 
vrrp_script chk_nfs {
   script "/bin/pidof nfsd"
   interval 10 
   weight -90  
   fall   3    
   rise   1    
}
vrrp_instance VI_1 {
       state BACKUP
       interface eth0
       virtual_router_id 51
       priority 100
       advert_int 1
 
       track_script {
              chk_nfs
       }
 
       authentication {
              auth_type PASS
              auth_pass 1111
       }
 
       virtual_ipaddress {
              10.1.1.166
       }
}
注:
1)咱們經過/bin/pidof nfsd檢查系統中是否運行了nfsd服務,檢查的時間間隔爲10秒.
2)若是lvs1(master)腳本運行3次都失敗,keepalived在當前的優先級下減90,若是腳本執行成功,則恢復優先級.
 
測試以下:
咱們在lvs1上關閉nfs服務.
/etc/init.d/nfs-kernel-server stop 
 
查看lvs1日誌,以下:
Sep  7 16:41:22 10 Keepalived_vrrp:VRRP_Instance(VI_1) forcing a new MASTER election
Sep  7 16:41:23 10 Keepalived_vrrp:VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  7 16:41:24 10 Keepalived_vrrp:VRRP_Instance(VI_1) Entering MASTER STATE
Sep  7 16:49:16 10 kernel: [ 5736.924654] nfsd:last server has exited, flushing export cache
Sep  7 16:49:42 10 Keepalived_vrrp:VRRP_Script(chk_nfs) failed
Sep  7 16:49:43 10 Keepalived_vrrp:VRRP_Instance(VI_1) Received higher prio advert
Sep  7 16:49:43 10 Keepalived_vrrp:VRRP_Instance(VI_1) Entering BACKUP STATE
 
此時查看lvs2上面的日誌,以下:
Sep  7 16:49:08 debian Keepalived_vrrp:VRRP_Script(chk_nfs) succeeded
Sep  7 16:49:43 debian Keepalived_vrrp:VRRP_Instance(VI_1) forcing a new MASTER election
Sep  7 16:49:44 debian Keepalived_vrrp:VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  7 16:49:45 debian Keepalived_vrrp:VRRP_Instance(VI_1) Entering MASTER STATE
 
此時啓動lvs1上面的nfs,以下:
/etc/init.d/nfs-kernel-server start
 
查看lvs1日誌,以下:
Sep  7 17:21:52 10 Keepalived_vrrp:VRRP_Script(chk_nfs) succeeded
Sep  7 17:21:52 10 Keepalived_vrrp:VRRP_Instance(VI_1) forcing a new MASTER election
Sep  7 17:21:53 10 Keepalived_vrrp:VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  7 17:21:54 10 Keepalived_vrrp:VRRP_Instance(VI_1) Entering MASTER STATE
注:咱們看到lvs1在這裏提高優先級升級爲MASTER.
相關文章
相關標籤/搜索