Keepalived本質(zhì)就是為ipvs服務(wù)的,它也不需要共享存儲。IPVS其實就是一些規(guī)則,Keepalived主要的任務(wù)就是去調(diào)用ipvsadm命令,來生成規(guī)則,并自動實現(xiàn)將用戶需要訪問的地址轉(zhuǎn)移到可用LVS節(jié)點實現(xiàn)。所以keepalive的高可用是屬于具有很強針對性的高可用,它和corosync這種通用性HA方案不同。
Keepalived的主要目的就是它自身啟動為一個服務(wù),它工作在多個LVS主機節(jié)點上,當(dāng)前活動的節(jié)點叫做Master備用節(jié)點叫做Backup,Master會不停的向Backup節(jié)點通告自己的心跳,這種通告是基于VRRP協(xié)議的。Backup節(jié)點一旦接收不到Master的通告信息,它就會把LVS的VIP拿過來,并且把ipvs的規(guī)則也拿過來,在自己身上生效,從而替代Master節(jié)點。
Keepalived除了可以監(jiān)控和轉(zhuǎn)移LVS資源之外,它還可以直接配置LVS而不需要直接使用ipvsadm命令,因為它可以調(diào)用,也就是說在LVS+KEEPALIVED模型中,你所有的工作在Keepalived中配置就可以了,而且它還有對后端應(yīng)用服務(wù)器健康檢查的功能。
直接一句話Keepalived就是VRRP協(xié)議的實現(xiàn),該協(xié)議是虛擬冗余路由協(xié)議。
VRRP工作原理簡述
那么這個VRRP協(xié)議是干嘛用呢?傳統(tǒng)上來說我們通過一個路由器上網(wǎng),如果故障那就不能用了,如果使用2個路由器,有一個故障你就需要手動的設(shè)置客戶端切換到另外的路由器上,或者使用ARP客戶端也可以實現(xiàn),但總之部署比較麻煩不利于管理,就像下圖:
有沒有一種辦法可以自動轉(zhuǎn)移而省去手動配置呢?我們就可以通過VRRP協(xié)議來實現(xiàn)路由器的故障轉(zhuǎn)移。如下圖:
這里有個問題,VRRP提供一個VIP,它可以來設(shè)定那個路由器是活動節(jié)點,然后出現(xiàn)故障進(jìn)行切換,VIP也隨之對應(yīng)到新的路由器上,但是內(nèi)網(wǎng)是用過MAC地址來尋址的,雖然VIP對應(yīng)到了新的路由器上,可是MAC變了,客戶端的ARP表也沒有更新,所以還是用不了,為了解決這個問題VRRP不但提供VIP還提供VMAC地址,這個VMAC地址是VRRP單獨申請的,大家都可以正常使用。
故障切換的時候雖然改變了后端路由器,但是由于客戶端使用的是VIP和VMAC地址,這樣就不會有任何影響了。
所以Keepalived就是在Linux系統(tǒng)上提供了VRRP功能,當(dāng)然還提供了服務(wù)監(jiān)控功能,比如監(jiān)控后端服務(wù)器的健康檢查、LVS服務(wù)可用性檢查。
VRRP的工作過程是這樣的:
虛擬路由器中的路由器根據(jù)優(yōu)先級選舉出Master,Master路由器通過發(fā)送免費ARP報文,將自己的虛擬MAC地址通告給與它連接的設(shè)備。
Master路由器周期性發(fā)送VRRP報文,以公布自己的配置信息(優(yōu)先級等)和工作狀態(tài)
如果Master故障,虛擬路由器中的Backup路由器將根據(jù)優(yōu)先級重新選舉新的Master
虛擬路由器狀態(tài)切換時,Master路由器由一臺設(shè)備切換會另外一臺設(shè)備,新的Master路由器只是簡單的發(fā)送一個攜帶虛擬MAC地址和虛擬IP的免費ARP報文,這樣就可以更新其他設(shè)備中緩存的ARP信息
Backup路由器的優(yōu)先級高于Master時,由Backup的工作方式(搶占式或者非搶占式)決定是否重新選舉Master。
VRRP還支持認(rèn)證,就是為了防止隨意一個VRRP設(shè)備加入到當(dāng)前的虛擬路由組離來,它提供無認(rèn)證、簡單8位字符串認(rèn)證和MD5認(rèn)證(該認(rèn)證方式Keepalive不支持)。
Keepalive軟件結(jié)構(gòu)
Keepalived啟動后以后會有一個主進(jìn)程Master,它會生成還有2個子進(jìn)程,一個是VRRP Stack負(fù)責(zé)VRRP(也就是VRRP協(xié)議的實現(xiàn))、一個是Checkers負(fù)責(zé)IPVS的后端的應(yīng)用服務(wù)器的健康檢查,當(dāng)檢測失敗就會調(diào)用IPVS規(guī)則刪除后端服務(wù)器的IP地址,檢測成功了再加回來。當(dāng)檢測后端有失敗的情況可以使用SMTP通知管理員。另外VRRP如果檢測到另外一個Keepalive失敗也可以通過SMTP通知管理員。
Control Plane:這個就是主進(jìn)程,主進(jìn)程的功能是分析配置文件,讀取、配置和生效配置文件,指揮那2個子進(jìn)程工作。
WatchDog:看門狗,這個是Linux系統(tǒng)內(nèi)核的一個模塊,它的作用是幫助主進(jìn)程盯著那2個子進(jìn)程,因為主進(jìn)程并不負(fù)責(zé)具體工作,具體工作都是子進(jìn)程完成的。如果子進(jìn)程掛了,那Keepalived就不完整了,所以那2個子進(jìn)程會定期的向主進(jìn)程打開的一個內(nèi)部Unix Socket文件寫心跳信息。如果有某個子進(jìn)程不寫信息了,它就會重啟子進(jìn)程,主進(jìn)程就是讓W(xué)atchDog來監(jiān)控子進(jìn)程的。下面我們就使用Keepalive來做LVS的高可用講解。關(guān)于后端服務(wù)器上的設(shè)置我這里就不說了請看另外一篇博文。
Keepalive安裝和配置
服務(wù)器 | IP地址 | 角色 |
---|---|---|
Srv01 |
172.16.42.100 VIP: 172.16.42.111 |
LVS+Keepalive |
Srv02 |
172.16.42.101 VIP: 192.168.100.1 |
LVS+Keepalive |
Srv03 |
172.16.42.102 VIP: 172.16.42.111 |
Nginx |
Srv04 |
172.16.42.103 VIP: 172.16.42.111 |
Nginx |
先決條件
禁用SElinux、清除iptables規(guī)則、關(guān)閉防火墻。就算因某種原因不能清除iptables規(guī)則,那么你需要增加一條規(guī)則放行多播
各個節(jié)點時間同步,啟用時間同步服務(wù)systemctl start chronyd
確保Keepalive使用的網(wǎng)卡開啟了多播,如下圖:
如果沒有開啟,可以使用該命令打開ip link set multicast on dev ens33,ens33是網(wǎng)卡名稱。
安裝keepalive
之間通過yum安裝即可yum install -y keepalived。我這里使用的是阿里云的源,它默認(rèn)就在里面,如下圖:
在2個節(jié)點都安裝。
文件 | 說明 |
---|---|
/usr/sbin/keepalived | 二進(jìn)制程序 |
/etc/keepalived/keepalived.conf | 配置文件 |
/usr/lib/systemd/system/keepalived.service | 服務(wù)文件 |
Keepalive配置文件說明
# 全局配置 global_defs { # 郵件通知信息 notification_email { # 定義收件人 [email protected] } # 定義發(fā)件人 notification_email_from [email protected] # SMTP服務(wù)器地址 smtp_server 192.168.200.1 smtp_connect_timeout 30 # 路由器標(biāo)識,一般不用改,也可以寫成每個主機自己的主機名 router_id LVS_DEVEL # VRRP的ipv4和ipv6的廣播地址,配置了VIP的網(wǎng)卡向這個地址廣播來宣告自己的配置信息,下面是默認(rèn)值 vrrp_mcast_group4 224.0.0.18 vrrp_mcast_group6 ff02::12 } # 定義用于實例執(zhí)行的腳本內(nèi)容,比如可以在線降低優(yōu)先級,用于強制切換 vrrp_script SCRIPT_NAME { } # 一個vrrp_instance就是定義一個虛擬路由器的,實例名稱 vrrp_instance VI_1 { # 定義初始狀態(tài),可以是MASTER或者BACKUP state MASTER # 工作接口,通告選舉使用哪個接口進(jìn)行 interface ens33 # 虛擬路由ID,如果是一組虛擬路由就定義一個ID,如果是多組就要定義多個,而且這個虛擬 # ID還是虛擬MAC最后一段地址的信息,取值范圍0-255 virtual_router_id 51 # 使用哪個虛擬MAC地址 use_vmac XXXXXX # 監(jiān)控本機上的哪個網(wǎng)卡,網(wǎng)卡一旦故障則需要把VIP轉(zhuǎn)移出去 track_interface { eth0 ens33 } # 如果你上面定義了MASTER,這里的優(yōu)先級就需要定義的比其他的高 priority 100 # 通告頻率,單位為秒 advert_int 1 # 通信認(rèn)證機制,這里是明文認(rèn)證還有一種是加密認(rèn)證 authentication { auth_type PASS auth_pass 1111 } # 設(shè)置虛擬VIP地址,一般就設(shè)置一個,在LVS中這個就是為LVS主機設(shè)置VIP的,這樣你就不用自己手動設(shè)置了 virtual_ipaddress { # IP/掩碼 dev 配置在哪個網(wǎng)卡 192.168.200.16/24 dev eth1 # IP/掩碼 dev 配置在哪個網(wǎng)卡的哪個別名上 192.168.200.17/24 dev label eth1:1 } # 虛擬路由,在需要的情況下可以設(shè)置lvs主機 數(shù)據(jù)包在哪個網(wǎng)卡進(jìn)來從哪個網(wǎng)卡出去 virtual_routes { 192.168.110.0/24 dev eth2 } # 工作模式,nopreempt表示工作在非搶占模式,默認(rèn)是搶占模式 preempt nopreempt|preempt # 如果是搶占默認(rèn)則可以設(shè)置等多久再搶占,默認(rèn)5分鐘 preempt delay 300 # 追蹤腳本,通常用于去執(zhí)行上面的vrrp_script定義的腳本內(nèi)容 track_script { } # 三個指令,如果主機狀態(tài)變成Master|Backup|Fault之后會去執(zhí)行的通知腳本,腳本要自己寫 notify_master "" notify_backup "" notify_fault "" } # 定義LVS集群服務(wù),可以是IP+PORT;也可以是fwmark 數(shù)字,也就是防火墻規(guī)則 # 所以通過這里就可以看出來keepalive天生就是為ipvs而設(shè)計的 virtual_server 10.10.10.2 1358 { delay_loop 6 # 算法 lb_algo rr|wrr|lc|wlc|lblc|sh|dh # LVS的模式 lb_kind NAT|DR|TUN # 子網(wǎng)掩碼,這個掩碼是VIP的掩碼 nat_mask 255.255.255.0 # 持久連接超時時間 persistence_timeout 50 # 定義協(xié)議 protocol TCP # 如果后端應(yīng)用服務(wù)器都不可用,就會定向到那個服務(wù)器上 sorry_server 192.168.200.200 1358 # 后端應(yīng)用服務(wù)器 IP PORT real_server 192.168.200.2 1358 { # 權(quán)重 weight 1 # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET這些都是 # 針對應(yīng)用服務(wù)器做健康檢查的方法 MISC_CHECK {} # 用于檢查SMTP服務(wù)器的 SMTP_CHEKC {} # 如果應(yīng)用服務(wù)器不是WEB服務(wù)器,就用TCP_CHECK檢查 TCP_CHECK { # 向哪一個端口檢查,如果不指定默認(rèn)使用上面定義的端口 connect_port# 向哪一個IP檢測,如果不指定默認(rèn)使用上面定義的IP地址 bindto # 連接超時時間 connect_timeout 3 } # 如果對方是HTTPS服務(wù)器就用SSL_GET方法去檢查,里面配置的內(nèi)容和HTTP_GET一樣 SSL_GET {} # 應(yīng)用服務(wù)器UP或者DOWN,就執(zhí)行那個腳本 notify_up "這里寫的是路徑,如果腳本后有參數(shù),整體路徑+參數(shù)引起來" notify_down "/PATH/SCRIPTS.sh 參數(shù)" # 使用HTTP_GET方法去檢查 HTTP_GET { # 檢測URL url { # 具體檢測哪一個URL path /testurl/test.jsp # 檢測內(nèi)容的哈希值 digest 640205b7b0fc66c1ea91c463fac6334d # 除了檢測哈希值還可以檢測狀態(tài)碼,比如HTTP的200 表示正常,兩種方法二選一即可 status_code 200 } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } # 向哪一個端口檢查,如果不指定默認(rèn)使用上面定義的端口 connect_port # 向哪一個IP檢測,如果不指定默認(rèn)使用上面定義的IP地址 bindto # 連接超時時間 connect_timeout 3 # 嘗試次數(shù) nb_get_retry 3 # 每次嘗試之間間隔幾秒 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
配置Srv01和Srv02
配置VRRP部分
Srv01上的keepalived.conf
global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id srv01 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.42.111/24 brd 172.16.42.111 dev ens33 label ens33:0 } preempt delay 60 }
Srv02上的keepalived.conf,唯一不同的就是state、priority以及router_id。
global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id srv02 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.42.111/24 brd 172.16.42.111 dev ens33 label ens33:0 } preempt delay 60 }
啟動2個節(jié)點,啟動后會自動配置ens33:0這個子接口的虛擬IP
在主節(jié)點上你通過systemctl status keepalived看不到它到底是什么角色,不過在BACKUP節(jié)點上你可以看到,但是你在主節(jié)點日志中cat /var/log/message里可以看到Srv01進(jìn)入到MASTER狀態(tài),如下圖:
查看Srv02的狀態(tài)
那么你通過停止Srv01上的keepalived服務(wù)就看到MASTER會被轉(zhuǎn)移到Srv02上。
使用該命令查看VRRP通告tcpdum -i ens33 -nn host 224.0.0.18,你在2臺主機都會看到相同的信息。
Srv01使用真實物理IP對該地址進(jìn)行發(fā)送通告,那么Srv02也會收到,如果Srv01宕機,那么Srv02就會使用自己的物理IP向該地址發(fā)送通告,由于Srv01已經(jīng)宕機那么此時Srv02的優(yōu)先級就是最高的,所以Srv02就變成了MASTER。
配置LVS部分
這里只是用了LVS來說明如何配置Keepalived,如果要看完整內(nèi)容請移步使用Keepalived構(gòu)建LVS高可用集群
在keepalived.conf文件中增加下面的內(nèi)容,2臺服務(wù)器增加的內(nèi)容一致,所以這里就寫一份。
virtual_server 172.16.42.111 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 0 protocol TCP sorry_server 192.168.200.200 1358 # 后端應(yīng)用服務(wù)器 IP PORT real_server 172.16.42.102 80 { weight 1 # 應(yīng)用服務(wù)器UP或者DOWN,就執(zhí)行那個腳本 notify_up "/usr/local/notify.sh up" notify_down "/usr/local/notify.sh down" HTTP_GET { # 檢測URL url { path /index.html # 除了檢測哈希值還可以檢測狀態(tài)碼,比如HTTP的200 表示正常,兩種方法二選一即可 status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.16.42.103 80 { weight 1 # 應(yīng)用服務(wù)器UP或者DOWN,就執(zhí)行那個腳本 notify_up "/usr/local/notify.sh up" notify_down "/usr/local/notify.sh down" HTTP_GET { # 檢測URL url { path /index.html # 除了檢測哈希值還可以檢測狀態(tài)碼,比如HTTP的200 表示正常,兩種方法二選一即可 status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
這里的notify_up|down腳本我寫的很簡單就是為了使用一下這個功能,內(nèi)容如下:
#!/bin/bash # 不同的是2個主機上的echo部分不一樣,因為主機名不同。 if [ $1 == "up" ]; then echo "Srv02 is UP" > /tmp/notify.txt elif [ $1 == "down" ]; then echo "Srv02 is DOWN" > /tmp/notify.txt fi
重啟Keepalived服務(wù)之后你就可以通過ipvsadm -Ln查看ipvs規(guī)則了,這些規(guī)則在2臺服務(wù)器上都會有,如下圖:
測試訪問
使用下面的命令快速訪問for i in {1..20}; do curl http://172.16.42.111/ | grep "Srv0" --color ; done
可以看到2臺服務(wù)器交替,因為我們使用的rr調(diào)度算法。
故障轉(zhuǎn)移測試
連續(xù)訪問VIP,然后停止Srv01上面的keepalived服務(wù),這就意味著Srv01也就是失去了VIP,然后觀察請求情況以及是否觸發(fā)之前設(shè)定的腳本。
在Srv01上查看腳本執(zhí)行情況
查看Srv02上面的日志
鏈接:https://www.cnblogs.com/rexcheny/p/10778567.html
-
LVS
+關(guān)注
關(guān)注
1文章
37瀏覽量
10083 -
Keepalived
+關(guān)注
關(guān)注
0文章
8瀏覽量
4110
原文標(biāo)題:Keepalive詳解
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
使用DRBD和keepalived實現(xiàn)文件實時同步和雙機熱備
Keepalive基礎(chǔ)知識

確保網(wǎng)站無縫運行:Keepalived高可用與Nginx集成實戰(zhàn)

nginx負(fù)載均衡配置介紹

評論