keepalived(高可用軟件)
什么是高可用?
拿lvs來舉例,我設置的是rr算法,當我用戶請求進來,經過調度器,調度器通過算法把請求分給后端RS,如果我后端有一台RS宕機了,那么我調度器是不知道的,還是會一直給它發送報文,而用戶時而能收到返回請求,時而收到請求超時,還有一種情況,就是我調度器故障,所謂的單點故障,lvs都是沒有辦法排除的,它只是一款負載均衡軟件。在節點出現故障時,並不影響用戶的使用,訪問,這種機制就叫高可用。英文名字叫high avalible。
高可用中需要了解的名詞:
什么是節點?
運行高可用進程的一個獨立主機,稱為節點,節點分為主節點(master),備節點(backup),主節點和備節點之間的協議叫VRRP(虛擬路由冗余協議),通過轉移ip來實現高可用。
在keepalived中,主節點是實時向它的備節點發送報文,告訴他我還活着,你休想篡位,我死了你才能上位,主節點會每隔多少多少秒告訴他的備節點我還活着,這個時間可以設置。這個告訴的時間要拿捏好,不能太短,也不能太長,備節點可以是多個,當主節點死掉了,備節點靠自身的優先級來上位,優先級越大,就先上位。
keepalived利用checker(監控者)這個組件來檢查后端節點的好壞,當后端RS宕機,就會剔除壞的,master因為有leepalived的存在,他就會知道后端RS有宕機的,就不會給宕機的RS發送請求了,只會給正常的RS發送請求。
資源:IP地址
事件:就是集群中可能發生的事情,例如節點故障,網絡連通故障,網卡故障都會發生節點資源的轉移。
動作:針對事件的發生而產生的動作。
keepalived簡介
keepalived 是linux下一個輕量級的高可用解決方案,它與HACMP(IBM研發)實現功能類似,都可以實現服務或者網絡的高可用,但是又有差別:hacmp是一個專業的、功能完善的高可用軟件,它提供了HA軟件所需的基本功能,比如心跳檢測和資源接管,檢測集群中的系統服務,在集群節點間轉移共享ip地址所有者等,hacmp功能強大,但是部署和使用相對麻煩,同時也是商業化軟件,與hacmp相比,keepalived主要是通過虛擬路由冗余來實現高可用功能,雖然他沒有hacmp功能強大,但是keepalived部署使用相對簡單,所有配置只需要一個配置文件即可完成.。
keepalived用途
keepalived起初是為lvs設計的,專門用來監控集群系統中各個服務節點的狀態,它根據layer3,4 & 5交換機制檢測每個服務節點的狀態,如果某個服務節點出現異常,或工作出現故障,keepaived將檢測到,並將出現故障的服務節點從集群系統中剔除,而在故障節點恢復正常后,keepalived又可以自動將此服務節點重新加入到集群中,這些工作全部自動完成,不需要人工干預,需要人工完成的只是修復故障節點。
keepalived后來又加入了VRRP 的功能,VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗余協議)的縮寫,它出現的目的是為了解決靜態路由出現的單點故障問題,通過VRRP可以實現網絡不間斷的、穩定的運行,因此,keepalived一方面具有服務器狀態監測和故障隔離功能,另一方面也具有HA Cluster功能,下面詳細介紹下VRRP協議的實現過程
vrrp工作原理
在一個虛擬路由器中,只有處於master角色的路由器會一直發送vrrp數據包,處於backup角色的路由器只接受master發過來的報文信息,用來監控master運行狀態,因此,不會發生master搶占的現象,除非它的優先級更高,而當master不可用時,backup也就無法收到master發過來的報文信息,於是就認定master出現故障,接着多台backup就會進行選舉,優先級最高的backup將成為新的master,這種選舉並進行角色的過程非常快,因此也就保證了服務的持續可用性。
keepalived體系結構
可以看出來,keepalived的體系結構從整體上分為兩層,分別是用戶空間層和內核空間層。下面介紹一個keepalived兩層結構的詳細組成及實現的功能。
內核空間層處於最底層,它包括ipvs和netlink兩個模塊。ipvs模塊是keepalived引入的一個第三方模塊,通過ipvs可以實現基於ip的負載均衡集群。ipvs默認包含在lvs集群軟件中。
這里有一個誤區,由於keepalived可以和ipvs一起很好的工作,所以很多初學者都認為keepalived是一個負載均衡的軟件,這種理解是錯誤的
內核模塊:
IPVS:主要用於通過IPVS跟lvs進行整合,是lvs的核心模塊,跟lvs一塊使用的
NETLINK:主要實現一些網絡的功能
用戶模塊:主要用於高可用
checker:檢查服務狀態
vrrp stack:用於DS高可用
keepalived的安裝與配置
#先基於的情況是單點故障 #mask端的配置: yum install keepalived #主配置文件: /etc/keepalived/keepalived.conf #分為三段: global全局、vrrp、virtual_server虛擬主機 #只留vrrp的,其余的都注釋掉,global的只注釋里面的內容。 #而后修改vrrp: ! Configuration File for keepalived global_defs { notification_email { } } vrrp_instance VI_1 { state MASTER interface ens33 #要監控的網絡端口 virtual_router_id 51 #虛擬路由的ID,master跟backup要一樣,證明他倆是在同一個虛擬網絡>里面 priority 100 #優先級 advert_int 1 #一秒檢查一次 authentication { #認證 auth_type PASS #認證方式 auth_pass 1111 #密碼 } virtual_ipaddress { 192.168.24.250 } } #backup端的配置: yum install keepalived –y #打開keepalived配置文件 ! Configuration File for keepalived global_defs { notification_email { } } vrrp_instance VI_1 { state BACKUP interface ens33 #要監控的網絡端口 virtual_router_id 51 #虛擬路由的ID,master跟backup要一樣,證明他倆是在同一個虛擬網絡>里面 priority 99 #優先級 advert_int 1 #一秒檢查一次 authentication { #認證 auth_type PASS #認證方式 auth_pass 1111 #密碼 } virtual_ipaddress { 192.168.24.250 } } #分別啟動master端和backup端的keepalived systemctl start keepalived #如何發生飄移:只需停掉keepalived服務即可。
互為主備
就是說master在提供服務時候,backup是充當了一個冷備,這是對系統資源的一種浪費。如何實現兩台機器即是master又是backup。就是互為主備。
比如我去訪問www.wuyuetian.com這個域名的時候,它是對應的多個IP,什么意思,我有兩台服務器,他倆的IP是不一樣的,但對外提供的服務是一樣的,都是提供www.wuyuetian.com這個web服務,那么給這兩台服務器做keepalived,讓他倆互為主備,如果我的一台服務器宕機,那么,宕機服務器的IP會漂移到正常的上面,正常,另一台就有了兩個IP。
! Configuration File for keepalived global_defs { notification_email { } } 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 { 192.168.24.250 } } vrrp_instance VI_2 { #此處修改,不能跟v1重名 state BACKUP #此處修改 interface ens33 virtual_router_id 52 #此處修改 priority 99 #此處修改 advert_int 1 authentication { auth_type PASS auth_pass 2222 #此處修改 } virtual_ipaddress { 192.168.24.200 #服務IP修改 } } ! Configuration File for keepalived notification_email { } } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.24.250 } } vrrp_instance VI_2 { #此處修改,不能跟v1重名 state MASTER #此處修改 interface ens33 virtual_router_id 52 #此處修改 priority 100 #此處修改 advert_int 1 authentication { auth_type PASS auth_pass 2222 #此處修改 } virtual_ipaddress { 192.168.24.200 #服務IP修改 } }
不搶占模式
在互為主備的情況下,對於業務來說,第一次宕機,發生了切換,那么主節點好了,IP又漂移了回來,又發生了一次切換,第一次是因為故障發生切換,是正常的,那么第二次,就是可控制的,這就是讓他不搶占。
! Configuration File for keepalived global_defs { } vrrp_instance VI_1 { state BACKUP #此處修改,純靠優先級決定 interface ens33 virtual_router_id 51 priority 100 advert_int 1 nopreempt #非搶占模式 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.24.250 } } vrrp_instance VI_2 { #此處修改,不能跟v1重名 state BACKUP #此處修改 interface ens33 virtual_router_id 52 #此處修改 priority 99 #此處修改 advert_int 1 authentication { auth_type PASS auth_pass 2222 #此處修改 } virtual_ipaddress { 192.168.24.200 #服務IP修改 } }
real server宕機
我們之前說過,keepalived是利用checker這個組建實現調度器監控后端RS,當后端RS宕機后,就不在給它發送報文,並把它剔除出去,現在我們來做一下這個實驗。
#首先配置后端RS,后端RS需配置lvs。 #!/bin/bash case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig ens33:0 192.168.24.250/32 broadcast 192.168.24.250 up if [ $? -eq 0 ];then route add -host 192.168.24.250 dev ens33:0 fi echo "ok" ;; stop) echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig ens33:0 down route del -host 192.168.24.250 echo "lose" ;; *) echo "go away" ;; esac #而后配置keepalived,把virtual_server段注釋解開,需配置在24.250虛IP的主節點上。 virtual_server 192.168.24.250 80 { #此處修改為后端RS的VIP和他的網站端口 delay_loop 3 #健康檢查時間間隔 lb_algo rr lb_kind DR protocol TCP real_server 192.168.24.10 80 { #此出為后端RSIP和80端口 weight 1 #權重 HTTP_GET { #協議 url { path / status_code 200 } connect_timeout 3 #連接超時時間 nb_get_retry 3 #重連次數 delay_before_retry 3 #重連時間間隔 } } real_server 192.168.24.11 80 { #此出為后端RSIP和80端口 weight 1 #權重 HTTP_GET { #協議 url { path / status_code 200 } connect_timeout 3 #連接超時時間 nb_get_retry 3 #重連次數 delay_before_retry 3 #重連時間間隔 } } } #重新啟動keepalived,使用ipvsadm查看是否添加成功 #后端RS啟動httpd,使用windows抓取網頁 systemctl start httpd curl 192.168.24.250 #而后停掉后端RS中的任意一台的httpd systemctl stop httpd #等待一下,再抓取網頁,只會抓取到一台的,而且使用ipvsadm查看,停掉的那台已經被剔除了。 ipvsadm –L –n #當我重啟或恢復,那么就會自動把它添加回去