HA Cluster 之 vrrp (keepalived)

 

0x00 前言

傳統的集群方案( 如 lvs ) 在 director 處容易出現單點故障,為了解決此問題,可在 Director 處設立 冗余。當一個出現故障時,另一個可取而代之。
活動節點不但要自己提供服務,而且還將自己的活動信息以固定頻率周期性的同步給備用節點, 備用節點在一個或指定的周期內沒能收到心跳信息時會取而代之。

  • 衡量系統可用的指標:
    A=MTFB/(MTBF+MTTR)
    95%, 99%, …, 99.999%,99.9999%;

  • HA Cluster實現方案:

    • vrrp協議的實現 :
      keepalived
    • ais:完備HA集群 :
      RHCS(cman)
      heartbeat
      corosync

0x01 VRRP 協議

VRRP 簡介

  • VRRP : Virtual Router Redundancy Protocol (虛擬路由冗余協議), 是由IETF提出的解決局域網中配置靜態網關出現單點失效現象的路由協議.

  • VRRP廣泛應用在邊緣網絡中

  • VRRP設計目標:
    支持特定情況下IP數據流量失敗轉移不會引起混亂,允許主機使用單路由器,以及及時在實際第一跳路由器使用失敗的情形下仍能夠維護路由器間的連通性。

VRRP 工作原理

  1. 路由器開啟VRRP功能后,會根據優先級確定自己在備份組中的角色。優先級高的路由器成為主用路由器,優先級低的成為備用路由器。主用路由器定期發送VRRP通告報文,通知備份組內的其他路由器自己工作正常;備用路由器則啟動定時器等待通告報文的到來。
  2. VRRP在不同的主用搶占方式下,主用角色的替換方式不同

    • 搶占方式下,當主用路由器收到VRRP通告報文后,會將自己的優先級與通告報文中的優先級進行比較。如果大于通告報文中的優先級,則成為主用路由器;否則將保持備用狀態。
    • 非搶占方式下,只要主用路由器沒有出現故障,備份組中的路由器始終保持主用或備用狀態,備份組中的路由器即使隨后被配置了更高的優先級也不會成為主用路由器。
  3. 如果備用路由器的定時器超時后仍未收到主用路由器發送來的VRRP通告報文,則認為主用路由器已經無法正常工作,此時備用路由器會認為自己是主用路由器,并對外發送VRRP通告報文。備份組內的路由器根據優先級選舉出主用路由器,承擔報文的轉發功能。

VRRP負載分擔方式的特點

  1. 每個備份組都包括一個主用路由器和若干個備用路由器。
  2. 各備份組的主用路由器可以不相同
  3. 同一臺路由器可以加入多個備份組,在不同備份組中有不同的優先級,使得該路由器可以在一個備份組中作為主用路由器,在其他的備份組中作為備用路由器。

VRRP 中的一些術語

  • VR: Virtual Router 虛擬路由器
  • VRID 虛擬路由器標識:0-255)
  • 物理路由器:
    master:主設備
    backup:備用設備
    priority:優先級
  • VIP:Virtual IP
  • VMAC:Virutal MAC (00-00-5e-00-01-VRID) (一般是固定的)

VRRP 的控制報文機制—— VRRP通告:(advertisement)?
它使用IP多播數據包進行封裝,組地址為224.0.0.18,發布范圍只限于同一局域網內?

VRRP在安全方面:可以采用簡單字符認證,或MD5 認證( 8 位); 也可以使用無認證方式。

0x02 keepalived 功用:

keepalived : vrrp協議的軟件實現,原生設計的目的為了高可用ipvs服務:

  1. vrrp 協議的軟件實現,完成地址流動
  2. 根據 讀取配置文件 為 unix主機內核 生成 ipvs 規則, 提供了 高可用ipvs服務
  3. 為ipvs集群的各RS做健康狀態檢測;
  4. 基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;

0x03 keepalived 配置

HA Cluster 的配置前提:

  1. 各節點時間必須同步
    ntp, chony
  2. 確保iptables, selinux 不成為阻礙。
    iptables -F && setenforce 0
  3. 各節點之間可通過主機名互相通信 (對KA并非必須);
    建議使用 /etc/hosts 文件實現解析; (不要用DNS 解析)
  4. 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;(并非必須)

配置文件組件部分:

  • GLOBAL CONFIGURATION
    Global definitions
    Static routes/addresses
  • VRRPD CONFIGURATION
    VRRP synchronization group(s):vrrp同步組;
    VRRP instance(s):每個vrrp instance相當于一個vrrp路由器;
  • LVS CONFIGURATION
    Virtual server group(s)
    Virtual server(s):ipvs集群的vs和rs;

配置文件解析:

! Configuration File for keepalived

###    GLOBAL CONFIGURATION     ###

global_defs {

    ##  定義通知接收郵箱 ##
   notification_email {
     root@localhost        
   }
   #- - - - - -#
   notification_email_from  keepalived@localhost       # 通知發送郵箱     
   smtp_server 127.0.0.1                  # 郵箱server
   smtp_connect_timeout 30
   router_id node1                        # 定義 router_id
   vrrp_mcast_group4 224.0.100.19         # 組播域
}

###   VRRPD CONFIGURATION   ###

    ### vrrp_script ###
vrrp_script  script_name {  
    script " killall -0 nginx && exit || exit 1"

    interval 1   # 間隔時間
    weight -5 
}

vrrp_script script_name2 {
    ...
    }
   ### vrrp_instance ###
vrrp_instance KA_1 {
    state MASTER                        # 主備狀態  MASTER | BACKUP
    interface ens32                     # 定義 網卡接口
    virtual_router_id 51                # 虛擬路由 id
    priority 100                        # 優先級
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qweqwe                # 指定 密碼
    }

    ## 定義 virtual_ipaddress ##
    virtual_ipaddress {
        172.18.9.111/16 
    }

    track_script {        # 調用下面的腳本
        # script_name 
    }
    ##  調用通知腳本 ##  腳本見附錄
    notify_master "/etc/keepalived/notify.sh  master"
    notify_backup "/etc/keepalived/notify.sh  backup"
    notify_fault "/etc/keepalived/notify.sh   fault"

}

vrrp_instance KA_2 {

    ...
}



###   LVS CONFIGURATION   ###


virtual_server 192.168.200.100 443 {
    delay_loop 6                         # 服務輪詢的時間間隔
    lb_algo rr                           # 定義調度方法: rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT                          # 集群的類型 NAT | DR | TUN
    nat_mask 255.255.255.0               # 只限于 NAT 類型使用
    persistence_timeout 50               # 持久連接時長
    protocol TCP                         # 服務協議,僅支持TCP
    # sorry_server <IPADDR> <PORT>       # 備用服務器地址

    ##  real_server <IPADDR> <PORT>
    real_server 192.168.201.100 443 {
        weight 1                         # 定義 weight
        SSL_GET {                        # 應用層檢測  HTTP_GET|SSL_GET
            url {
              path /                     # 定義要監控的 URL_PATH
              # status_code <INT>        # 判斷上述檢測機制為健康狀態的響應碼;           
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  # 判斷上述檢測機制為健康狀態的響應的內容的校驗碼
            }
            url {
            ...
            }

            connect_timeout 3           # 連接請求的超時時長
            nb_get_retry 3              # 重試次數
            delay_before_retry 3        # 重試之前的延遲時長
            #connect_ip <IP ADDRESS>    # 向當前RS的哪個IP地址發起健康狀態檢測請求
            #connect_port <PORT>        # 向當前RS的哪個PORT發起健康狀態檢測請求
            #bindto <IP ADDRESS>        # 發出健康狀態檢測請求時使用的源地址;
            #bind_port <PORT>           # 發出健康狀態檢測請求時使用的源端口;
        }

    #TCP_CHECK {
            #connect_ip <IP ADDRESS>    # 向當前RS的哪個IP地址發起健康狀態檢測請求
            #connect_port <PORT>        # 向當前RS的哪個PORT發起健康狀態檢測請求
            #bindto <IP ADDRESS>        # 發出健康狀態檢測請求時使用的源地址;
            #bind_port <PORT>           # 發出健康狀態檢測請求時使用的源端口;
            #connect_timeout <INTEGER>  # 連接請求的超時時長;
    #           }
    }
}

附:郵件通知腳本

#!/bin/bash
#
contact='root@localhost'

notify() {
    mailsubject="$(hostname) to be $1, vip floating"
    mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
    echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
    notify master
    ;;
backup)
    notify backup
    ;;
fault)
    notify fault
    ;;
*)
    echo "Usage: $(basename $0) {master|backup|fault}"
    exit 1
    ;;
esac

原創文章,作者:Yanglibin,如若轉載,請注明出處:http://www.www58058.com/75916

(0)
YanglibinYanglibin
上一篇 2017-05-16 08:42
下一篇 2017-05-16 19:01

相關推薦

  • HTTP的基礎配置

    目錄: 1.修改監聽的IP和PORT 2.持久連接(保持連接,長連接) 3.MPM 4.DSO 5.定義’Main’ server_name的文檔頁面路徑 6.站點訪問控制常見機制 7.定義站點主頁面: 8.定義路徑別名 9.設定默認字符集 10.日志設定 11.基于用戶的訪問控制 12.虛擬主機 13.status頁面 14.cur…

    Linux干貨 2017-08-08
  • 文件管理

    compress:壓縮命令 -d:解壓縮(=uncompress) -c:結果輸出到標準輸出,不刪除原文件 -v:顯示詳情 zcat:不解壓文件查看內容   gzip:壓縮命令 -d:解壓縮 -c:結果輸出到標準輸出,不刪除原文件 -#:1-9代表壓縮比,默認為6 zcat:不解壓文件查看內容   bzip2:壓縮命令 -k:保留原文件 …

    Linux干貨 2016-08-18
  • 常用命令總結

    &:將要執行的進程送入后臺進行執行alias:定義命令別名authconfig :對系統資源進行安全認證basename:抓取一個目錄的基名basename pwdbzip2:壓縮工具bzip2 case.sh case.sh.bz2    -[1-9]:指定壓縮比   &nbsp…

    Linux干貨 2017-04-09
  • grep,egrp,fgrep 命令與正則表達式

    一 簡介     grep (global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。 Unix的grep家族包括grep、egrep和fgrep…

    Linux干貨 2016-01-19
  • gzip壓縮輸出

    一、gzip介紹          gzip是GNU zip的縮寫,它是一個GNU自由軟件的文件壓縮程序,也經常用來表示gzip這種文件格式。軟件的作者是Jean-loup Gailly和Mark Adler。1992年10月31日第一次公開發布,版本號是0.1,目前的穩定版本是…

    Linux干貨 2015-07-29
  • Linux 進程及作業管理

    一 進程、線程、程序概念 1、進程(Process) 什么是進程,簡單的說,進程是程序的執行實例,即運行中的程序,同時也是程序的一個副本;程序是放置于磁盤的,而運行中的程序是位于內存中的。 2、線程(Thread) 一個進程至少包括一個線程,通常將該線程稱為主線程,所以線程是比進程更小的單位,是系統分配處理器時間資源的基本單元。一個進程要想同時在多顆CPU上…

    Linux干貨 2016-03-15
欧美性久久久久