Linux keepalived工作原理


keepalived簡介與工作原理

  Keepalived的作用是檢測服務器的狀態,如果有一台web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。

  keepalived工作在IP/TCP協議棧的IP層,TCP層,及應用層,工作原理基於VRRP協議。

  網絡層(layer 3):Keepalived會定期向服務器群中的服務器發送一個ICMP的數據包,(既我們平時用的Ping程序),如果發現某台服務的IP地址沒有激活,Keepalived便報告這台服務器失效,並將它從服務器群中剔除。

  傳輸層(layer 4):Keepalived以TCP端口的狀態來決定服務器工作正常與否,如web server的服務端口一般是80,如果Keepalived檢測到80端口沒有啟動,則Keepalived將把這台服務器從服務器群中剔除。

  應用層(layer 5):只要針對應用上的一些探測方式,如URL的get請求,或者對nginx腳本檢測等;可以根據用戶自定義添加腳本針對特定的服務進行狀態檢測,當檢測結果與用戶設定不一致,則把這台服務器從服務器群中剔除。

VRRP協議與工作原理

  VRRP(Virtual Router Redundancy Protocol)虛擬路由冗余協議是一種容錯的主備模式的協議,當網絡設備發生故障時,可以不影響主機之間通信情況下進行設備切換,並且相對用戶時切換過程時透明的。

  路由器開啟VRRP功能后,會根據優先級確定自己在備份組中的角色。優先級高的路由器成為主用路由器,優先級低的成為備用路由器。主用路由器擁有虛擬IP與虛擬MAC,實現各種網絡功能,並發送VRRP通告報文,通知備用路由器組內的其他路由器自己工作正常;備用路由器則啟動定時器等待通告報文。搶占模式下,當備用路由器收到VRRP通告報文后,會將自己的優先級與通告報文中的優先級進行比較。如果大於通告報文中的優先級,則成為主用路由器;否則將保持備用狀態。非搶占模式下,只要主用路由器不發生故障,就算備用路由器的優先級再高,也始終保持備用狀態。如果備用路由器的定時器超時后仍未收到主用路由器發送來的VRRP通告報文,則認為主用路由器已經無法正常工作,備份組內的路由器根據優先級選舉出主用路由器。

  • 一個VRRP路由器有唯一的標識:VRID,范圍為0—255。該路由器對外表現為唯一的虛擬MAC地址,地址的格式為00-00-5E-00-01-[VRID]。
  • 同一台路由器可以加入多個備份組,在不同備份組中有不同的優先級,使得該路由器可以在一個備份組中作為主用路由器,在其他的備份組中作為備用路由器。
  • 提供了兩種安全認證措施:明文認證和IP頭認證。

VRRP選舉機制

  1. 虛擬IP擁有者,如果某台路由器的IP地址與虛擬路由器的VIP地址一致,那么這台就會被選為主用路由器。
  2. 優先級較高者,如果沒有虛擬IP擁有者,優先級數值大的路由器會被選舉出,優先級范圍0~255。
  3. IP地址較大者,如果優先級一樣高,IP地址數值大的路由器會被選舉出。

keepalived配置組成

  global_defs是對全局一些參數做出設置。

global_defs {
   notification_email {
   # 接受郵件地址
     sysadmin@firewall.loc
   }
   notification_email_from master@keepalived.com
   # 郵件頭地址
   smtp_server 192.168.200.1
   # 郵件服務smtp地址
   smtp_connect_timeout 30
   # smtp連接超時時間
   router_id LVS_DEVEL
   # 本地機器的id,可以為本地主機名
   vrrp_skip_check_adv_addr
   # 檢查收到的通告中的所有地址會非常耗時,設置此參數就不會檢查收到過的主路由器的通告
   vrrp_strict
   # 嚴格遵守VRRP協議,開啟這個功能會在iptables中添加下面一條規則,導致VIP ping不通
   # Chain INPUT (policy ACCEPT)
   # target     prot opt source               destination 
   # DROP       all  --  0.0.0.0/0            172.30.100.200
   vrrp_garp_interval 0
   # 一個網卡上每組gratuitous arp消息之間的延遲時間,默認為0
   vrrp_gna_interval 0
   # 一個網卡上每組na消息之間的延遲時間,默認為0
   vrrp_iptables
   # 設置此項則不會開啟任何iptables規則
   vrrp_mcast_group4 224.0.0.18
   # 主備間通告狀態信息的組播地址,通常為224網段
}

   vrrp_script只是定義一個對集群服務的健康狀態檢測腳本,並根據監控的結果狀態能實現優先動態調整;這種方式在做高可用nginx或者haproxy時需要用到。  

vrrp_script chk_nginx {
    script 
    # 添加要定期執行的檢測腳本,它的退出代碼將被記錄在監視它的所有VRRP實例中
    interval 2
    # 兩次腳本調用的間隔,默認為1秒
    weight -20
    # 如果檢測條件成立,權重-20
}

  vrrp_instance是虛擬路由實例的配置段,用來定義當前keepalived節點的運行角色為主或是備,定義當前節點的優先級,設置虛擬IP等信息。

vrrp_instance VI_1 {
# 定義虛擬路由器,實例名稱VI_1主備必須相同
    state MASTER
    # 定義此節點為MASTER
    interface eth0
    # 綁定為當前虛擬路由器使用的物理接口
    virtual_router_id 51
    # 設置虛擬路由id,范圍0~255,主備必須相同
    priority 100
    # 設置此節點優先級
    advert_int 1
    # 設置主備節點間vrrp通告狀態的時間間隔
    authentication {
    # 設置主備間驗證方式
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    # 設置虛擬路由VIP
        172.30.200.1
    }
    track_script {
    # 添加監控腳本,腳本名為vrrp_script中定義的腳本
        chk_nginx
    }
}

  virtual_server中定義了LVS工作模式及調度算法等信息,real_server則是定義后端的真實服務器。

virtual_server 172.30.200.1 80 {
# 定義虛擬主機IP與端口
    delay_loop 6
    # 健康狀態檢測時間間隔
    lb_algo rr
    # lvs調度算法
    lb_kind NAT
    # lvs工作類型
    persistence_timeout 50
    # lvs持久連接超時時間
    protocol TCP
    # 定義服務協議
    sorry_server 172.30.10.14 80
    # 當后端所有主機不可達時,就會被定義這台主機,只是為了展示sorry頁面
    real_server 172.30.10.12 80 {
    # 配置后端主機
        weight 1
        # 調度權重
        HTTP_GET {
        # 應用層檢測
            url {
              path /testurl/test.jsp
              # 定義被檢測的URL
              status_code 200
              # 判斷上述URL健康狀態的響應碼
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 判斷上述URL健康狀態的內容的hash碼
            }
            connect_timeout 3
            # 檢測連接的超時時間
            nb_get_retry 3
            # 重試次數
            delay_before_retry 3
            # 重試前等待時間
        }
        TCP_CHECK {
             connect_ip 172.30.10.12 
             # 選擇要連接的IP地址。默認值為realserver IP
             connect_port 80
             # 選擇要連接的端口。默認值為realserver PORT
             bindto 172.30.10.11
             # 用於發起連接的可選源地址
             bind_port 10000
             # 用於發起連接的可選源端口
             connect_timeout 3
             # 連接超時時間
        }
    }
    real_server 172.30.10.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


免責聲明!

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



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