高可用之KeepAlived(一):基本概念和配置文件分析

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/02/28/8483807.html
-Advertisement-
Play Games

KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. 概述2. VRRP協議3. KeepAlived架構模型4. 安裝KeepAlived5. 配置keepalived的日誌6. keepalived配置文 ...


KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html


本文目錄:
1. 概述
2. VRRP協議
3. KeepAlived架構模型
4. 安裝KeepAlived
5. 配置keepalived的日誌
6. keepalived配置文件詳解

1.概述

KeepAlived主要有兩個功能:

  • (1).能夠對RealServer進行健康狀況檢查,支持4層、5層和7層協議進行健康檢查;
  • (2).對負載均衡調度器實現高可用,防止Director單點故障。

在keepalived設計之初,它只是LVS周邊的一個輔助工具,用於LVS的監控狀況檢查,因此它和LVS的相容性非常好。如果某一個realserver節點宕了,keepalived會將此節點從管理列表中踢出去,當此節點恢復後又將此節點加回管理列表,這樣能夠就讓realserver負載均衡變的智能化。但是,此時的調度器存在單點故障的可能性,因此有必要對其實現高可用。

實現LVS高可用可以使用多種軟體來實現,如heartbeat,但是heartbeat本身不能實現ipvs的健康狀況檢查,需要搭配Ldirectord(安裝完heartbeat就有了)來進行健康檢查。所幸的是keepalived後來也加入了高可用的功能,而且配置起來也相當簡單。相比於heartbeat+Ldirectord,keepalived的檢查速度極快,故障轉移也極快,佈置也簡單的多。所以一般來說,要管理ipvs,都會選擇使用keepalived。下圖列出了構建LVS高可用的幾種工具:

keepalived實現故障轉移的功能是通過VRRP(virtual router redundancy protocol虛擬路由器冗餘協議)協議來實現的。 在keepalived正常工作的時候,主節點(master)會不斷的發送心跳信息給備節點(backup),當備節點不能在一定時間內收到主節點的心跳信息時,備節點會認為主節點宕了,然後會接管主節點上的資源,並繼續向外提供服務保證其可用性。當主節點恢復的時候,備節點會自動讓出資源並再次自動成為備節點。

註意,使用keepalived監控、高可用LVS集群時(即常說的keepalived+lvs),並不需要在Director上使用ipvsadm等管理工具額外配置ipvs規則。因為keepalived中集合了管理ipvs規則的組件(即稍後模型圖中的ipvs wrapper),可以直接在keepalived的配置文件中配置ipvs相關規則,在解析配置文件時會通過特定的組件將規則發送到內核中的ipvs模塊。

2. VRRP協議

VRRP協議的出現是為瞭解決靜態路由的單點故障,它是通過一種競選機制來將路由任務交給某個vrrp路由器的。

在VRRP物理結構中,有多個物理的VRRP路由器,其中有一臺稱為"master"即主節點路由器,其他的都是"backup"備節點路由器,誰是master誰是backup,這是通過他們的優先順序來定義競選的。

在VRRP虛擬結構中,虛擬路由器是通過"MAC+VRID"的形式來標識的,如"00-00-5E-00-01-{VRID}"。在VRRP虛擬結構中,不管是master還是backup,VRID必須一致。它們對外都是相同的VIP,客戶端並不需要因為master的切換而修改自己的路由配置。

VRRP結構中路由器之間的通信是通過IP多播的方式實現的(也可以配置為其它通信方式)。但是,只有master節點才會發送VRRP廣告包(vrrp advertisement message)。當master節點宕掉的時候,backup中優先順序最高的VRRP設備會搶占並升級為master。

3.keepalived架構模型

Keepalived服務啟動的時候,將產生三個相關進程,一個父進程和兩個子進程。

PID    111     Keepalived  <-- Parent process fork and monitor children
       112     \_ Keepalived   <-- VRRP child
       113     \_ Keepalived   <-- Healthchecking child

父進程負責fork和監控子進程,因此父進程也稱為WatchDog。兩個子進程都會開啟本地套接字Unix Domain Socket。當keepalived服務啟動後,父進程會通過unxi domain socket每隔5秒發送一個"Hello"消息給子進程,如果父進程無法發送消息給子進程,將認為子進程出現問題,於是會重啟子進程。

下圖是keepalived設計架構圖:

其中:

  • Checkers組件:負責RealServer的健康狀況檢查,併在LVS的拓撲中移除、添加RealServer。它支持layer4/5/7層的協議檢查。該組件使用獨立的子進程負責,但被父進程監控。
  • VRRP組件:提供Director的故障轉移功能從而實現Director的高可用。該組件可獨立提供功能,無需LVS的支持。該組件使用獨立的子進程負責,但被父進程監控。
  • System Call組件:提供讀取自定義腳本的功能。該組件在使用時,將臨時產生一個子進程來執行任務。
  • IPVS wrapper組件:負責將配置文件中IPVS相關規則發送到內核的ipvs模塊。
  • Netlink Reflector:用來設定、監控vrrp的vip地址。

4.安裝keepalived

使用keepalived,完全可以yum安裝。本文僅給出編譯安裝的方法,後文的所有配置都使用yum安裝的keepalived。

官方各版本源碼下載地址:http://www.keepalived.org/download.html。以下是編譯安裝keepalived-1.2.19版本的過程。

yum -y install openssl-devel

tar xf keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
./configure --prefix=/usr/local/keepalived-1.2.19
make && make install

其中./configure的·--with-kernel-dir·是在管理LVS時需要使用的,如果不用配合LVS,則可以不用此選項。

再做一下編譯安裝的規範行為。

ln -s /usr/local/keepalived-1.2.19 /usr/local/keepalived
echo "MANPATH /usr/local/keepalived/share/man" >>/etc/man.config
echo "export PATH=/usr/local/keepalived/sbin:$PATH" > /etc/profile.d/keepalived.sh
chmod +x /etc/profile.d/keepalived.sh
. /etc/profile.d/keepalived.sh

編譯安裝後,在安裝目錄下生成以下一些目錄,其中keepalived程式在sbin目錄下。

[root@xuexi ~]# cd /usr/local/keepalived
[root@xuexi keepalived]# ls
bin  etc  lib  sbin  share

在etc目錄下,有配置文件、SysV管理腳本和大量配置文件示例。

[root@xuexi keepalived]# ls etc
keepalived  rc.d  sysconfig
[root@xuexi keepalived]# ls etc/keepalived/
keepalived.conf  samples
[root@xuexi keepalived]# ls etc/rc.d/init.d/
keepalived

但需要註意的是,這裡提供的SysV服務管理腳本是錯誤的,原因是腳本中的keepalived命令路徑錯誤。所以修改該文件。

#原文
start() {
    echo -n $"Starting $prog: "
    daemon keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}
#修改後
start() {
    echo -n $"Starting $prog: "
    daemon /usr/local/keepalived/sbin/keepalived ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}

5.配置keepalived的日誌

預設keeepalived的日誌會記錄到/var/log/messages中。可以配置keepalived使其記錄到其它文件中。

先修改/etc/sysconfig/keepalived文件,以下是原文內容。

# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#

KEEPALIVED_OPTIONS="-D"

要配置獨立的日誌,將其中的"KEEPALIVED_OPTIONS"改為如下:

KEEPALIVED_OPTIONS="-D -S 0"

上面配置使用local0這個設備來記錄日誌,因此去修改rsyslog的配置文件/etc/rsyslog.conf,添加該設備記錄日誌的級別和路徑。

# Keepalived log config
local0.*                           /var/log/keepalived.log

再重啟rsyslog。

service rsyslog restart

6.keepalived配置文件詳解

配置文件分為3部分:全局部分、VRRPd部分(即實現高可用部分)以及LVS虛擬服務部分(健康狀況檢查以及管理的集群服務)。

選項很多,具體的意義可以man keepalived.conf。預設內容如下:

! Configuration File for keepalived

global_defs {                    #全局部分定義郵件報警系統,可以不用定義
   notification_email {          #定義郵件發送目標
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]  #定義郵件發送人
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL         #標識keepalived伺服器的字元串,實現高可用時需要使用它標識節點

        # 全局部分關於靜態地址和靜態路由的配置,可以man keepalived.conf,不過幾乎不用配置這部分
}

#定義vrrp實例。一個配置文件中可以實現多實例。但不同主機上互為master<-->backup的實例名需相同
vrrp_instance VI_1 {         
    state MASTER           #定義實例的角色狀態是master還是backup
    interface eth0         #定義vrrp綁定的介面,即接收或發送心跳通告的介面,即HA監測介面
    virtual_router_id 51   #虛擬路由標識(VRID),同一實例該數值必須相同,即master和backup中該值相同
                           #同一網卡上的不同vrrp實例,該值必須不能相同。取值範圍0-255
    priority 100           #該vrrp實例中本機的keepalived的優先順序,優先順序最高的為master。該選項的優先順序
                           #高於state選項,即若state指定的是backup,但這裡設置的值最高,則仍為master。
    advert_int 1           #心跳信息發送和接收時間間隔,單位為秒
    authentication {       #認證方式,同一實例中這個配置必須完全一樣才可通過認證。只建議使用PASS認證
        auth_type PASS
        auth_pass 1111     #最多支持8字元,超過8字元將只取前8字元
    }
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>
        192.168.200.16 label eth0:1
        192.168.200.17
        192.168.200.18
        192.168.200.19/24 dev eth1
    }
}

#定義虛擬服務部分
virtual_server 192.168.200.100 443 { #虛擬服務地址和埠,使用空格分隔,其中地址為VIP
    delay_loop 6                     #健康檢查時間間隔
    lb_algo rr                       #定義負載均衡LB的演算法,這裡使用的是rr調度演算法
    lb_kind NAT                      #lvs的模型,有NAT/DR/TUN三種
    nat_mask 255.255.255.0
    persistence_timeout 50           #持久會話保持時長
    protocol TCP                     #監控服務的協議類型,1.3.0版本之前只支持tcp,之後還支持udp

    real_server 192.168.201.100 443 {   #定義real_server部分,地址和埠使用空格分隔
        weight 1       #LVS權重
        SSL_GET {      #健康狀況檢查的檢查方式,常見的有HTTP_GET|SSL_GET|TCP_CHECK|MISC_CHECK。
            url {      
              path /   #指定ssl_get健康狀況檢查的路徑,例如檢查index.html是否正常
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  
                                #健康狀況需要狀態碼,可以是status_code、digest或digest+status_code
                                #digest值用keepalived的genhash命令生成,一般使用status_code即可
              status_code 200
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3           #表示3秒無響應就超時,即此realserver不健康,需重試連接
            nb_get_retry 3              #表示重試3次,3次之後都超時就是宕機,防止誤傷(nb=number)
            delay_before_retry 3        #重試的時間間隔
                                        #上述配置需12秒才能判斷節點故障,時間太久,應改小
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358    #定義當所有Real server都宕機的時候,由哪台伺服器繼續提供服務
                                         #一般在keepalived本機給定一個web頁面,提示網站正在維護的信息

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

關於配置文件中的幾種時間間隔:

  • advert_int N1:vrrp主備之間發送和接收心跳信息的時間間隔。和Checker組件無關。
  • delay_loop N2:是健康狀況檢查的時間間隔。每隔幾秒就檢查一次。
  • connect_timeout N3:連接RS的超時時間,連接不上說明不健康,需要重試連接來判定RS是否故障。
  • nb_get_retry N4:一個節點不健康的判定重試次數。要重試N次,N次內都不健康說明節點故障了。
  • delay_before_retry N5:判定某節點不健康後過N秒再進行重試判定。

N2和N5的區別在於:當上一次健康檢查結果是正常的,將會隔N2秒再檢查。如果某次檢查不健康,即聯繫不上RS,則每隔N5秒重試一次,直到N4次後才判定該RS已經故障。因此,最終需要N3+N4*N5才能判定一個節點的故障。

雖然健康檢查的失敗次數是可以指定的,但一般都會設置多於1次防止誤傷。另外,成功的檢查只需一次即可。

keepalived支持4層、5層和7層的健康狀況檢查,按檢查類型又可分為TCP檢查(4層)、HTTP檢查(5層)、SSL_HTTP檢查(5層)以及自定義的MISC檢查(可實現7層)。其中:

  • TCP_CHECK:通過TCP連接來檢查後端RS是否健康。
  • HTTP_GET:通過獲取指定頁面來檢查後端RS是否健康。是否健康是根據是否匹配digest、status_code來判斷的。
  • SSL_GET:和HTTP_GET一樣,只不過使用的協議是HTTPS。
  • MISC_CHECK:通過載入自定義健康狀況檢查的腳本來檢查對象是否健康,要求這些腳本中健康與否的返回值為0或1。

使用MISC_CHECK檢查時,方式如下:

MISC_CHECK {
    misc_path /path_to_script/script.sh
    (or misc_path “ /path_to_script/script.sh <arg_list>”)
}

回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/8483807.html

註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • There is also a quick remedy for the emergency situation when your root partition runs out of disk space. There is a feature specific to ext3 and ext4 ...
  • 僅供自己學習使用 一、Makefile介紹 Makefile 或 makefile: 告訴make維護一個大型程式, 該做什麼。Makefile說明瞭組成程式的各模塊間的相互 關係及更新模塊時必須進行的動作, make按照這些說明自動地維護這些模塊。 執行make命令時,需要一個 Makefile  ...
  • 搭建ssr伺服器 首先,先說一下,為什麼這麼久沒寫博客。 一方面,最近在搭建自己的伺服器。挺忙的。 另一方面,寫了許多有關伺服器構建,網站構建的word。但沒有潤色,所以打算等自己伺服器做好了整理一下再發。 不過今天,我先來寫一個編程人員都要用到的東西--SSR 程式員總是有著許多東西要從外網下載, ...
  • 本專欄由“痞子衡隨筆”再次更名為“痞子衡嵌入式”,馬甲雖多,專註嵌入式技術領域的初衷不變,特此通知! ...
  • 前言 學習hadoop的時候難免需要部署一些子伺服器,但是如果在每檯子伺服器上面都去部署的話,那麼上千上萬台將會累垮你,所以這時候scp命令就顯得尤為重要了。 一、關於scp命令 1.1scp命令介紹 scp是secure copy的簡寫,用於在Linux下進行遠程拷貝文件的命令,和它類似的命令有c ...
  • 如果使用 mkimage 生成內核鏡像文件的話,會在內核的前頭加上了 64 bytes 的信息頭,供建立 tag 之用。bootm 命令會首先判斷 bootm xxx 這個指定的地址 xxx 與 a 指定的載入地址是否相同。 如果不同的話會從這個地址開始提取出這個 64 bytes 的頭部,對其進行 ...
  • 許可權認證 cookie VS token 我前公司的應用都是 token 授權的,現公司都是維護一個 session 確認登錄狀態的。那麼我在這掰扯掰扯這兩種許可權認證的方方面面。 工作流程 先說 cookie cookie 登錄是有狀態的,服務端維護一個 session 客戶端維護一個 cookie ...
  • 1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。(1)目錄管理命令——ls:列出指定目錄下的內容格式:ls [OPTION]... [FILE]... -a:顯示所有文件包括隱藏文件 -A:顯示除.和..之外的所有文件 -l,--long:顯示文件的詳細屬性信息 -h:對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...