HA Cluster:keepalived

HA Cluster

  • 集群類型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP

  • 系統可用性的公式:A=MTBF/(MTBF+MTTR)

    • 系統故障:

      • 硬件故障:設計缺陷、wear out、自然災害
      • 軟件故障:設計缺陷
    • 提升系統高用性的解決方案之降低MTTR:

      • 解決方案:冗余(redundant)
        active/passive(主備),active/active(雙主)
    • 在資源級別定義優先級,定義對資源的傾向性

    • Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操作;

    • Failback:故障移回,即某資源的主節點故障后重新修改上線后,將轉移至其它節點的資源重新切回的過程;

  • HA Cluster實現方案:

    • vrrp協議的實現

      • keepalived
    • ais:完備HA集群

      • RHCS(cman)
      • heartbeat
      • corosync

keepalived

  • vrrp協議:Virtual Redundant Routing Protocol

    • 術語:

      • 虛擬路由器:Virtual Router:由一個Master路由器和多個Backup路由器組成。主機將虛擬路由器當作默認網關。
      • 虛擬路由器標識:VRID(0-255):有相同VRID的一組物理路由器構成一個虛擬路由器。用來標識路由器
      • 物理路由器:
        master:主設備 #虛擬路由器中承擔報文轉發任務的路由器。
        backup:備用設備 #master路由器出現故障時,能夠代替master路由器工作的路由器。
        priority:優先級 #指的是物理節點的優先級,vrrp根據優先級來確定虛擬路由器中每臺路由器的地位。

      • VIP:Virtual IP #虛擬路由器的IP地址。一個虛擬路由器可以擁有一個或多個IP地址。

      • VMAC:Virutal MAC 一個虛擬路由器擁有一個虛擬MAC地址。虛擬MAC地址的格式為(00-00-5e-00-01-VRID)。通常情況下,虛擬路由器回應ARP請求使用的是虛擬MAC地址,只有虛擬路由器做特殊配置的時候,才回應接口的真實MAC地址。

      • 非搶占式:只有對方故障了,才可以搶; #如果Backup路由器工作在非搶占方式下,則只要master路由器沒有出現故障,backup路由器即使隨后被配置了更高的優先級也不會成為master路由器。

      • 搶占式:只要對方的優先級比自己的低,就搶; #如果backup路由器工作在搶占方式下,當它收到vrrp報文后,會將自己的優先級與通告報文中的優先級進行比較。如果自己的優先級比當前的master路由器的優先級高,就會主動搶占成為master路由器;否則,將保持backup狀態。

    • 選舉:比較優先級

    • 通告:心跳,優先級等;周期性;
      采用組播方式發送心跳,并且對信息進行認證

    • 認證:

      • 無認證
        簡單字符認證
        MD5
    • 工作模式:

      • 主/備:單虛擬路由器;
        主/主:主/備(虛擬路由器1),備/主(虛擬路由器2)
  • keepalived:

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

      • 基于vrrp協議完成地址流動;
      • 為ipvs集群節點生成ipvs規則(在配置文件中預先定義);
      • 為ipvs集群的各RS做健康狀態檢測;基于檢測結果完成節點管理;
      • 基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;
    • 組件:

      • 核心組件:
        vrrp stack
        ipvs wrapper
        checkers
      • 控制組件:
        配置文件分析器
        IO復用器
        內存管理組件
  • HA Cluster的配置前提:

    1. 各節點時間必須同步;
      ntp, chrony
    2. 確保iptables及selinux不會成為阻礙;
    3. 各節點之間可通過主機名互相通信(對keepalived并非必須);建議使用/etc/hosts文件實現;
    4. 確保各節點的用于集群服務的接口支持MULTICAST通信;
      D類:224-239;
    5. 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;(并非必須)
  • keepalived安裝配置:

    • 程序環境:

      • 主配置文件:/etc/keepalived/keepalived.conf
      • 主程序文件:/usr/sbin/keepalived
      • Unit File:keepalived.service
      • Unit File的環境配置文件:/etc/sysconfig/keepalived
    • 配置文件組件部分:

      • GLOBAL CONFIGURATION

        • Global definitions
        • Static routes/addresses
      • VRRPD CONFIGURATION

        • VRRP synchronization group(s):vrrp同步組;把兩個虛擬路由器定義成一個同步組就能確保這兩個必須把vip放在同一個節點上;
          nat服務集群時要求使用此功能;
        • VRRP instance(s):每個vrrp instance即一個vrrp路由器;
        • VRRP腳本
      • LVS CONFIGURATION

        • Virtual server group(s)
        • Virtual server(s):ipvs集群的vs和rs;
    • 配置語法:

      • 配置虛擬路由器:

        vrrp_instance <STRING> {
              ....
          }
        • state MASTER|BACKUP:當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,余下的都應該為BACKUP;
        • interface IFACE_NAME:綁定為當前虛擬路由器使用的物理接口;
        • virtual_router_id VRID:當前虛擬路由器的惟一標識,范圍是0-255;
        • priority 100:當前主機在此虛擬路徑器中的優先級;范圍1-254;
        • advert_int 1:vrrp通告的時間間隔;主備間通告時間檢查的時間間隔,單位為s,默認1s

        • 設置認證

          authentication {
            auth_type AH|PASS
            auth_pass <PASSWORD>
          }
        • 設置VIP即虛擬IP地址

          virtual_ipaddress {            
            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
            192.168.200.17/24 dev eth1
            192.168.200.18/24 dev eth2 label eth2:1
          }
        • 配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態;

          track_interface {
            eth0
            eth1
            ...
          }
        • nopreempt:定義工作模式為非搶占模式;
        • preempt_delay 300:搶占式模式下,節點上線后觸發新選舉操作的延遲時長;

        • 定義通知腳本:

          • notify_master |:當前節點成為主節點時觸發的腳本;
          • notify_backup |:當前節點轉為備節點時觸發的腳本;
          • notify_fault |:當前節點轉為“失敗”狀態時觸發的腳本;

          • notify |:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;

    • 單主配置示例:

      ! Configuration File for keepalived
      
        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_instance VI_1 {
            state BACKUP
            interface eno16777736
            virtual_router_id 14
            priority 98
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 571f97b2
            }
            virtual_ipaddress {
                10.1.0.91/16 dev eno16777736
            }
        }
    • 雙主模型示例:

      ! Configuration File for keepalived
      
        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_instance VI_1 {
            state MASTER
            interface eno16777736
            virtual_router_id 14
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 571f97b2
            }
            virtual_ipaddress {
                10.1.0.91/16 dev eno16777736
            }
        }
      
        vrrp_instance VI_2 {
            state BACKUP
            interface eno16777736
            virtual_router_id 15
            priority 98
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 578f07b2
            }
            virtual_ipaddress {
                10.1.0.92/16 dev eno16777736
            }
        }
    • 示例通知腳本:

      #!/bin/bash
        #
        contact='root@localhost'
      
        notify() {
            local mailsubject="$(hostname) to be $1, vip floating"
            local 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
      • 腳本的調用方法:

        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
  • 虛擬服務器配置:

    virtual_server IP port | virtual_server fwmark int 
      {
          ...
          real_server {
              ...
          }
          ...
      }
    • 常用參數:

      delay_loop <INT>:服務輪詢的時間間隔;
      lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法;
      lb_kind NAT|DR|TUN:集群的類型;
      persistence_timeout <INT>:持久連接時長;
      protocol TCP:服務協議,僅支持TCP;
      sorry_server <IPADDR> <PORT>:備用服務器地址;
      real_server <IPADDR> <PORT>
      {
         weight <INT>
         notify_up <STRING>|<QUOTED-STRING>
         notify_down <STRING>|<QUOTED-STRING>
         HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定義當前主機的健康狀態檢測方法;
      }
    • HTTP_GET|SSL_GET:應用層檢測

      HTTP_GET|SSL_GET {
        url {
            path <URL_PATH>:定義要監控的URL;
            status_code <INT>:判斷上述檢測機制為健康狀態的響應碼;
            digest <STRING>:判斷上述檢測機制為健康狀態的響應的內容的校驗碼; #示例:~]# curl -s  http://172.16.250.173 | md5sum
      
        }
        nb_get_retry <INT>:重試次數;
        delay_before_retry <INT>:重試之前的延遲時長;
        connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
        connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
        bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
        bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
        connect_timeout <INTEGER>:連接請求的超時時長;
      }
      TCP_CHECK {
        connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
        connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
        bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
        bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
        connect_timeout <INTEGER>:連接請求的超時時長;
      }
  • 高可用的ipvs集群示例:

    ! Configuration File for keepalived
    
      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_instance VI_1 {
          state MASTER
          interface eno16777736
          virtual_router_id 14
          priority 100
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 571f97b2
          }
          virtual_ipaddress {
              10.1.0.93/16 dev eno16777736
          }
          notify_master "/etc/keepalived/notify.sh master"
          notify_backup "/etc/keepalived/notify.sh backup"
          notify_fault "/etc/keepalived/notify.sh fault"
      }
    
      virtual_server 10.1.0.93 80 {
          delay_loop 3
          lb_algo rr
          lb_kind DR
          protocol TCP
    
          sorry_server 127.0.0.1 80
    
          real_server 10.1.0.69 80 {
              weight 1
              HTTP_GET {
              url {
                  path /
                  status_code 200
              }
              connect_timeout 1
              nb_get_retry 3
              delay_before_retry 1
              }
          }
          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
              }
          }
      }
    • TCP_CHECK使用示例:

      TCP_CHECK {
        nb_get_retry 3
        delay_before_retry 2
        connect_timeout 3
      }
  • keepalived如果要是高可用其他應用,需調用外部的輔助腳本進行資源監控,并根據監控的結果狀態能實現優先動態調整;

    • 腳本的作用:

      • 當地址轉移到這個節點的時候,將nginx啟動;
      • 當不能啟動時,還可以將IP地址轉移出去,降低優先級,促使其他節點配置此IP地址。
    • 分兩步:(1) 先定義一個腳本;(2) 調用此腳本;

      vrrp_script <SCRIPT_NAME> {
        script ""
        interval INT     #此腳本每個多長時間執行一次
        weight -INT     #萬一失敗了,當前節點的權重減一個數,減過的權重小于備用節點;
      }
      
      track_script {
        SCRIPT_NAME_1
        SCRIPT_NAME_2
        ...
      }
    • 示例:高可用nginx服務

      ! Configuration File for keepalived
      
      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_script chk_down {
        script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
        interval 1
        weight -5
      }
      
      vrrp_script chk_nginx {
        script "killall -0 nginx && exit 0 || exit 1"
        interval 1
        weight -5
        fall 2
        rise 1
      }
      
      vrrp_instance VI_1 {
        state MASTER
        interface eno16777736
        virtual_router_id 14
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 571f97b2
        }
        virtual_ipaddress {
            10.1.0.93/16 dev eno16777736
        }
        track_script {
            chk_down
            chk_nginx
        }
        notify_master "/etc/keepalived/notify.sh master"
        notify_backup "/etc/keepalived/notify.sh backup"
        notify_fault "/etc/keepalived/notify.sh fault"
      }

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

(0)
ss
上一篇 2017-06-26 22:13
下一篇 2017-06-27 10:45

相關推薦

  • 文本編輯器vim概述與應用示例

    文本編輯器vim概述與應用示例 文本編輯器概述 vim編輯器是一種易用、功能強大的文本編輯器,可以基于三種不同的模式對文本進行編輯,包括編輯模式、輸入模式和末行模式。 編輯模式 模式轉換 i 表示在光標所在處插入 a 表示在光標后方插入 o 表示在光標所在處的下一行插入 O 表示在光標所在處的上一行插入 I 表示在光標所在行的行首插入 A 表示在光標所在行的…

    Linux干貨 2017-08-06
  • RAID and LVM

    RAID          Redundant Arrays of  inexpensive(Independent)Disks,RAID:容錯式廉價磁盤陣列,容錯式獨立磁盤陣列,簡稱RAID,由加利福尼亞大學伯克利分校(University of California-Berkeley)在1988…

    Linux干貨 2016-09-02
  • Bob大叔和Jim Coplien對TDD的論戰

    今年春節時,我寫了一篇《TDD并不是看上去的那么美》,在這篇文章中我列舉了一些關于使用TDD的一些難點和對TDD的質疑,后來出現了一些爭論(可參見那篇文章的評論),以及Todd同學的《TDD到底美不美》,還有infoQ中文上的那個幾乎沒有營養離線討論。今天,有網友給我推來一個英文版infoQ的視頻——“Coplien and Martin Debate TD…

    Linux干貨 2016-08-15
  • 馬哥教育網絡班25期-第3周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# who root     tty1         2016-12-…

    Linux干貨 2016-12-19
  • Linux上的文件管理類命令

    N27-第二周作業

    2017-10-08
  • LVS詳解

    LVS詳解 LVS(Linux Virtual Server),意即Linux虛擬服務器,是一個虛擬的服務器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。 LVS 是一個工作在四層的負載均衡器,實現和 iptables/netfilter 類似,工作在內核空間的 TCP/IP 協議棧上,LVS 工作在 INPUT H…

    Linux干貨 2016-11-11
欧美性久久久久