1. 程式人生 > >keepalived VRRP協議與選舉算解析

keepalived VRRP協議與選舉算解析

簡介

什麼是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。但這個如何實現呢?先看下面的配置效果圖:

在此情況下,同一臺路由器同時加入多個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節點。

轉自:https://www.centos.bz/2017/07/keepalived-vrrp-election/