Keepalive原理總結


什么是keepalived呢?keepalived是實現高可用的一種輕量級的技術手段,主要用來防止單點故障(單點故障是指一旦某一點出現故障就會導致整個系統架構的不可用)的發生。

1. VRRP

VRRP是一種容錯性協議,它是通過將多台設備虛擬化成一台設備,如果其中一台設備出現故障,那么另一台設備可以迅速接替其工作,已保證通訊的可靠性和連續性。

1.1. 工作原理

在企業網當中,PC一般是需要使用"網關"來與外部網絡進行通訊,這樣如果網關出現了故障那么整一個子網的對外通訊都會被切斷,VRRP的出現就能把這個問題很好地解決了,VRRP可以通過把多台設備(路由器、交換機、防火牆等)虛擬化成一台設備,然后通過配置虛擬IP地址作為網關就能實現對網關的備份(這虛擬IP地址是代表整個VRRP組內的所有設備),當其中一台設備出現故障之后,VRRP組內其他設備會通過某些機制來接替故障設備的工作。

 

 

 

 

如上圖所示,SW7SW8若配置了VRRP 那么SW7SW8就是一個整體,其中一台出現故障都不會對業務造成很大的影響。

1.1.1. VRRP概念

虛擬設備:由一個"主(Master"設備和多個"備(Backup"設備組成的一個虛擬網關。

主設備(Master):負責轉發數據報文和周期性向備設備發送VRRP協議報文。

備設備(Backup):不負責轉發數據報文,在Master設備發生故障的時候會通過選舉形式成為新的Master設備,該角色會接收來自Master設備的VRRP報文並加以分析。

VRID用來表示一個VRRP組。

虛擬IP配置在虛擬設備上的虛擬IP地址,一個虛擬設備可以擁有一個或者多個虛擬IP地址。

IP地址擁有者:分配給虛擬設備的虛擬IP的真實擁有者(例如:分配個虛擬路由的IP192.168.1.1,但是這個IP已經分配給物理接口G0/0/1這個接口那么這個接口就是"IP擁有者"),IP擁有者會直接跳過選舉成為Master,並且是不可搶占的。

虛擬MAC地址:由虛擬設備生成的虛擬MAC地址,每一個虛擬設備都會自動生成一個虛擬MAC地址,這個MAC地址是用於虛擬設備處理ARP報文的。

優先級:用於表示物理設備的優先級,這個參數用於Master的選舉,取值范圍是1-254,這個有優先級有兩個比較特殊的值,分別是0255,優先級0是由原來Master設備發送的,這個優先級是聲明此設備不再參與VRRP組。優先級為255的是IP擁有者的優先級,擁有這個優先級會直接成為Master(優先級數值越低優先級則越高)

搶占模式:Backup 設備接收到的VRRP報文通過分析得出當前Master設備的優先級低於Backup設備,則Backup設備會切換為Master設備。

1.1.2. VRRP狀態機

VRRP一共有三種狀態,分別是:初始狀態(Initialize)、活動狀態(Master)、備份狀態(Backup)。

初始狀態:在這個狀態下VRRP是不可用的,在這個狀態下的設備是不會處理VRRP報文的,通常是剛配置VRRP時和檢測到故障是會是這個狀態。

活動狀態:處於Master狀態下的設備將會做下列工作:

  • 定期發送VRRP報文。
  • 以虛擬MAC地址響應對虛擬IP地址的ARP請求。
  • 轉發目的MAC地址為虛擬MAC地址的IP報文。
  • 如果它是這個虛擬IP地址的擁有者,則接收目的IP地址為這個虛擬IP地址的IP報文。否則,丟棄這個IP報文。
  • 如果收到比自己優先級大的報文則轉為Backup狀態。
  • 如果收到優先級和自己相同的報文,並且發送端的IP地址比自己的IP地址大,則轉為Backup狀態。
  • 當接收到接口的Shutdown事件時,轉為Initialize

備份狀態:處於Backup狀態下的設備,它將會做下列工作:

  • 接收Master發送的VRRP報文,判斷Master的狀態是否正常。
  • 對虛擬IP地址的ARP請求,不做響應。
  • 丟棄目的MAC地址為虛擬MAC地址的IP報文。
  • 丟棄目的IP地址為虛擬IP地址的IP報文。
  • Backup狀態下如果收到比自己優先級小的報文時,丟棄報文,立即切換為Master(僅在搶占模式下生效)。
  • 如果收到優先級和自己相同或者比自己高的報文,則重置定時器,不進一步比較IP地址。
  • 當接收到接口的Shutdown事件時,轉為Initialize
  • 如果MASTER_DOWN_INTERVAL定時器超時,則切換為Master

三種狀態機的關系如下圖:

 

 

 

 

 

1.2. 工作流程

VRRP備份組會通過優先級選舉出MasterMaster會使用虛擬MAC發送ARP報文,使與Master連接的主機或者客戶端建立與虛擬MAC對應的ARP映射表,同時Master會周期性發布VRRP報文向所有Backup通告其配置信息與工作狀態。

如果當前Master出現故障,Backup設備將會在MASTER_DOWN_INTERVAL定時器超時或者其他聯動技術檢測到Master出現故障時則會根據Backup組內的成員的優先級選舉出新的Master,如果Backup只有一台設備則直接成為Master

新的Master使用虛擬MAC發送ARP報文,使連接在當前VRRP組內的客戶端或者設備刷新其ARP映射表。

如果原來的Master從故障中恢復過來,如果其優先級為255則會直接切換到Master,若不是則會恢復到Backup狀態,如果當前為搶占模式,當原Master接收到新MasterVRRP報文發現其優先級高於原Master則原Master會直接成為Master。如果處於非搶占模式,則原Master會在新Master出現故障時通過選舉等方式成為Master

1.2.1. VRRP選舉

VRRP通過優先級來確定設備成為Master或者Backup,優先級取值越低,則優先級越高。

初始創建的VRRP設備都處於初始狀態,在該狀態下,如果設備的優先級為255,則直接成為Master並且跳過接下來的選舉,若不是則會切換到Backup狀態,然后會等待MASTER_DOWN_INTERVAL超時后成為Master

首先切換到Master的設備會通過VRRP報文獲取其他設備的優先級,然后通過以下規則進行選舉:

  1. 如果Backup設備接收到來自MasterVRRP報文,發現其優先級數值低於自身,則繼續處於Backup狀態。
  2. 如果Backup設備接收到來自MasterVRRP報文,發現其優先級數值高於自身,則當前Backup設備會切換到Master,而原Master設備會切換到Backup。如果在非搶占模式下,Backup設備仍然會處於Backup狀態。
  3. 如果同時有多個設備切換到Master,則會互相通過VRRP報文確定其優先級,優先級高的則成為Master,若優先級一樣,則對比IP地址,IP地址大的則成為Master

1.2.2. VRRP狀態通告

Master設備會周期性發送VRRP報文,通告其配置信息與工作狀態,Backup則會接收並處理VRRP報文確定Master設備的工作狀態。

Master主動退出VRRP組是,會發送優先級為0的報文通知所有的Backup設備,Backup設備接收到之后會直接切換到Master狀態,若Backup組內有多台設備則通過上述選舉選出新的Master設備,而不需要等待MASTER_DOWN_INTERVAL超時后再進行切換或者選舉。

Master設備由於故障不能發送VRRP報文,所有的Backup設備都需要等待MASTER_DOWN_INTERVAL 超時后才會認為Master設備出現故障,之后才切換到Master

1.2.3. VRRP兩種模式

1、 主備備份模式

主備備份模式就是只由Master設備負責轉發數據,而Backup設備則處於待機備份模式不參與數據轉發,當Master設備出現故障時才會切換到Master進行數據轉發。

參照下圖,正常情況下只有SW1轉發數據,而SW2則處於待機狀態,SW1會周期發送VRRP報文告知SW2自身的配置信息和工作狀態,如果SW1發生故障,則SW2會自動切換到到Master繼續進行數據轉發等。

而當SW1恢復之后,若當前為搶占模式,若SW1的優先級為255那么SW1會直接成為Master否則會先切換到Backup然后再切換到Master

 

 

 

 

主備模式

2、 負載分擔模式

上述的主備備份模式,若SW1一直正常工作,那么SW2則長期處於待機狀態,顯然這種做法比較浪費,所以一般會采用負載分擔模式,負載分到模式會是SW2都處於工作狀態。

參照下圖,負載分擔模式是創建兩個VRRP組分別為A組和B組,A組的MasterSW1BackupSW2,而B組的MasterSW2BackupSW1,通過創建多個擁有不同虛擬IPVRRP組,為不同的VLAN指定網關實現負載分擔。

 

 

 

 

負載分擔模式

參照上圖,在VLAN10當中MasterSW1BackupSW2,兩台交換機都分別創建vlan10vlan20 並且分配好IP地址,正常情況下vlan10的客戶端會通過SW1訪問R1vlan20的客戶端會通過SW2訪問R1這樣就實現了負載分擔,如果SW1出現故障,那么SW2會成為vlan10Master(同時也是vlan20Master),接替SW1的工作,而vlan10的客戶端也會通過SW2訪問R1,而SW2故障則同理。

2. Keepalived

 

2.1. 配置說明

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

#全局定義塊,定義主從切換時通知郵件的SMTP配置
global_defs {

   #郵件告警列表
   notification_email {
     897807300@qq.com
   }

   #指定發件人
   notification_email_from keepalived@localhost

   #指定smtp服務器地址
   smtp_server 127.0.0.1

   #指定smtp連接超時時間
   smtp_connect_timeout 30

   #負載均衡標識,在局域網內應該是唯一的
   router_id waf_lvs_master_01
}

 

#作用:添加一個周期性執行的腳本。腳本的退出狀態碼會被調用它的所有的VRRP Instance記錄。

#注意:至少有一個VRRP實例調用它並且優先級不能為0.優先級范圍是1-254.

vrrp_script chk_nginx
{
script "/home/check.sh"

#重試次數
interval 3

#范圍[-254到254]
weight -50
}

vrrp_instance VI_1 {
#實例角色。分為一個MASTER和一(多)個BACKUP。
state BACKUP

#綁定VIP的網絡接口
interface eth0

#標識虛擬路由的ID號,兩個節點設置必須一樣,有效范圍為0-255
virtual_router_id 230

#節點優先級,值范圍0~254,MASTER>BACKUP
priority 90

#組播信息或者VRRP協議發送時間間隔,兩個節點必須設置一樣,默認為1秒
advert_int 5

#設置驗證信息,兩個節點必須一致
authentication {
   auth_type PASS
   auth_pass 1111
}

#虛擬IP(VIP),兩個節點設置必須一致,可以設置多個
virtual_ipaddress {
    172.26.130.184
        }

#存活狀態檢測腳本
track_script {
        chk_nginx      
    }
}

virtual_server 172.26.130.184 80 {
#健康檢查的時間間隔
delay_loop 60

#rr|wrr|lc|wlc|lblc|sh|dh:LVS調度算法
lb_algo rr

#LVS模式(NAT|DR|TUN)
lb_kind DR

nat_mask 255.255.255.0

#持久化超時時間,單位是秒。默認是6分鍾
persistence_timeout 50

#4層協議TCP|UDP|SCTP
protocol TCP

real_server 172.26.130.109 80 {

    #給服務器指定權重
    weight 50

    TCP_CHECK {     # 通過TcpCheck判斷RealServer的健康狀態,其他SMTP_CHECK支持SMTP和DNS_CHECK支持DNS
          connect_timeout 10    # 連接超時時間
          nb_get_retry 3        # 重連次數
          delay_before_retry 3  # 重連時間間隔
          connect_port 80     # 檢測端口
        }
    }

    real_server 172.26.130.126 80 {

        weight 50
        TCP_CHECK {     # 通過TcpCheck判斷RealServer的健康狀態

                connect_timeout 10    # 連接超時時間
                nb_get_retry 3        # 重連次數
                delay_before_retry 3  # 重連時間間隔
                connect_port 80     # 檢測端口
        }
    }
}

2.2. vrrp_script詳解

1vrrp_script能做什么

keepalived只能做到對網絡故障和keepalived本身的監控,即當出現網絡故障或者keepalived本身出現問題時,進行切換。但是這些還不夠,我們還需要監控keepalived所在服務器上的其他業務進程,比如說nginxkeepalived+nginx實現nginx的負載均衡高可用,如果nginx異常,僅僅keepalived保持正常,是無法完成系統的正常工作的,因此需要根據業務進程的運行狀態決定是否需要進行主備切換。這個時候,我們可以通過編寫腳本對業務進程進行檢測監控。

例如:編寫個簡單腳本查看haproxy進程是否存活

 

#!/bin/bash

count = `ps aux | grep -v grep | grep haproxy | wc -l`

if [ $count > 0 ]; then
    exit 0
else
    exit 1
fi

  

keepalived的配置文件中增加相應配置項

 

vrrp_script checkhaproxy
{
    script "/home/check.sh"
    interval 3
    weight -20
}
vrrp_instance test { ... track_script { checkhaproxy } ... }

  

2、優先級更新策略

keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。

如果腳本執行結果為0,並且weight配置的值大於0,則優先級相應的增加 ;如果腳本執行結果非0,並且weight配置的值小於0,則優先級相應的減少

其他情況,維持原本配置的優先級,即配置文件中priority對應的值。

這里需要注意的是: 

1) 優先級不會不斷的提高或者降低 

2) 可以編寫多個檢測腳本並為每個檢測腳本設置不同的weight 

3) 不管提高優先級還是降低優先級,最終優先級的范圍是在[1,254],不會出現優先級小於等於0或者優先級大於等於255的情況

這樣可以做到利用腳本檢測業務進程的狀態,並動態調整優先級從而實現主備切換。

 

3vrrp_script中節點權重改變算法

Keepalived集群中,其實並沒有嚴格意義上的主、備節點,雖然可以在Keepalived配置文件中設置“state”選項為“MASTER”狀態,但是這並不意味着此節點一直就是Master角色。控制節點角色的是Keepalived配置文件中的“priority”值,但並它並不控制所有節點的角色,另一個能改變節點角色的是在vrrp_script模塊中設置的“weight”值,這兩個選項對應的都是一個整數值,其中“weight”值可以是個負整數,一個節點在集群中的角色就是通過這兩個值的大小決定的。

3.1、不設置weight

vrrp_script模塊中,如果不設置“weight”選項值,那么集群優先級的選擇將由Keepalived配置文件中的“priority”值決定,而在需要對集群中優先級進行靈活控制時,可以通過在vrrp_script模塊中設置“weight”值來實現。

3.2、設置weight

vrrp_script 里的script返回值為0時認為檢測成功,其它值都會當成檢測失敗;weight 為正時,腳本檢測成功時此weight會加到priority上,檢測失敗時不加.

 

主失敗

priority < priority + weight 時會切換。

主成功:

priority + weight > priority + weight 時,主依然為主 

weight 為負時,腳本檢測成功時此weight不影響priority,檢測失敗時priority – abs(weight)

主失敗:

priority – abs(weight) < priority 時會切換主從

主成功:

priority > priority 主依然為主

 

4、配置不搶占nopreempt帶來的問題

 

例如:A,B兩台keepalived

A的配置大概為:

 vrrp_script checkhaproxy

{

    script "/etc/check.sh"

    interval 3

    weight -20

}

 

vrrp_instance test

{

    ....

    state backup

    priority 80

    nopreempt

    track_script

    {

        checkhaproxy

    }

    ....

}

 B的配置大概為:

 vrrp_script checkhaproxy

{

    script "/etc/check.sh"

    interval 3

    weight -20

}

vrrp_instance test

{

    ....   

    state backup

    priority 70 

    track_script

    {

        checkhaproxy

    }

     ....

}

A,B同時啟動后,由於A的優先級較高,因此通過選舉會成為master。當A上的業務進程出現問題時,優先級會降低到60。此時B收到優先級比自己低的vrrp廣播包時,將切換為master狀態。那么當B上的業務出現問題時,優先級降低到50,盡管A的優先級比B的要高,但是由於設置了nopreemptA不會再搶占成為master狀態。 

所以,可以在檢測腳本中增加殺掉keepalived進程(或者停用keepalived服務)的方式,做到業務進程出現問題時完成主備切換。 

 

 


免責聲明!

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



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