1. 程式人生 > >keepalived知識梳理

keepalived知識梳理

vrrp工作原理、、keepalived作用、keepalived配置文件詳解

文章大綱


  • 前言

  • VRRP介紹

  • Keepalived詳解

前言


Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,可以利用其來避免單點故障。我們都知道,在一個LVS集群中,雖然LVS能夠對客戶端的請求基於IP進行調度,但是LVS自身並不能提供高可靠性,即不能進行容錯。並且LVS只能將客戶端的服務基於某種調度算法調度至後端服務器進行處理,卻不能檢查後端服務器的狀態,所以我們需要一個工具能夠實現這些功能,而keepalived剛好能夠提供這些功能,在keepalived與LVS配合組成高可用集群中(HAC),至少需要2臺服務器運行Keepalived,一臺為主服務器(MASTER),一臺為備份服務器(BACKUP),但是對外表現為一個虛擬IP(即LVS中的VIP),主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP的完美實現,因此在介紹keepalived之前,先介紹一下VRRP的原理。


VRRP介紹


1 VRRP概念

VRRP是英文”Virtual Router Redundancy Protocol”的縮寫,即虛擬路由冗余協議,他是一種容錯協議,它保證當主機的下一跳路由器出現故障時,由另一臺路由器來代替出現故障的路由器進行工作,從而保持網絡通信的連續性和可靠性。VRRP具有如下優點:

簡化網絡管理。在具有多播或廣播能力的局域網(如以太網)中,借助VRRP 能在某臺設備出現故障時仍然提供高可靠的缺省鏈路,有效避免單一鏈路發生故障後網絡中斷的問題,而無需修改動態路由協議、路由發現協議等配置信息,也無需修改主機的默認網關配置。

適應性強VRRP 報文封裝在 IP 報文中,支持各種上層協議。

網絡開銷小VRRP 只定義了一種報文——VRRP 通告報文,並且只有處於Master 狀態的路由器可以發送 VRRP 報文。

2 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。

終上所述,為了保證Master路由器和Backup路由器能夠協調工作,VRRP需要實現以下功能:

Master 路由器的選舉;

Master 路由器狀態的通告;

同時,為了提高安全性,VRRP 還提供了認證功能;

3 MSTER選舉方式

VRRP根據優先級來確定虛擬路由器中每臺路由器的角色(Master路由器或Backup路由器)。優先級越高,則越有可能成為Master路由器。初始創建的路由器工作在Backup狀態,通過VRRP報文的交互獲知虛擬路由器中其他成員的優先級:

如果 VRRP 報文中 Master 路由器的優先級高於自己的優先級,則路由器保持在 Backup 狀態;

如果 VRRP 報文中 Master 路由器的優先級低於自己的優先級,采用搶占工作方式的路由器將搶占成為 Master 狀態,周期性地發送 VRRP 報文,采用非搶占工作方式的路由器仍保持 Backup 狀態;

如果在一定時間內沒有收到 VRRP 報文,則路由器切換為 Master

VRRP優先級的取值範圍為0到255(數值越大表明優先級越高),可配置的範圍是1到254,優先級0為系統保留給路由器放棄Master位置時候使用,255則是系統保留給IP地址擁有者使用。當路由器為IP地址擁有者時,其優先級始終為255。因此,當虛擬路由器內存在IP地址擁有者時,只要其工作正常,則為Master路由器。

4 VRRP的三種認證方式

無認證:不進行任何 VRRP 報文的合法性認證,不提供安全性保障。

簡單字符認證:在一個有可能受到安全威脅的網絡中,可以將認證方式設置為簡單字符認證。發送 VRRP 報文的路由器將認證字填入到 VRRP 報文中,而收到 VRRP 報文的路由器會將收到的 VRRP 報文中的認證字和本地配置的認證字進行比較。如果認證字相同,則認為接收到的報文是合法的 VRRP 報文;否則認為接收到的報文是一個非法報文。

MD5 認證:在一個非常不安全的網絡中,可以將認證方式設置為 MD5 認證。發送 VRRP 報文的路由器利用認證字和 MD5 算法對 VRRP 報文進行加密,加密後的報文保存在 Authentication Header(認證頭)中。收到 VRRP報文的路由器會利用認證字解密報文,檢查該報文的合法性。

Keepalived


1 keepalived工作原理

Keepalived是基於vrrp的原理開發的可實現高可用的服務軟件,並且就有health-check功能,可以使用它提供雙機浮動的vip(vrrp虛擬路由功能),這樣可以簡單實現一個雙機熱備高可用功能;keepalived在VRRP虛擬路由冗余協議為基礎實現高可用,也可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其他機器的默認路由為該vip),master會發組播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。下面是官方給出的KeepAlived組件圖

技術分享


由上圖可以看出,keepalived也是模塊化設計,不同模塊實現不同的功能,它主要有三個模塊,分別是core、check和VRRP,其中:

  • core模塊:為keepalived的核心組件,負責主進程的啟動、維護以及全局配置文件的加載和解析;

  • check模塊:負責健康檢查,包括常見的各種檢查方式;

  • VRRP模塊:是來實現VRRP協議的。

  • system call:系統調用

  • watch dog:監控check和vrrp進程的管理進程,他是用來對check和vrrp進程實現高可用的。

  • checkers:負責檢測器子進程的健康狀態,當其檢測到master上的服務不可用時則通告vrrp將其轉移至backup服務器上。

2 keepalived作用

Keepalived主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的只是修復故障的web服務器。

3 keepalived配置文件

Keepalived是一個相對輕量級的服務,而且與LVS配合的非常好,它只有一個配置文件,主要包括global_defs、static_ipaddress、static_routes、VRRP_script、VRRP_instance和virtual_server的設置,而這個這些配置又可分為三大類:全局配置,VRRP的配置以及LVS配置。

1)全局配置

global_defs {                    # Block id
    notification_email {         
        [email protected]             # 指明接收keepalived信息的郵箱
    ...
    }
    notification_email_from [email protected]              # 郵箱名
    smtp_server 127.0.0.1            # 收郵件的主機地址
    smtp_connect_timeout 30          # integer, seconds
    router_id my_hostname            # 一個標記該主機的字符串,可以不是主機名,建議使用主機名
    vrrp_mcast_group4 224.0.0.18     # 多播組地址, 默認是 224.0.0.18
    vrrp_mcast_group6 ff02::12       # ipv6多播組地址, 默認是 ff02::12
    enable_traps                     # 啟用SNMP陷阱,可以不啟用
}

2)VRRP配置

VRRPD配置包括三個類:VRRP同步組(synchroization group)、VRRP實例(VRRP Instance)、VRRP腳本

******VRRP instance(s)*******
    # describes  the moveable IP for each instance of a group in vrrp_sync_group.  Here are described two IPs 
    # (on inside_network and on outside_network), on machine "my_hostname", which belong to the group VG_1 and which 
    # will  transition  together  on any state change.

    vrrp_instance inside_network {
        state MASTER                             # 
        interface eth0                            # 
        use_vmac <VMAC_INTERFACE> # Use VRRP Virtual MAC.        # 
        vmac_xmit_base                             # VMAC interface
        dont_track_primary                        # 

        track_interface {
            eth0
            eth1
            ...
        }

        mcast_src_ip <IPADDR>                     # 多播組源ip
        unicast_src_ip <IPADDR>
        unicast_peer {
            <IPADDR>
            ...
        }
        lvs_sync_daemon_interface eth1
        garp_master_delay 10                     # secs, default 5
        virtual_router_id 51
        priority 100                             # 優先級
        advert_int 1

        authentication {                         # 認證信息模塊
            auth_type PASS                         
            auth_pass 1234                         # 認證密碼,建議使用"openssl rand -hex 4"生成8位隨機密碼
        }

        virtual_ipaddress {                     # vrrp實例
                <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>         # 地址定義格式
                172.18.14.77/24 dev eth1                     # 地址+interface
                172.18.14.66/24 dev eth2 label eth2:1     
                172.18.14.55/24                             # 也可以直接寫地址即可
            }

           virtual_ipaddress_excluded {
            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
               ...
           }

           virtual_routes {         # 虛擬網關,在配置中可不定義
                src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
                192.168.110.0/24 via 192.168.200.254 dev eth1
                192.168.111.0/24 dev eth2
                192.168.112.0/24  via  192.168.100.254  or 192.168.113.0/24  via  192.168.200.254  or  192.168.100.254  dev eth1
                blackhole 192.168.114.0/24
            }

            nopreempt
            nopreempt
            preempt_delay 300    # waits 5 minutes
            debug                  # Debug level, not implemented yet.

            # notify scripts, alert as above

            notify_master <STRING>|<QUOTED-STRING>
            notify_backup <STRING>|<QUOTED-STRING>
            notify_fault <STRING>|<QUOTED-STRING>
            notify <STRING>|<QUOTED-STRING>
            smtp_alert
    }

3)LVS配置

如果你沒有配置LVS+keepalived,那麽無需配置這段區域,如果你用的是nginx來代替LVS,這無需配置這項,這裏的LVS配置是專門為keepalived+LVS集成準備的。它是用keepalived的配置文件來代替ipvsadm來配置LVS,並不是利用ipvsadm來配置,這樣會方便很多,一個配置文件搞定這些,維護也方便。這裏LVS配置也有兩個配置:一個是集群的定義,即VIP指定;二是添加真實服務器地址

************Virtual server(s)***********

fwmark <INT>     #防火墻標記,如果你是基於防火墻標記的LVS需要設置這一項
    
virtual_server group string {              # 配置虛擬服務器,可以是virtual_server IP port | virtual_server fwmark int 
    delay_loop <INT>                       # delay timer for service polling
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh     # LVS scheduler
    ops                                 # Enable One-Packet-Scheduling for UDP (-O in ipvsadm)
    lb_kind NAT|DR|TUN                   # LVS forwarding method
    persistence_timeout <INT>            # LVS persistence timeout, sec
    persistence_granularity <NETMASK>   # LVS granularity mask (-M in ipvsadm)
    protocol TCP                           # Only TCP is implemented
    ha_suspend                          # If VS IP address is not set,suspend healthchecker‘s activity
    virtualhost <STRING>                 # VirtualHost string for HTTP_GET or SSL_GET,eg virtualhost www.firewall.loc

    alpha
    omega
    quorum <INT>
    hysteresis <INT>
    quorum_up <STRING>|<QUOTED-STRING>
    quorum_down <STRING>|<QUOTED-STRING>
    
    sorry_server <IPADDR> <PORT>                 # RS to add when all realservers are down


    real_server <IPADDR> <PORT> {
        weight <INT>                             # relative weight to use, default: 1
        notify_up <STRING>|<QUOTED-STRING>
        notify_down <STRING>|<QUOTED-STRING>
        
        HTTP_GET|SSL_GET {                         # 如果是http則選擇HTTP_GET,https時選擇SSL_GET
            url {                                 # 做做健康性檢查時訪問的url,可以定多個url
                
                digest <STRING>                    # A url to test can have multiple entries here
                status_code <INT>                  # status code returned in the HTTP headereg status_code 200
             }

            delay_before_retry <INT>             # 失敗後判斷為宕機的延時
            connect_ip <IP ADDRESS>                # 連接IP地址
            connect_port <PORT>                    # 連接端口
            bindto <IP ADDRESS>
            bind_port <PORT>
            connect_timeout <INTEGER>             # 連接超時時間
            fwmark <INTEGER>
            warmup <INT>
        } 

        TCP_CHECK {                             # 基於TCP_CHECK的健康性檢測模塊定義
            connect_ip <IP ADDRESS>
            connect_port <PORT>
            bindto <IP ADDRESS>
            bind_port <PORT>
            connect_timeout <INTEGER>
            fwmark <INTEGER>
            warmup <INT>
        }

        SMTP_CHECK {                             # 基於郵件服務的健康性檢查模塊

                host {
                    connect_ip <IP ADDRESS>
                    connect_port <PORT>
                    bindto <IP ADDRESS>
                    bind_port <PORT>
                    connect_timeout <INTEGER>
                    fwmark <INTEGER>
                }

                retry <INTEGER>
                delay_before_retry <INTEGER>
                helo_name <STRING>|<QUOTED-STRING>
                warmup <INT>
            } 


        MISC_CHECK {             
            misc_path <STRING>|<QUOTED-STRING>
            misc_timeout <INT>
            warmup <INT>
            misc_dynamic
        }
        
    }
}


本章小結


上面分析幾乎所有keepalived.conf的配置信息,有些地方我直接援引的官方說明,而沒有翻譯,我感覺英文說的更為準確。當然還有一些選項沒有做詳細的說明,我會在隨後的文章中加以說明,接下來的文章會從實例出發,從實際案例中領悟這些指令的含義,當然了,在實際生產中並不是所有的指令都會使用,我們會選取最主要的進行定義,那時在看就會想得很輕松。




本文出自 “vinsent” 博客,請務必保留此出處http://vinsent.blog.51cto.com/13116656/1977635

keepalived知識梳理