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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM