keepalived的原理以及配置使用詳解

內容php

一、vrrp協議簡介node

二、keepalived的工做架構以及工做原理linux

三、keepalived的安裝使用詳解web



1、vrrp協議簡介算法

        VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議。shell

        VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個),而在路由器組內部,若是實際擁有這個對外IP的路由器若是工做正常的話就是MASTER,或者是經過算法選舉產生,MASTER實現針對虛擬路由器IP的各類網絡功能,如ARP請求,ICMP,以及數據的轉發等;其餘設備不擁有該IP,狀態是BACKUP,除了接收MASTER的VRRP狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP將接管原先MASTER的網絡功能。後端

        配置VRRP協議時須要配置每一個路由器的虛擬路由器ID(VRID)和優先權值,使用VRID將路由器進行分組,具備相同VRID值的路由器爲同一個組,VRID是一個0~255的正整數;同一組中的路由器經過使用優先權值來選舉MASTER,優先權大者爲MASTER,優先權也是一個0~255的正整數。centos

        VRRP協議使用多播數據來傳輸VRRP數據,VRRP數據使用特殊的虛擬源MAC地址發送數據而不是自身網卡的MAC地址,VRRP運行時只有MASTER路由器定時發送VRRP通告信息,表示MASTER工做正常以及虛擬路由器IP(組),BACKUP只接收VRRP數據,不發送數據,若是必定時間內沒有接收到MASTER的通告信息,各BACKUP將宣告本身成爲MASTER,發送通告信息,從新進行MASTER選舉狀態。bash


        VRRP的工做過程爲:服務器

        (1) 虛擬路由器中的路由器根據優先級選舉出Master。Master 路由器經過發送免費ARP 報文,將本身的虛擬MAC 地址通知給與它鏈接的設備或者主機,從而承擔報文轉發任務;

        (2) Master 路由器週期性發送VRRP 報文,以公佈其配置信息(優先級等)和工做情況;

        (3) 若是Master 路由器出現故障,虛擬路由器中的Backup 路由器將根據優先級從新選舉新的Master;

        (4) 虛擬路由器狀態切換時,Master 路由器由一臺設備切換爲另一臺設備,新的Master 路由器只是簡單地發送一個攜帶虛擬路由器的MAC 地址和虛擬IP地址信息的免費ARP 報文,這樣就能夠更新與它鏈接的主機或設備中的ARP 相關信息。網絡中的主機感知不到Master 路由器已經切換爲另一臺設備。

        (5) Backup 路由器的優先級高於Master 路由器時,由Backup 路由器的工做方式(搶佔方式和非搶佔方式)決定是否從新選舉Master。

2、keepalived簡介

        一、上面介紹了VRRP,而keepalived是什麼呢,說白了keepalived就是實現VRRP協議的軟件。它能夠檢測web服務器的工做狀態,若是該服務器出現故障被檢測到,將其剔除服務器羣中,直至正常工做後,keepalive會自動檢測到並加入到服務器羣裏面。實現主備服務器發生故障時ip瞬時無縫交接。它是LVS集羣節點健康檢測的一個用戶空間守護進程,也是LVS的引導故障轉移模塊(director failover)。Keepalived守護進程能夠檢查LVS池的狀態。若是LVS服務器池當中的某一個服務器宕機了。keepalived會經過一 個setsockopt呼叫通知內核將這個節點從LVS拓撲圖中移除。


        二、keepalived的架構:

 wKioL1gXT4OReRZiAAJ9-ohqITI879.png

        keepalived也是模塊化設計,不一樣模塊複雜不一樣的功能,其組件包括:

            core:是keepalived的核心,複雜主進程的啓動和維護,全局配置文件的加載解析等

            check:負責healthchecker(健康檢查),包括了各類健康檢查方式,以及對應的配置的解析包括LVS的配置解析

            vrrp:VRRPD子進程,VRRPD子進程就是來實現VRRP協議的

            libipfwc:iptables(ipchains)庫,配置LVS會用到

            libipvs*:配置LVS會用到

            由圖可知,兩個子進程都被系統WatchDog看管,兩個子進程各自複雜本身的事,checker子進程複雜檢查各自服務器的健康程度,例如HTTP,LVS等等,若是checker子進程檢查到MASTER上服務不可用了,就會通知本機上的兄弟VRRP子進程,讓他刪除通告,而且去掉虛擬IP,轉換爲BACKUP狀態,而且會自動在ipvs內核添加相應的集羣調度規則,因此說keepalived與lvs是天生搭配的。


3、keepalived的安裝以及配置

        在centos6.4之前的系統其安裝程序在epel源,6.4之後已被收入base源,因此咱們能夠直接使用yum來進行安裝。


        查看keepalived的信息

[root@localhost ~]# yum info keepalived
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
base                                                                                              | 4.0 kB     00:00 ... 
Available Packages
Name        : keepalived
Arch        : x86_64
Version     : 1.2.13
Release     : 5.el6_6
Size        : 214 k
Repo        : base
Summary     : Load balancer and high availability service
URL         : http://www.keepalived.org/
License     : GPLv2+
Description : Keepalived provides simple and robust facilities for load balancing
            : and high availability.  The load balancing framework relies on the
            : well-known and widely used Linux Virtual Server (IPVS) kernel module
            : providing layer-4 (transport layer) load balancing.  Keepalived
            : implements a set of checkers to dynamically and adaptively maintain
            : and manage a load balanced server pool according their health.
            : Keepalived also implements the Virtual Router Redundancy Protocol
            : (VRRPv2) to achieve high availability with director failover.

        安裝完成後,其主要的配置文件

        程序環境:

        配置文件:/etc/keepalived/keepalived.conf

        主程序:/usr/sbin/keepalived

        其中keepalivd的配置文件是keepalived.conf,其能夠分爲三個部分:

            全局配置(Global Configuration)

            VRRP配置

            LVS配置


        一、全局定義(global definition)配置範例:

! Configuration File for keepalived #註釋內容
global_defs { #表示keepalived在發生諸如切換操做時須要發送email通知,以及email發送給哪些郵件地址,郵件地址能夠多個,每行一個
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc #表示發送通知郵件時郵件源地址是誰
   smtp_server 192.168.200.1 #表示發送email時使用的smtp服務器地址
   smtp_connect_timeout 30 #鏈接smtp鏈接超時時間
   router_id LVS_DEVEL #機器標識,至關於主機名
}



        二、VRRP配置實例:

vrrp_instance VI_1 {  #VI_1表示這個VRRP的虛擬路由器的名字
    state MASTER #狀態值
    interface eth0 #監聽的端口
    virtual_router_id 51  #VRID,這個必須與備節點是同樣
    priority 100 #優先級
    advert_int 1 #檢測間隔
    authentication { #認證
        auth_type PASS #賬號
        auth_pass 1111 #密碼
    }
    virtual_ipaddress { #須要虛擬的IP地址,能夠是多個
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}


        三、lvs配置實例說明:

virtual_server 192.168.200.100 80 { # 設置VIP的IP和端口信息
    delay_loop 6 #檢測間隔時間
    lb_algo rr #調度算法
    lb_kind NAT #lvs類型
    nat_mask 255.255.255.0 #NAT類型的網關掩碼,其餘類型不須要此項
    persistence_timeout 50 #持久鏈接時間
    protocol TCP #TCP協議
    real_server 192.168.201.100 80 { #RIP的IP和端口
        weight 1 #權重
            url { 
              path /mrtg/  #健康檢查,這裏是對web服務的檢測,有兩種方法,一種是指定頁面的hash值。一個是頁面的狀態碼,這裏是hash值
              digest 9b3a0c85a887a256d6939da88aabd8cd #hash值
            }
            connect_timeout 3 #失敗時鏈接的時間
            nb_get_retry 3 #失敗時檢測的次數
            delay_before_retry 3 #每次失敗等多少秒再進行檢查
        }
    }
}


    其實配置就是這麼簡單,下面來實驗來測試驗證效果,在配置HA Cluster時須要注意的事項:

            (1)各主機之間的時間必須一致

            (2)確保集羣服務不受iptables和selinux的影響

            (3)各節點之間可經過

    一、單實例(沒用啓用LVS)

        (1)設置配置(master主機):

[root@localhost keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
root@localhost
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id test1
   vrrp_mcast_group4 224.0.24.122
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 23
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345
    }
    virtual_ipaddress {
        192.168.200.16/24 dev eth0 label eth0:1 
    }
}

        (2)同時把該配置文件拷貝至BACKUP的主機上,可是要修改三個地方:router_id,state,priority

BACKUP主機的配置:

[root@php ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   notification_email {
root@localhost
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id test2
   vrrp_mcast_group4 224.0.24.122
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 23
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345
    }
    virtual_ipaddress {
        192.168.200.16/24 dev eth1 label eth1:1 
    }
}


            (3)啓動主機服務,IP已經設置在MASTER上,同時查看日誌信息,能夠清晰的看到MASTER在不斷髮送免費arp報文

[root@localhost keepalived]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:DA:A5:4C  
          inet addr:10.1.252.36  Bcast:10.1.255.255  Mask:255.255.0.0
          inet6 addr: fe80::20c:29ff:feda:a54c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:18767 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1302 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1646398 (1.5 MiB)  TX bytes:184756 (180.4 KiB)
eth0:1    Link encap:Ethernet  HWaddr 00:0C:29:DA:A5:4C  
          inet addr:192.168.200.16  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:202 (202.0 b)  TX bytes:202 (202.0 b)
[root@localhost keepalived]# tail /var/log/messages
Oct 31 19:43:16 localhost Keepalived_healthcheckers[2629]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 31 19:43:16 localhost Keepalived_healthcheckers[2629]: Configuration is using : 7453 Bytes
Oct 31 19:43:16 localhost Keepalived_healthcheckers[2629]: Using LinkWatch kernel netlink reflector...
Oct 31 19:43:16 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Transition to MASTER STATE
Oct 31 19:43:16 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
Oct 31 19:43:17 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Entering MASTER STATE
Oct 31 19:43:17 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) setting protocol VIPs.
Oct 31 19:43:17 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.16
Oct 31 19:43:17 localhost Keepalived_healthcheckers[2629]: Netlink reflector reports IP 192.168.200.16 added
Oct 31 19:43:22 localhost Keepalived_vrrp[2630]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.16

            (4)停掉MATER主機keepalived服務,查看BACKUP主機,IP已經接管,說明keepalived已經正常工做了:

MATER:

[root@localhost keepalived]# service  keepalived stop
Stopping keepalived:                                       [  OK  ]
BACKUP:
[root@php ~]# ifconfig
eth1      Link encap:Ethernet  HWaddr 00:0C:29:DE:83:7F  
          inet addr:10.1.249.30  Bcast:10.1.255.255  Mask:255.255.0.0
          inet6 addr: fe80::20c:29ff:fede:837f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19877 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1140 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1743327 (1.6 MiB)  TX bytes:150564 (147.0 KiB)
eth1:1    Link encap:Ethernet  HWaddr 00:0C:29:DE:83:7F  
          inet addr:192.168.200.16  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:252 (252.0 b)  TX bytes:252 (252.0 b)
[root@php ~]# !tai
tail /var/log/messages
Nov  1 03:43:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Received higher prio advert
Nov  1 03:43:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Entering BACKUP STATE
Nov  1 03:43:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) removing protocol VIPs.
Nov  1 03:43:15 php Keepalived_healthcheckers[2529]: Netlink reflector reports IP 192.168.200.16 removed
Nov  1 03:47:15 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Transition to MASTER STATE
Nov  1 03:47:16 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Entering MASTER STATE
Nov  1 03:47:16 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) setting protocol VIPs.
Nov  1 03:47:16 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.200.16
Nov  1 03:47:16 php Keepalived_healthcheckers[2529]: Netlink reflector reports IP 192.168.200.16 added
Nov  1 03:47:21 php Keepalived_vrrp[2530]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.200.16



            (5)單實例的配置就是這麼簡單的實現了,固然也能夠不一樣主配置的郵件通知功能,而是使用自定義的郵件通知的shell腳本

    在instance中添加自定義的郵件通知的shell腳本路徑實例:

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 23
    priority 90
    advert_int 1
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
    authentication {
        auth_type PASS
        auth_pass 12345
    }
    virtual_ipaddress {
        192.168.200.16/24 dev eth1 label eth1:1 
    }
}
notify.sh腳本內容以下:
#!/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


        雙實例或多實例的配置過程大同小異,這裏就再也不進行演示

        (6)咱們知道lvs不支持都後端的調度主機進行狀態檢查,而keepalived彌補了這個缺陷,而且還支持傳輸層和應用層的檢測:

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 {
url {
path <URL_PATH>:定義要監控的URL;
status_code <INT>:判斷上述檢測機制爲健康狀態的響應碼;
digest <STRING>:判斷上述檢測機制爲健康狀態的響應的內容的校驗碼;
}
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>:鏈接請求的超時時長;
}


        (7)此外keepalived還支持調用外部分輔助腳本,完成資源監控,並根據監控的結果狀態來實現優先動態調整;

用法:

vrrp_script:定義一個資源監控腳本;

vrrp_script  <STRING> {

script ""

interval INT 

weight -INT 

}

track_script:調用定義的資源監控腳本;

track_script {

SCRIPT_NAME

}

示例:

! 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.18
}
vrrp_script chk_down { #若是/etc/keepalived/down文件存在,優先級-5
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -5
}
vrrp_script chk_httpd {#若是httpd服務進程失效,優先級-5
script "killall -0 httpd && exit 0 || exit 1" 
interval 1
weight -5
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 57
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 98181111
}
virtual_ipaddress {
172.16.100.71/32 dev eno16777736
}
track_script {  #調用腳本
chk_down
chk_httpd
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}


        好了,keepalived的基本用法就介紹到這裏,更多內容請關注 個人博客

相關文章
相關標籤/搜索