keepalived(一)原理介紹和配置檔案詳解

十五十六發表於2018-09-14

簡介

Keepalived是一個用C語言編寫的路由軟體,該專案的主要目標是為Linux系統和基於Linux的基礎設施提供簡單而健壯的負載均衡和高可用性設施。負載均衡依賴於提供第四層負載均衡廣泛使用的Linux虛擬伺服器(IPVS)核心模組。Keepalived實現了一組檢查器,用於根據負載均衡伺服器池的健康狀況動態地和自適應地維護和管理負載均衡伺服器池。另一方面,通過VRRP協議實現了高可用性。VRRP是路由器故障轉移的基礎磚。此外,Keepalived實現了一組到VRRP有限狀態機的鉤子,提供了低階和高速的協議互動。Keepalived框架可以獨立使用,或者一起使用以提供彈性基礎結構。

Keepalived架構圖

這裡寫圖片描述
圖片來自Keepalived權威指南

  • WatchDog:提供了對子程式(VRRP和healthchecker)的監控
  • Checkers元件:負責RealServer的健康狀況檢查,並在LVS的拓撲中移除、新增RealServer。它支援layer4/5/7層的協議檢查。該元件使用獨立的子程式負責,但被父程式監控。
  • VRRP元件:提供Director的故障轉移功能從而實現Director的高可用。該元件可獨立提供功能,無需LVS的支援。該元件使用獨立的子程式負責,但被父程式監控。
  • System Call元件:提供讀取自定義指令碼的功能。該元件在使用時,將臨時產生一個子程式來執行任務。
  • IPVS wrapper元件:負責將配置檔案中IPVS相關規則傳送到核心的ipvs模組。
  • Netlink Reflector:用來設定、監控vrrp的vip地址。

Keepalived故障切換轉移原理

keepalived之間的故障切換轉移,是通過VRRP協議實現的
在keepalive directors 正常工作時,主節點會不斷的向備節點廣播心跳資訊,用以告訴備節點自己還活著,當主節點發生故障,備節點無法繼續監測主節點的心跳,進而呼叫自身的接管程式,接管主節點的ip資源以及服務,而從節點恢復故障時,備節點會釋放主節點故障時自身接管的ip資源以及服務,恢復到自身的備用角色

安裝

yum install keepalived -y

配置檔案

組成部分

##global全域性配置
global_defs {
    notification_email {  #定義郵件收件人
        root@localhost 
    }
    notification_email_from keepalived@localhost #定義郵件發件人
    smtp_server 127.0.0.1  #郵件伺服器
    smtp_connect_timeout 30 #連線超時時間
    router_id node1         #用來標識當前機器,可以用主機名
    vrrp_mcast_group4 224.0.100.19 #多播地址
}
##vrrp協議配置
vrrp_instance VI_1 {  #vrrp名稱,可以自定義
    state BACKUP      #當前節點狀態,MASTER|BACKUP
    interface ens33 #vip繫結的網路介面
    virtual_router_id 14  #虛擬路由標識(VRID),同一例項該數值必須相同,
            #即master和backup中該值相同同一網路卡上的不同vrrp例項,該值必須不能相同。取值範圍0-255
    priority 98           #優先順序
    advert_int 1          #vrrp通告的時間間隔;
    authentication {      #簡單認證
        auth_type PASS
        auth_pass 571f97b2 #密碼
    }
    virtual_ipaddress {   #設定的VIP。只有master節點才會設定。master出現故障後,VIP會故障轉移到backup。
                         #這些vip預設配置在interface指定的介面別名上,可使用dev選項來指定配置介面。
                         #使用ip add的方式新增。若要被ifconfig檢視,在IP地址後加上label即可。
                         #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
        10.1.0.91/16 dev ens33 ##vip繫結在en33網路卡介面
                    }
    notify_master "/etc/keepalived/notify.sh master" #狀態為主節點時,觸發的指令碼,指令碼需要自定義
    notify_backup "/etc/keepalived/notify.sh backup" #狀態為備節點時,觸發的指令碼,指令碼需要自定義
    notify_fault "/etc/keepalived/notify.sh fault"   #節點down了,觸發的指令碼,指令碼需要自定義
}           
#虛擬服務
virtual_server { 
    delay_loop 1 #服務輪詢的時間間隔,單位s;
    lb_algo rr   #定義排程方法,rr|wrr|lc|wlc|lblc|sh|dh;
    lb_kind DR   #叢集的型別;NAT|DR|TUN
    persistence_timeout 1#持久連線時長;
    protocol TCP #服務協議,僅支援TCP;
    sorry_server 127.0.0.1 80 #備用伺服器地址; <IPADDR> <PORT>
    real_server 10.1.0.69 80 { #定義real server部分
        weight 1 #LVS權重
        HTTP_GET {  #健康狀況檢查的檢查方式,常見的有HTTP_GET|SSL_GET|TCP_CHECK|MISC_CHECK。
            url {      
                path /   #定義要監控的URL
                status_code 200 #判斷檢測機制為健康狀態的響應碼
                #digest <STRING>:判斷檢測機制為健康態狀的響應的內容的校驗碼;需要比對頁面內容的校驗碼可以用genhash或者直接md5sum 生成然後寫在這裡
            }
             nb_get_retry 3 #重試次數;
             delay_before_retry 1  #重試之前的延遲時長;
             #connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
             #connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
             #bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
             #bind_port <PORT>:發出健康狀態檢測請求時使用的源埠;
             connect_timeout 1  #連線請求的超時時長;
        }
        #TCP_CHECK { tcp健康檢查示例
            #connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
            #connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
            #bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
            #bind_port <PORT>:發出健康狀態檢測請求時使用的源埠;
            #connect_timeout <INTEGER>:連線請求的超時時長;
        #       }       
    }
    real_server 10.1.0.71 80 {
        weight 1  
        HTTP_GET {
        url {
            path /
            status_code 200
          }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }

}

相關文章