淺析keepalived vip漂移原理與VRRP協議

 

2017-01-18 Martin 開源技術社區

簡介

什麼是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的選舉機制決定哪臺路由器承擔轉發任務,局域網內的主機只需將虛擬路由器配置爲缺省網關。post

 

在VRRP協議出現以前,爲了避免讓單個路由器成爲本地與外部通訊的瓶頸,咱們須要有多個路由,在此種模式下,咱們內部的主機就須要將本身的網關指向不一樣的路由器,這樣的配置對咱們的網關管理員來講是很麻煩的,且不容易實現。在VRRP協議出現後,爲了避免讓單個路由器成爲本地與外部通訊的瓶頸,咱們仍須要有多個路由,但可使用同一個缺省網關,咱們只需將內部主機指定一個缺省網關便可。VRRP協議會根據優先級來選擇一個正常的路由做爲主路由器實現與外部的通訊,而其餘路由則做爲備份路由不參與轉發。在此模式下,多個路由器組成虛擬路由器組,物理上是多個路由器組成,但在邏輯上倒是表現爲只有一個路由。效果以下圖所示:spa

在上圖中,Router A、Router B和Router C組成一個虛擬路由器。各虛擬路由器都有本身的IP地址。局域網內的主機將虛擬路由器設置爲缺省網關。Router A、Router B和Router C中優先級最高的路由器做爲Master路由器,承擔網關的功能。其他兩臺路由器做爲Backup路由器。當master路由器出故障後,backup路由器會根據優先級從新選舉新的master路由器承擔網關功能。Master 路由器週期性地發送VRRP 報文,在虛擬路由器中公佈其配置信息(優先級等)和工做情況。Backup路由器經過接收到VRRP 報文的狀況來判斷Master 路由器是否工做正常。router

 

VRRP根據優先級來肯定備份組中每臺路由器的角色(Master 路由器或Backup 路由器)。優先級越高,則越有可能成爲Master 路由器。VRRP優先級的可配置的取值範圍爲1 到254。對象

 

爲了防止非法用戶構造報文攻擊備份組,VRRP經過在VRRP報文中增長認證字的方式,驗證接收到的VRRP報文。VRRP提供了兩種認證方式:ip

 

simple:簡單字符認證。發送VRRP 報文的路由器將認證字填入到VRRP 報文中,而收到VRRP 報文的路由器會將收到的VRRP 報文中的認證字和本地配置的認證字進行比較。若是認證字相同,則認爲接收到的報文是真實、合法的VRRP 報文;不然認爲接收到的報文是一個非法報文。md5

 

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之間進行負載分擔,須要將局域網內的主機的缺省網關分別設置爲虛擬路由器一、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

1、配置說明

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: 斷定服務正常的檢查次數。

2、選舉算法

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節點。

相關文章
相關標籤/搜索