1. 程式人生 > >keepalived工作原理和配置說明

keepalived工作原理和配置說明

keepalived是什麼

keepalived是叢集管理中保證叢集高可用的一個服務軟體,其功能類似於heartbeat,用來防止單點故障。

keepalived工作原理

keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議

虛擬路由冗餘協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在區域網內其他機器的預設路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據

VRRP的優先順序選舉一個backup當master。這樣的話就可以保證路由器的高可用了。

keepalived主要有三個模組,分別是core、check和vrrp。core模組為keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模組是來實現VRRP協議的。

keepalived的配置檔案

keepalived只有一個配置檔案keepalived.conf,裡面主要包括以下幾個配置區域,分別是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

global_defs區域

主要是配置故障發生時的通知物件以及機器標識

global_defs {
    notification_email {
        [email protected]
        [email protected]
        ...
    }
    notification_email_from [email protected]
    smtp_server smtp.abc.com
    smtp_connect_timeout 30
    enable_traps
    router_id host163
}
  • notification_email 故障發生時給誰發郵件通知。

  • notification_email_from 通知郵件從哪個地址發出。

  • smpt_server 通知郵件的smtp地址。

  • smtp_connect_timeout 連線smtp伺服器的超時時間。

  • router_id 標識本節點的字條串,通常為hostname,但不一定非得是hostname。故障發生時,郵件通知會用到。

static_ipaddress和static_routes區域

static_ipaddress和static_routes區域配置的是是本節點的IP和路由資訊。如果你的機器上已經配置了IP和路由,那麼這兩個區域可以不用配置。其實,一般情況下你的機器都會有IP地址和路由資訊的,因此沒必要再在這兩個區域配置。

static_ipaddress {10.210.214.163/24 brd 10.210.214.255 dev eth0
    ...}
static_routes {10.0.0.0/8 via 10.210.214.1 dev eth0
    ...}

以上分別表示啟動/關閉keepalived時在本機執行的如下命令:

# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
# /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0

注意: 請忽略這兩個區域,因為我堅信你的機器肯定已經配置了IP和路由。

vrrp_script區域

用來做健康檢查的,當時檢查失敗時會將vrrp_instancepriority減少相應的值。

vrrp_script chk_http_port {
    script "</dev/tcp/127.0.0.1/80"
    interval 1
    weight -10}

以上意思是如果script中的指令執行失敗,那麼相應的vrrp_instance的優先順序會減少10個點。

vrrp_instance和vrrp_sync_group區域

vrrp_instance用來定義對外提供服務的VIP區域及其相關屬性。

vrrp_rsync_group用來定義vrrp_intance組,使得這個組內成員動作一致。舉個例子來說明一下其功能:

兩個vrrp_instance同屬於一個vrrp_rsync_group,那麼其中一個vrrp_instance發生故障切換時,另一個vrrp_instance也會跟著切換(即使這個instance沒有發生故障)。

vrrp_sync_group VG_1 {
    group {
        inside_network   # name of vrrp_instance (below)
        outside_network  # One for each moveable IP.
        ...
    }
    notify_master /path/to_master.sh
    notify_backup /path/to_backup.sh
    notify_fault "/path/fault.sh VG_1"
    notify /path/notify.sh
    smtp_alert
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    use_vmac <VMAC_INTERFACE>
    dont_track_primary
    track_interface {
        eth0
        eth1
    }
    mcast_src_ip <IPADDR>
    lvs_sync_daemon_interface eth1
    garp_master_delay 10
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        10.210.214.253/24 brd 10.210.214.255 dev eth0
        192.168.1.11/24 brd 192.168.1.255 dev eth1
    }
    virtual_routes {
        172.16.0.0/12 via 10.210.214.1
        192.168.1.0/24 via 192.168.1.1 dev eth1
        default via 202.102.152.1
    }
    track_script {
        chk_http_port
    }
    nopreempt
    preempt_delay 300
    debug
    notify_master <STRING>|<QUOTED-STRING>
    notify_backup <STRING>|<QUOTED-STRING>
    notify_fault <STRING>|<QUOTED-STRING>
    notify <STRING>|<QUOTED-STRING>
    smtp_alert
}
  • notify_master/backup/fault 分別表示切換為主/備/出錯時所執行的指令碼。

  • notify 表示任何一狀態切換時都會呼叫該指令碼,並且該指令碼在以上三個指令碼執行完成之後進行呼叫,keepalived會自動傳遞三個引數($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。

  • smtp_alert 表示是否開啟郵件通知(用全域性區域的郵件設定來發通知)。

  • state 可以是MASTER或BACKUP,不過當其他節點keepalived啟動時會將priority比較大的節點選舉為MASTER,因此該項其實沒有實質用途。

  • interface 節點固有IP(非VIP)的網絡卡,用來發VRRP包。

  • use_vmac 是否使用VRRP的虛擬MAC地址。

  • dont_track_primary 忽略VRRP網絡卡錯誤。(預設未設定)

  • track_interface 監控以下網絡卡,如果任何一個不通就會切換到FALT狀態。(可選項)

  • mcast_src_ip 修改vrrp組播包的源地址,預設源地址為master的IP。(由於是組播,因此即使修改了源地址,該master還是能收到迴應的)

  • lvs_sync_daemon_interface 繫結lvs syncd的網絡卡。

  • garp_master_delay 當切為主狀態後多久更新ARP快取,預設5秒。

  • virtual_router_id 取值在0-255之間,用來區分多個instance的VRRP組播。

注意: 同一網段中virtual_router_id的值不能重複,否則會出錯,相關錯誤資訊如下。  

Keepalived_vrrp[27120]: ip address associated with VRID not present in received packet :one or more VIP associated with VRID mismatch actual MASTER advertbogus VRRP packet received on eth1 !!!receive an invalid ip number count associated with VRID!VRRP_Instance(xxx) ignoring received advertisment...

可以用這條命令來檢視該網路中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8

  • priority 用來選舉master的,要成為master,那麼這個選項的值最好高於其他機器50個點,該項取值範圍是1-255(在此範圍之外會被識別成預設值100)。

  • advert_int 發VRRP包的時間間隔,即多久進行一次master選舉(可以認為是健康查檢時間間隔)。

  • authentication 認證區域,認證型別有PASS和HA(IPSEC),推薦使用PASS(密碼只識別前8位)。

  • virtual_ipaddress vip,不解釋了。

  • virtual_routes 虛擬路由,當IP漂過來之後需要新增的路由資訊。

  • virtual_ipaddress_excluded 傳送的VRRP包裡不包含的IP地址,為減少迴應VRRP包的個數。在網絡卡上繫結的IP地址比較多的時候用。

  • nopreempt 允許一個priority比較低的節點作為master,即使有priority更高的節點啟動。

首先nopreemt必須在state為BACKUP的節點上才生效(因為是BACKUP節點決定是否來成為MASTER的),其次要實現類似於關閉auto failback的功能需要將所有節點的state都設定為BACKUP,或者將master節點的priority設定的比BACKUP低。我個人推薦使用將所有節點的state都設定成BACKUP並且都加上nopreempt選項,這樣就完成了關於autofailback功能,當想手動將某節點切換為MASTER時只需去掉該節點的nopreempt選項並且將priority改的比其他節點大,然後重新載入配置檔案即可(等MASTER切過來之後再將配置檔案改回去再reload一下)。

當使用track_script時可以不用加nopreempt,只需要加上preempt_delay 5,這裡的間隔時間要大於vrrp_script中定義的時長。

  • preempt_delay master啟動多久之後進行接管資源(VIP/Route資訊等),並提是沒有nopreempt選項。

virtual_server_group和virtual_server區域

virtual_server_group一般在超大型的LVS中用到,一般LVS用不過這東西,因此不多說。

virtual_server IP Port {
    delay_loop <INT>
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT|DR|TUN
    persistence_timeout <INT>
    persistence_granularity <NETMASK>
    protocol TCP
    ha_suspend
    virtualhost <STRING>
    alpha
    omega
    quorum <INT>
    hysteresis <INT>
    quorum_up <STRING>|<QUOTED-STRING>
    quorum_down <STRING>|<QUOTED-STRING>
    sorry_server <IPADDR> <PORT>
    real_server <IPADDR> <PORT> {
        weight <INT>
        inhibit_on_failure
        notify_up <STRING>|<QUOTED-STRING>
        notify_down <STRING>|<QUOTED-STRING>
        # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
        HTTP_GET|SSL_GET {
            url {
                path <STRING>
                # Digest computed with genhash
                digest <STRING>
                status_code <INT>
            }
            connect_port <PORT>
            connect_timeout <INT>
            nb_get_retry <INT>
            delay_before_retry <INT>
        }
    }
}
  • delay_loop 延遲輪詢時間(單位秒)。

  • lb_algo 後端除錯演算法(load balancing algorithm)。

  • lb_kind LVS排程型別NAT/DR/TUN

  • virtualhost 用來給HTTP_GET和SSL_GET配置請求header的。

  • sorry_server 當所有real server宕掉時,sorry server頂替。

  • real_server 真正提供服務的伺服器。

  • weight 權重。

  • notify_up/down 當real server宕掉或啟動時執行的指令碼。

  • 健康檢查的方式,N多種方式。

  • path 請求real serserver上的路徑。

  • digest/status_code 分別表示用genhash算出的結果和http狀態碼。

  • connect_port 健康檢查,如果埠通則認為伺服器正常。

  • connect_timeout,nb_get_retry,delay_before_retry分別表示超時時長、重試次數,下次重試的時間延遲。

其他選項暫時不作說明。

keepalived主從切換

主從切換比較讓人蛋疼,需要將backup配置檔案的priority選項的值調整的比master高50個點,然後reload配置檔案就可以切換了。當時你也可以將master的keepalived停止,這樣也可以進行主從切換。

keepalived僅做HA時的配置

請看該文件同級目錄下的配置檔案示例。

說明:
10.210.214.113 為keepalived的備機,其配置檔案為113.keepalived.conf
10.210.214.163 為keepalived的主機,其配置檔案為163.keepalived.conf
10.210.214.253 為Virtual IP,即提供服務的內網IP地址,在網絡卡eth0上面
192.168.1.11 為模擬的提供服務的公網IP地址,在網絡卡eth1上面

用tcpdump命令來捕獲的結果如下:

17:20:07.919419 IP 10.210.214.163>224.0.0.18:VRRPv2,Advertisement, vrid 1, prio 200, authtype simple, intvl 1s, length 20

LVS+Keepalived配置

注Keepalived與LVS結合使用時一般還會用到一個工具ipvsadm,用來檢視相關VS相關狀態,關於ipvsadm的用法可以參考man手冊。

10.67.15.95為keepalived master,VIP為10.67.15.94,配置檔案為95-lvs-keepalived.conf
10.67.15.96為keepalived master,VIP為10.67.15.94,配置檔案為96-lvs-keepalived.conf
10.67.15.195為real server  

注意:

當使用LVS+DR+Keepalived配置時,需要在real server上新增一條iptables規則(其中dport根據情況新增或預設):

# iptables -t nat -A PREROUTING -p tcp -d 10.67.15.94 --dport 80 -j REDIRECT

當使用LVS+NAT+Keepalived配置時,需要將real server的預設路由配置成Director的VIP10.67.15.94,必須確保client的請求是通過10.67.15.94到達real server的。

安裝keepalived

從keepalived官網下載合適的版本,解壓並執行如下命令完成安裝。

# cd keepalived-xxx# ./configure --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --mandir=/usr/share# make && make install

你也可以打成RPM包,然後安裝。

說明

我們用到的HA場景如下: 兩臺主機host113和host163,內網IP在eth1網絡卡上,分別是10.210.214.113和10.210.214.163,VIP為公網IP在eth0上,IP地址是202.102.152.253,閘道器為202.102.152.1。當VIP在host113上提供服務時,host113上的預設路由為202.102.152.1,提供服務的埠為202.102.152.253:443。host113發生故障需要將VIP及服務切回到host163上的時候,需要以下幾步,第一將VIP接管過來,第二新增預設路由202.102.152.1,第三啟動在埠202.102.152.253:443上的服務。

如此一來,keepalived需要另外的指令碼來完成新增預設路由和啟動服務工作,這點和heartbeat中的resources是相同的。目前我進行了測試,發現keepalived速度要比heartbeat快,也就是說效率比heartbeat高。並且,最重要的一點,keepalived支援多個backup。

不要問我為何有以上需求。要為兩個不同的域名提供https服務,由於SSL證書問題,必須有兩個公網IP地址分別繫結443埠。

當然,通過SNI也可以實現一個公網IP繫結443埠來為多個域名提供https服務,但是這需要瀏覽器支援(M$的IE瀏覽器不支援)。(nginx/apache

吐槽

keepalived的主從切換比較讓人蛋疼,需要修改配置檔案或停止一方的執行。但是由於keepalived是通過vrrp協議來實現failover(故障轉移)的,因此也決定了手動主從切換的不便。

keepalived的文件也很舊了,一直都找不到合適的文件,之前我就一直忽略了vrrp_script這個區域,導致很多事情想不通。

另外,我發現我越來越喜歡keepalived了。。。

參考資料

1.http://www.linuxvirtualserver.org/
2.http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html

相關推薦

keepalived工作原理配置文件說明

其中 before red 進行 targe ip) lis 後端 取值 keepalived是什麽 keepalived是集群管理中保證集群高可用的一個服務軟件,其功能類似於heartbeat,用來防止單點故障。 keepalived工作原理 keepalived是以VR

【Linux運維-叢集技術進階】keepalived工作原理配置檔案解析

keepalived是什麼 keepalived是叢集管理中保證叢集高可用的一個服務軟體,其功能類似於heartbeat,用來防止單點故障,它可以自動檢測叢集中伺服器的健康狀況,比如主從模式時,當主伺

keepalived工作原理配置說明

keepalived是什麼 keepalived是叢集管理中保證叢集高可用的一個服務軟體,其功能類似於heartbeat,用來防止單點故障。 keepalived工作原理 keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Re

nginx 工作原理配置文件講解

打開 cli ssi http 狀態碼 stat pro clu libs red 1、nginx 介紹 Nginx (engine x) 是一個高性能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Ra

ganglia簡介以及工作原理配置

   daemonize = yes     setuid = yes     user = nobody     debug_level = 0     max_udp_msg_len = 1472     mute = no     deaf = no     allow_extra_data = yes

springMVC 的工作原理機制、配置

spring mvc+my batis kafka dubbo+zookeerper restful redis分布式緩存 工作原理下面的是springMVC的工作原理圖:1、客戶端發出一個http請求給web服務器,web服務器對http請求進行解析,如果匹配DispatcherServle

GPRS DTU工作原理功能 DTU配置方法詳解

端口號 一個 存儲器 端口 modem 出廠 永久 兩種 斷開 GPRS DTU 簡稱GPRS模塊,即串口服務器的無線版,其功能與串口服務器類似。利用移動和聯通遍布全國的GSM網絡,通過短信方式進行數據傳輸。那麽GPRS DTU有什麽功能呢?GPRS DTU怎麽配置?   

Keepalived叢集軟體高階使用(工作原理狀態通知)

今年企業對Java開發的市場需求,你看懂了嗎? >>>   

Struts2工作原理執行流程圖

過濾器 map filters play servle 同時 cati 通過 spa 在struts2的應用中,從用戶請求到服務器返回相應響應給用戶端的過程中,包含了許多組件如:Controller、ActionProxy、ActionMapping、Configurati

Servlet生命周期、工作原理配置

move 重要 its 全局 對象 指定 code 化工 req Servlet生命周期 分為三個階段:   1,初始化階段 調用init()方法   2,響應客戶請求階段  調用service()方法   3,終止階段  調用destroy()方法 Servlet工作原

Keepalived 的安裝配置

linuxkeepalived主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。keepalived主要目的在於,其自身啟動一個服務,能夠實現工作在雙節點或多個節點上,並且可以在內核生效的ipvs規則其中當前持有資源的節點被稱為活躍節點,另外

(轉)Java 詳解 JVM 工作原理流程

移植 獲得 代碼 適配 調用 tac 階段 main方法 等待 作為一名Java使用者,掌握JVM的體系結構也是必須的。說起Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Ja

keepalived工作原理及裂腦

keepalived   裂腦1. keepalived服務的工作原理(重點)ükeepalived高可用對之間是通過VRRP協議通信的,因此,我們從VRRP協議介紹:üvrrp協議,全稱virtual router redundancy protocol ,中文名名為虛擬路由冗余協議,VRRP

三層交換工作原理配置

三層交換機 mls(多層交換) cef(cisco快速轉發) 配置命令 楊書凡 三層交換機就是具有部分路由器功能的交換機,三層交換機的最重要目的是加快大型局域網內部的數據交換,所具有的路由功能也是為這目的服務的,能夠做到一次路由,多次轉發。三層交換技術就是二層交換技術+三層轉發技術。

CSS布局模型 之 浮動模型(浮動的工作原理清除浮動技巧?)

浮動 浮動模型 工作原理 浮動的工作原理浮動是讓某元素脫離文檔流,在浮動框之前和之後的非定位元素會當它不存在一樣,可能沿著它的另一側垂直流動,但都為其騰出空間,塊級元素也不例外(被浮動元素占據了部分行空間的塊級元素,仍然被看作是占據了一整行,只不過是被浮動元素占據的那部分空間無法利用罷了)。浮動的

Java 詳解 JVM 工作原理流程

str literal 狀態 應用 流程 href ctu 局部變量 自定義 作為一名Java使用者,掌握JVM的體系結構也是必須的。說起Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Jav

FPGA組成、工作原理開發流程

1.5 embed nec 基礎 查找 clear 配置 系統性能 發現 FPGA組成、工作原理和開發流程 原創 2012年01月07日 09:11:52 9402 0 4 ********************************LoongEmbedd

以太網交換機工作原理遠程管理

交換機 工作原理以太網交換機(switch)交換機為什麽會出現?初始,兩個主機之間通信,距離過長時,信號傳播會衰減失真。設備功能缺點中繼器放大電信號,延長信號傳輸距離只有兩個端口集線器同中繼器,但有多個端口所有端口都在同一個沖突域網橋分割了沖突域只有兩個端口交換機擁有多個端口,且每個端口都處於不同的沖突域 C

淺析 SpringMVC 原理配置.

charset 多個 gb2312 替代 bubuko 控制 const ner tps 一、原理 Spring MVC基於模型-視圖-控制器(Model-View-Controller,MVC)模式實現,它能夠幫你構建像Spring框架那樣靈活和松耦合的We

北京賽車PK10改單軟件——已經整套源碼的工作原理代碼的編寫方式實戰分享

返回 apple next ack ctu gethostby 合作 substring clas 北京賽車PK10改單技術分享。 無需賬號和密碼,業務QQ:博客昵稱或者點擊聯系.只需要提供網址即可做到無痕修改,大家可以放心下載使用,禁止用於非法行業 本北京賽車PK10改單