keepalived(1)- keepalived叢集概述
目錄
1. 高可用叢集概述
高可用技術主要用於解決SPOF(single Point Of failure,單點故障)問題,其主要作用是使叢集的整體服務儘可能可用,如果高可用叢集中的主節點發生了故障,那麼將由次節點代替它。次節點通常是主節點的映象,與主節點保持完全一致。
高可用叢集的重要引數如下:
-
MTBF:Mean Time Between Failure 平均無故障時間
-
MTTR:Mean Time To Restoration( repair)平均恢復時間,故障時間
高可用判斷係數(以年為單位)
-
A=MTBF/(MTBF+MTTR) 取值範圍:(0,1):99%, 99.5%, 99.9%, 99.99%, 99.999%
假設系統一直能夠提供服務,我們說系統的可用性是100%。
如果系統每執行100個時間單位,會有1個時間單位無法提供服務,我們說系統的可用性是99%。
很多公司的高可用目標是4個9,也就是99.99%,這就意味著,系統的年停機時間為8.76個小時。
常用的高可用技術主要有:
- keepalived
- ais:應用介面規範
- heartbeat
- cman+rgmanager(RHCS)
- coresync_pacemaker
keepalived和heartbeat/coresync的比較:
Keepalived是Linux下一個輕量級別的高可用解決方案。高可用:廣義來講,是指整個系統的高可用行;狹義的來講就是主機的冗餘和接管。
Keepalived與HeartBeat都可以實現服務或者網路的高可用,但是又有差別,HeartBeat是一個專業的、功能完善的高可用軟體,它提供HA軟體所需的基本功能,比如:心跳檢測、資源接管,檢測叢集中的服務,在叢集節點轉移共享IP地址的所有者等等。HeartBeat功能強大,但是部署和使用相對比較麻煩,與HeartBeat相比,Keepalived主要是通過虛擬路由冗餘vrrp技術來實現地址轉移功能,雖然它沒有HeartBeat功能強大,但是Keepalived部署和使用非常的簡單,所有配置只需要一個配置檔案即可以完成。
Heartbeat、Corosync是屬於同一型別,Keepalived與Heartbeat、Corosync,根本不是同一型別的。Keepalived的目的是模擬路由器的高可用,Heartbeat或Corosync的目的是實現Service的高可用。
所以一般Keepalived是實現前端高可用,常用的前端高可用的組合有,就是我們常見的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。
而Heartbeat或Corosync是實現服務的高可用,常見的組合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 實現Web伺服器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 實現MySQL伺服器的高可用。
Keepalived中實現輕量級的高可用,一般用於前端高可用,且不需要共享儲存,一般常用於兩個節點的高可用。而Heartbeat(或Corosync)一般用於服務的高可用,且需要共享儲存,一般用於多節點的高可用。
2. keepalived概述
2.1 keepalived介紹
Keepalived起初是為LVS設計的,專門用來監控集群系統中各個服務節點的狀態,它根據TCP/IP參考模型的第三、第四層、第五層交換機制檢測每個服務節點的狀態,如果某個伺服器節點出現異常,或者工作出現故障,Keepalived將檢測到,並將出現的故障的伺服器節點從集群系統中剔除,這些工作全部是自動完成的,不需要人工干涉,需要人工完成的只是修復出現故障的服務節點。
後來Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虛擬路由冗餘協議)出現的目的是解決靜態路由出現的單點故障問題,通過VRRP可以實現網路不間斷穩定執行,因此Keepalvied一方面具有伺服器狀態檢測和故障隔離功能,另外一方面也有HAcluster功能。
健康檢查和失敗切換是keepalived的兩大核心功能。所謂的健康檢查,就是採用tcp三次握手,icmp請求,http請求,udp echo請求等方式對負載均衡器後面的實際的伺服器(通常是承載真實業務的伺服器)進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器,利用VRRP維持主備負載均衡器的心跳,當主負載均衡器出現問題時,由備負載均衡器承載對應的業務,從而在最大限度上減少流量損失,並提供服務的穩定性。
2.2 keepalived體系架構
-
SchedulerI/OMultiplexer是一個I/O複用分發排程器,它負載安排Keepalived所有內部的任務請求;
-
Memory Mngt是一個記憶體管理機制,這個框架提供了訪問記憶體的一些通用方法;
-
Control Plane 是keepalived的控制版面,可以實現對配置檔案編譯和解析;
-
Core componets 這部分主要包含了5個部分;
- Watchdog:是計算機可靠領域中極為簡單又非常有效的檢測工具,通常為硬體,Keepalived正是通過它監控Checkers和VRRP程序的。
- Checkers:這是Keepalived最基礎的功能,也是最主要的功能,可以實現對伺服器執行狀態檢測和故障隔離。
- VRRP Stack:這是keepalived後來引用VRRP功能,可以實現HA叢集中失敗切換功能。負責負載均衡器之間的失敗切換FailOver;
- IPVS wrapper:這個是IPVS功能的一個實現,IPVSwarrper模組將可以設定好的IPVS規則傳送到核心空間並且提供給IPVS模組,最終實現IPVS模組的負載功能。
- Netlink Reflector:用來實現高可用叢集Failover時虛擬IP(VIP)的設定和切換,
keepalived執行時,會啟動3個程序,分別為:core(核心程序),check和vrrp
-
core:負責主程序的啟動,維護和全域性配置檔案的載入;
-
check:負責健康檢查
-
vrrp:用來實現vrrp協議
2.3 keepalived實現原理
keepalived主要的兩個功能為檢測後端伺服器狀態和高可用故障轉移,兩個功能實現的原理如下:
-
Keepalived對伺服器執行狀態和故障隔離的工作原理:
Keepalived可以工作在TCP/IP模型的三層、四層、五層:
-
網路層(3):Keepalived通過ICMP協議向伺服器叢集中的每一個節點發送一個ICMP資料包,如果某個節點沒有返回響應資料包,那麼認為該節點發生了故障,Keepalived將報告這個節點失效,並從伺服器叢集中剔除故障節點。
-
傳輸層(4):Keepalived在傳輸層裡利用了TCP協議的埠連線和掃描技術來判斷叢集節點的埠是否正常,比如對於常見的WEB伺服器80埠。或者SSH服務22埠,Keepalived一旦在傳輸層探測到這些埠號沒有資料響應和資料返回,就認為這些埠發生異常,然後強制將這些埠所對應的節點從伺服器叢集中剔除掉。
-
應用層(5):,Keepalived的執行方式也更加全面化和複雜化,使用者可以通過自定義Keepalived工作方式,例如:可以通過編寫程式或者指令碼來執行Keepalived,而Keepalived將根據使用者設定的引數檢測各種程式或者服務是否允許正常,如果Keepalived的檢測結果和使用者設定的不一致時,Keepalived將把對應的伺服器從伺服器叢集中剔除。
-
-
Keepalived高可用故障切換轉移原理
Keepalived高可用故障切換,是通過VRRP協議來實現的。
在Keepalived服務正常工作時,Master節點會不斷以組播形式地向備節點發送心跳訊息,組播地址為224.0.0.18,用以告訴Backup節點自己還活著,當Master節點發生故障時,就無法傳送心跳訊息,備節點無法檢測到來自主Master節點心跳了,於是呼叫自身的接管程式,接管Master節點的IP資源及服務。而當Master節點恢復時,備Backup節點會根據是否配置搶佔決定是否釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
兩臺執行VRRP的裝置會根據vrrp組號形成虛擬IP和虛擬MAC地址,其他裝置都使用該VIP和VMAC與keepalived裝置進行通訊,MASTER和BACKUP節點都正常的情況下VIP和VMAC都存在於MASTER節點上,由MASTER節點處理使用者請求,(注意:雖然VRRP會產生VMAC,但是其他節點的ARP表中記錄的VIP對用的MAC並不是VMAC,而是MASTER節點的真實MAC地址)當MASTER節點故障時,VIP和VMAC都會遷移到BACKUP節點上,BACKUP節點會發送免費ARP報文讓其他節點重新學習自己的MAC地址,讓終端的ARP表中記錄的VIP切換成BACKUP的真實MAC地址,完成VRRP主備切換。
當MASTER節點恢復時,若MASTER沒有配置搶佔,則vrrp主備不會發生切換,若配置了搶佔,則vrrp會再次發生主備切換,VIP會遷移到MASTER節點上。
其中VRRP的節點中,配置的優先順序最高的裝置會稱為MASTER裝置。
2.4 keepalived配置準備工作
-
各節點時間必須同步;
ntp, chrony
-
確保iptables及selinux不會成為阻礙;
-
各節點之間可通過主機名互相通訊(對keepalived並非必須);
建議使用/etc/hosts檔案實現;
- 確保各節點的用於叢集服務的介面支援MULTICAST通訊;
D類:224-239;
ip link set multicast on eth1用於開啟介面組播功能,預設開啟
ip link set multicast off eth1用於關閉介面組播功能
可通過ifoncfig命令檢視:
[root@nginx-lb01 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.123 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::4809:4d0d:96a:b68e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:33:71:c6 txqueuelen 1000 (Ethernet)
RX packets 7609 bytes 8962242 (8.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3194 bytes 195272 (190.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0