(轉)小談keepalived vip漂移原理與VRRP協議


背景:之前搭建過keepalived雙機熱備的集群,但對其中的原理不甚理解,看完就忘了,所有有必要深入的學習下。

簡介

什么是keepalived呢?keepalived是實現高可用的一種輕量級的技術手段,主要用來防止單點故障(單點故障是指一旦某一點出現故障就會導致整個系統架構的不可用)的發生。之所以說keepalived是輕量級的,是相對於corosync + ldirectord來說的。keepalived也可以實現高可用集群,而且配置起來比corosync + ldirectord簡單方便很多,keepalived與corosync的工作機制相差很多。corosync + ldirectord實現的功能雖然強大,但配置起來比較麻煩,而keepalived功能雖然簡單,但配置起來比較容易。也就是說keepalived可實現corosync + ldirectord實現的功能,只不過前者沒有后者功能強大而已。

VRRP協議

在介紹keepalived之前,不得不先介紹下一個協議——VRRP。之所以要介紹這個協議,是因為VRRP協議是keepalived實現的基礎。下面先來一塊看下這個這協議是干嗎用的吧。
如上圖所示,通常,同一網段內的所有主機都設置一條相同的、以網關為下一跳的缺省路由。主機發往其他網段的報文將通過缺省路由發往網關,再由網關進行轉發,從而實現主機與外部網絡的通信。當網關發生故障時,本網段內所有以網關為缺省路由的主機將無法與外部網絡通信,僅能實現內部主機間通信。缺省路由為用戶的配置操作提供了方便,但是對缺省網關設備提出了很高的穩定性要求。增加出口網關是提高系統可靠性的常見方法,此時如何在多個出口之間進行選路就成為需要解決的問題。而VRRP正好解決了此問題。
VRRP:Virtual Router Redundancy Protocol,虛擬路由冗余協議。 VRRP說白了就是實現地址漂移的,是一種容錯協議,在提高可靠性的同時,簡化了主機的配置。該協議能夠實現將可以承擔網關功能的一組路由器加入到備份組中,形成一台虛擬路由器,由VRRP的選舉機制決定哪台路由器承擔轉發任務,局域網內的主機只需將虛擬路由器配置為缺省網關。
在VRRP協議出現之前,為了不讓單個路由器成為本地與外部通信的瓶頸,我們需要有多個路由,在此種模式下,我們內部的主機就需要將自己的網關指向不同的路由器,這樣的配置對我們的網關管理員來說是很麻煩的,且不容易實現。在VRRP協議出現后,為了不讓單個路由器成為本地與外部通信的瓶頸,我們仍需要有多個路由,但可以使用同一個缺省網關,我們只需將內部主機指定一個缺省網關即可。VRRP協議會根據優先級來選擇一個正常的路由作為主路由器實現與外部的通信,而其他路由則作為備份路由不參與轉發。在此模式下,多個路由器組成虛擬路由器組,物理上是多個路由器組成,但在邏輯上卻是表現為只有一個路由。效果如下圖所示:
在上圖中,Router A、Router B和Router C組成一個虛擬路由器。各虛擬路由器都有自己的IP地址。局域網內的主機將虛擬路由器設置為缺省網關。Router A、Router B和Router C中優先級最高的路由器作為Master路由器,承擔網關的功能。其余兩台路由器作為Backup路由器。當master路由器出故障后,backup路由器會根據優先級重新選舉新的master路由器承擔網關功能。Master 路由器周期性地發送VRRP 報文,在虛擬路由器中公布其配置信息(優先級等)和工作狀況。Backup路由器通過接收到VRRP 報文的情況來判斷Master 路由器是否工作正常。
VRRP根據優先級來確定備份組中每台路由器的角色(Master 路由器或Backup 路由器)。優先級越高,則越有可能成為Master 路由器。VRRP優先級的可配置的取值范圍為1 到254。
為了防止非法用戶構造報文攻擊備份組,VRRP通過在VRRP報文中增加認證字的方式,驗證接收到的VRRP報文。VRRP提供了兩種認證方式:
simple:簡單字符認證。發送VRRP 報文的路由器將認證字填入到VRRP 報文中,而收到VRRP 報文的路由器會將收到的VRRP 報文中的認證字和本地配置的認證字進行比較。如果認證字相同,則認為接收到的報文是真實、合法的VRRP 報文;否則認為接收到的報文是一個非法報文。
md5:MD5 認證。發送VRRP 報文的路由器利用認證字和MD5 算法對VRRP 報文進行摘要運算,運算結果保存在Authentication Header(認證頭)中。收到VRRP 報文的路由器會利用認證字和MD5 算法進行同樣的運算,並將運算結果與認證頭的內容進行比較。如果相同,則認為接收到的報文是真實、合法的VRRP 報文;否則認為接收到的報文是一個非法報文。
在有多個路由器組成的虛擬路由中,當我們的內部主機很多時,如果所有主機都使用同一個master路由, 會使得其他路由器很清閑,很浪費資源,我們期望我們本地的內部主機平分到各個路由器上,即讓我們的內部主機的缺省網關指向不同的路由,從而減輕因只有一個master路由而造成網絡帶寬擁堵的負擔。這就是負載分擔VRRP。但這個如何實現呢?先看下面的配置效果圖:
215800432
在此情況下,同一台路由器同時加入多個VRRP備份組,在不同備份組中有不同的優先級,從而實現負載分擔。
在上圖中,有三個備份組存在:
備份組1:對應虛擬路由器1。Router A作為Master路由器,Router B和Router C作為Backup路由器。
備份組2:對應虛擬路由器2。Router B作為Master路由器,Router A和Router C作為Backup路由器。
備份組3:對應虛擬路由器3。Router C作為Master路由器,Router A和Router B作為Backup路由器。
為了實現業務流量在Router A、Router B和Router C之間進行負載分擔,需要將局域網內的主機的缺省網關分別設置為虛擬路由器1、2和3。在配置優先級時,需要確保三個備份組中各路由器的VRRP優先級形成交叉對應。為了便於理解,我們假定有三個路由設備Router A、B、C和三台主機Host A、B、C,列舉有在不同的虛擬路由組中。對路由器A來說,因在虛擬路由組1中Router A的優先級高於另外兩個,因此,Router A 作為 Master 路由器,Router B 和Router C 作為 Backup路由器;同樣,對路由器B來說,因在虛擬路由器組2中Router B的優先級高於另外兩個,因此,Router B 作為 Master 路由器,Router A 和Router C 作為 Backup路由器;對路由器C來說,因在虛擬路由器組3中Router C的優先級高於另外兩個,因此,Router C 作為 Master 路由器,Router A 和Router B 作為 Backup路由器。對不同的主機來說,一旦其master路由器出故障后,會在另外正常的路由器中根據優先級重新選定master路由。如這里假定Host A的默認網關指向Router A,即Host A指向虛擬路由器組1的默認網關,對主機A來說,如果其master路由出現故障,即Router A出現故障,則會從另外兩個正常的備份虛擬路由中根據各自的優先級選取高優先級的作為新的master路由,這里就是選取Router B作為其master路由來完成網關功能。假如想了解更多關於VRRP協議相關的信息請查閱相關資料,這里不再過多介紹。

Keepalived

一、配置說明

keepalived的配置位於/etc/keepalived/keepalived.conf,配置文件格式包含多個必填/可選的配置段,部分重要配置含義如下:

  • global_defs: 全局定義塊,定義主從切換時通知郵件的SMTP配置。
  • vrrp_instance: vrrp實例配置。
  • vrrp_script: 健康檢查腳本配置。

細分下去,vrrp_instance配置段包括:

  • state: 實例角色。分為一個MASTER和一(多)個BACKUP。
  • virtual_router_id: 標識該虛擬路由器的ID,有效范圍為0-255。
  • priority: 優先級初始值,競選MASTER用到,有效范圍為0-255。
  • advert_int: VRRP協議通告間隔。
  • interface: VIP所綁定的網卡,指定處理VRRP多播協議包的網卡。
  • mcast_src_ip: 指定發送VRRP協議通告的本機IP地址。
  • authentication: 認證方式。
  • virtual_ipaddress: VIP。
  • track_script: 健康檢查腳本。

vrrp_script配置段包括:

  • script: 一句指令或者一個腳本文件,需返回0(成功)或非0(失敗),keepalived以此為依據判斷其監控的服務狀態。
  • interval: 健康檢查周期。
  • weight: 優先級變化幅度。
  • fall: 判定服務異常的檢查次數。
  • rise: 判定服務正常的檢查次數。

二、選舉算法

keepalived中優先級高的節點為MASTER。MASTER其中一個職責就是響應VIP的arp包,將VIP和mac地址映射關系告訴局域網內其他主機,同時,它還會以多播的形式(目的地址224.0.0.18)向局域網中發送VRRP通告,告知自己的優先級。網絡中的所有BACKUP節點只負責處理MASTER發出的多播包,當發現MASTER的優先級沒自己高,或者沒收到MASTER的VRRP通告時,BACKUP將自己切換到MASTER狀態,然后做MASTER該做的事:1.響應arp包,2.發送VRRP通告。

MASTER和BACKUP節點的優先級如何調整?

首先,每個節點有一個初始優先級,由配置文件中的priority配置項指定,MASTER節點的priority應比BAKCUP高。運行過程中keepalived根據vrrp_script的weight設定,增加或減小節點優先級。規則如下:

1. 當weight > 0時,vrrp_script script腳本執行返回0(成功)時優先級為priority + weight, 否則為priority。當BACKUP發現自己的優先級大於MASTER通告的優先級時,進行主從切換。

2. 當weight < 0時,vrrp_script script腳本執行返回非0(失敗)時優先級為priority + weight, 否則為priority。當BACKUP發現自己的優先級大於MASTER通告的優先級時,進行主從切換。

3. 當兩個節點的優先級相同時,以節點發送VRRP通告的IP作為比較對象,IP較大者為MASTER。

主從的優先級初始值priority和變化量weight設置非常關鍵,配錯的話會導致無法進行主從切換。比如,當MASTER初始值定得太高,即使script腳本執行失敗,也比BACKUP的priority + weight大,就沒法進行VIP漂移了。所以priority和weight值的設定應遵循: abs(MASTER priority – BAKCUP priority) < abs(weight)。

另外,當網絡中不支持多播(例如某些雲環境),或者出現網絡分區的情況,keepalived BACKUP節點收不到MASTER的VRRP通告,就會出現腦裂(split brain)現象,此時集群中會存在多個MASTER節點。

 


免責聲明!

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



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