【均衡負載之LVS 系列三】 - 高可用 LVS+KeepAlived 集羣

在該系列前兩篇文章中,咱們全面認識了LVS並配置完成了簡單的DR-LVS集羣。當集羣的請求量過大時,LVS會有宕機的可能,爲提升集羣的高可用性並增長後端檢測功能、簡化配置,在集羣中引入KeepAlived。

KeepAlived

KeepAlived 簡介

KeepAlived最初是爲LVS設計,用來管理並監控LVS集羣系統中各個服務節點的狀態,後來加入了VRRP功能,發展一個多功能、通用的輕量級高可用組件,能夠爲ipvs、nginx、haproxy等諸多服務提供高可用功能。html

clipboard.png

上圖是Keepalived的功能體系結構,大體分兩層nginx

內核空間(kernel space):算法

  • IPVS :IP虛擬服務器,用於實現網絡服務的負載均衡
  • NETLINK :提供高級路由及其餘相關的網絡功能

用戶空間(user space):後端

  • WatchDog:負載監控checkers和VRRP進程的情況
  • VRRP Stack:負責負載均衡器之間的 FailOver 失敗切換,若是隻用一個負載均衡器,則VRRP不是必須的。
  • Checkers:負責真實服務器的 healthchecking 健康檢查,是keepalived最主要的功能。換言之,能夠沒有VRRP Stack,但healthchecking是必定要有的。
  • IPVS wrapper:將用戶設定的規則發送到內核ipvs
  • Netlink Reflector:用來設定vrrp的vip地址等。
  • Control Plane:配置文件分析器,用來實現配置文件的分析和加載
  • Memory Mngt:內存管理組件

認識 VRRP

在現實的網絡環境中,兩臺須要通訊的主機大多數狀況下並無直接的物理鏈接。對於這樣的狀況,它們之間路由怎樣選擇?主機如何選定到達目的主機的下一跳路由,這個問題一般的解決方法有二種:centos

  • 在主機上使用動態路由協議(RIP、OSPF等)
  • 在主機上配置靜態路由

很明顯,在主機上配置動態路由是很是不切實際的,由於管理、維護成本以及是否支持等諸多問題。配置靜態路由就變得十分流行,但路由器(或者說默認網關default gateway)卻常常成爲單點故障。VRRP的目的就是爲了解決靜態路由單點故障問題,VRRP經過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某臺VRRP路由器。緩存

clipboard.png

VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)能夠認爲是實現路由器高可用的協議,簡單的說,當一個路由器故障時能夠由另外一個備份路由器繼續提供相同的服務。安全

即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的網關ip和虛擬mac;master會發送224.0.0.18地址組播報文,當backup收不到vrrp包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup做爲master對外提供服務。這樣的話就能夠保證路由器的高可用,對於該路由器組所在局域網內其餘主機來講仍是至關於一臺路由器,它們就可設置靜態缺省路由網關爲該路由器組ip了。bash

虛擬mac是虛擬路由器根據虛擬路由器ID生成MAC地址,格式爲:00-00-5E-00-01-{VRID},當虛擬路由器迴應ARP請求時,使用虛擬MAC地址,而不是接口的真實MAC地址。服務器

工做機制網絡

  在一個VRRP虛擬路由器中,有多臺物理的VRRP路由器,可是這多臺的物理的機器並不能同時工做,而是由一臺稱爲MASTER的負責路由工做,其它的都是BACKUP,MASTER並不是一成不變,VRRP讓每一個VRRP路由器參與競選,最終獲勝的就是MASTER。MASTER擁有一些特權,好比,擁有虛擬路由器的IP地址,咱們的主機就是用這個IP地址做爲靜態路由的。擁有特權的MASTER要負責轉發發送給網關地址的包和響應ARP請求。

  VRRP根據優先級來肯定虛擬路由器中每臺路由器的角色(Master路由器或Backup路由器)。VRRP優先級的取值範圍爲0到255(數值越大代表優先級越高),可配置的範圍是1到254,優先級0爲系統保留給路由器放棄Master位置時候使用,255則是系統保留給IP地址擁有者使用。優先級越高,則越有可能成爲Master路由器。當兩臺優先級相同的路由器同時競爭Master時,比較接口IP地址大小。接口地址大者當選爲Master。

  在一個虛擬路由器中,只有做爲MASTER的VRRP路由器會一直髮送VRRP通告信息(VRRPAdvertisement message),BACKUP不會搶佔MASTER,除非它的優先級(priority)更高。當MASTER不可用時(BACKUP收不到通告信息), 多臺BACKUP中優先級最高的這臺會被搶佔爲MASTER。這種搶佔是很是快速的(<1s),以保證服務的連續性。因爲安全性考慮,VRRP包使用了加密協議進行加密。

工做流程

  1. 初始化 Initialize 狀態

    經過VRRP報文的交互獲知虛擬路由器中其餘成員的優先級(keepalived是經過配置文件配置優先級,因此配置定義爲MASTER的主機優化級較高),其中優先級最高的成爲Master路由器,其餘成爲Backup路由器;

  2. 當路由器處於Master狀態時,它將會作下列工做:

    • 設置定時通告定時器
    • 以虛擬MAC地址響應對虛擬IP地址的ARP請求;
    • 轉發目的MAC地址爲虛擬MAC地址的IP報文;
    • 若是它是這個虛擬IP地址的擁有者,則接收目的IP地址爲這個虛擬IP地址的IP報文;不然,丟棄這個IP報文;
    • 當收到shutdown的事件時刪除定時通告定時器,發送優先權級爲0的通告包,轉初始化狀態;
    • 若是定時通告定時器超時時,發送VRRP通告信息;
    • 收到VRRP通告信息時,若是優先權爲0,發送VRRP通告信息;若優先權非0,而且優先級高於本機,或優先權相等同時實際IP地址大於本機實際IP,則設置定時通告定時器,復位主機超時定時器,轉BACKUP狀態;不然,丟棄該通告包。
  3. 當路由器處於Backup狀態時,它將會作下列工做:

    • 設置主機超時定時器;
    • 對虛擬IP地址的ARP請求,不作響應;
    • 丟棄目的MAC地址爲虛擬MAC地址的IP報文;
    • 不接受目的是虛擬路由器IP的全部數據包;
    • 當收到shutdown的事件時刪除主機超時定時器,轉初始化狀態;
    • 收到VRRP通告信息時,若是優先權爲0,表示進入MASTER選舉;不然判斷數據的優先級是否高於本機,若是高的話認可MASTER有效,復位主機超時定時器;不然的話,丟棄該通告包;
    • 主機超時定時器超時的時候,發送VRRP通告信息,廣播ARP地址信息,轉MASTER狀態;

VRRP 與 KeepAlived

clipboard.png

KeepAlived利用VRRP協議來實現集羣中 LVS-VIP 的高可用,並解決各KeepAlived主機的角色選舉及其狀態問題。

KeepAlived 配置文件

keepalived只有一個配置文件keepalived.conf,裏面主要包括如下幾個配置區域,分別是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

global_defs區域

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

global_defs {
    notification_email {
        a@abc.com
        b@abc.com
        ...
    }
    notification_email_from alert@abc.com
    smtp_server smtp.abc.com
    smtp_connect_timeout 30
    enable_traps
    router_id host163
    vrrp_skip_check_adv_addr
    vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0 
    vrrp_lower_prio_no_advert 
    vrrp_version <2 or 3>  
    script_user <username> [groupname]
    enable_script_security
}
  • notification_email :故障發生時給誰發郵件通知。
  • notification_email_from :通知郵件從哪一個地址發出。
  • smpt_server :通知郵件的smtp地址。
  • smtp_connect_timeout :鏈接smtp服務器的超時時間。
  • enable_traps :開啓SNMP陷阱(Simple Network Management Protocol)。
  • router_id :主機標識,用於郵件通知。
  • vrrp_strict :嚴格執行VRRP協議規範,此模式不支持節點單播
  • vrrp_garp_interval :單位秒,在一個網卡上每組gratuitous arp消息之間的延遲時間,默認爲0,一個發送的消息=n組 arp報文
  • vrrp_gna_interval :單位秒, 在一個網卡上每組na消息之間的延遲時間,默認爲0
  • vrrp_lower_prio_no_advert :若是接收到一個低優先級的通告,只須要丟棄它,不用發送其餘通告,字符類型:布爾值,false/true
  • vrrp_version :設置vrrp協議版本,默認是版本2
  • script_user <username> [groupname] :設置運行腳本的默認用戶和組。若是沒有指定,則默認用戶爲keepalived_script(須要該用戶存在),不然爲root用戶。默認groupname同username。
  • enable_script_security :若是腳本路徑的任一部分對於非root用戶來講,都具備可寫權限,則不會以root身份運行腳本。爲了防止非root用戶經過更改script來執行root權限的命令。

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
//關閉時

vrrp_script區域

用來作自身健康狀態檢查的,當時檢查失敗時會將 vrrp_instance 的 priority 減小相應的值。

vrrp_script chk_http_port {
    script "</dev/tcp/127.0.0.1/80"
    interval 1
    weight -10
    fall 3 
    rise 2
    user keepalived_script  
}
  • script :週期性執行的腳本。
  • interval :運行腳本的間隔時間,秒。
  • weight :執行失敗時所加的權重(負值),priority加上此值要小於備服務的priority值。
  • fall :檢測幾回失敗才爲失敗,整數。
  • rise :檢測幾回正常才爲正常,整數。
  • enable_traps :執行腳本的用戶或組。

以上意思是若是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 ens33
    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組播,若是使用組播發送vrrp的包那麼該值必須每組惟一,若是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 advert
bogus 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 :啓動keepalived後發現了一個低優先級的master後,多少秒開始搶佔,而且前提是沒有nopreempt選項。爲使該選項工做,初始狀態必須是BACKUP

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>virtualhost
    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>
        } 
    }
}
  • virtual_server :定義虛擬服務的VIP及端口。
  • delay_loop :定義健康檢查的時間間隔,單位爲秒。
  • lb_algo :後端調試算法(load balancing algorithm)。
  • lb_kind :LVS調度類型NAT/DR/TUN。
  • persistence_timeout :單位ms,保持客戶端的請求在<INT>時間段內所有發到同一個真實服務器。適用於動態網頁session共享的環境。默認六分鐘。
  • persistence_granularity :會話保持粒度,配合persistence_timeout使用,經過子網掩碼來定義會話保持對一個IP生效仍是對一組IP生效。默認值爲255.255.255.255,表示單個客戶端分配到一個RS上;255.255.255.0表示客戶端IP所在的整個網段的請求都會分配給同一臺RS
  • protocol :使用協議,TCP|UDP|SCTP
  • ha_suspend :在LB節點狀態從Master切換到Backup時,不啓用對RS節點的健康檢查
  • virtualhost :用來給HTTP_GET和SSL_GET配置請求header的。
  • alpha :在啓動daemon時,默認全部的RS是down狀態,healthcheck健康檢查failed。這有助於其啓動時誤報錯誤,默認狀況下禁用alpha模式 。
  • omega :開啓omega模式,清除rs時會執行相應的腳本(rs的notify_up,quorum_up),默認爲禁用模式。
  • sorry_server :當全部real server宕掉時,sorry server頂替。
  • real_server :真正提供服務的服務器。
  • weight :權重。
  • inhibit_on_failure :配置該項,在檢測到後端RS節點故障後將weight值改成0,而不是從IPVS中刪除
  • notify_up/down :當real server啓動或宕掉時執行的腳本。
  • HTTP_GET|SSL_GET :健康檢查的方式,還有 TCP_CHECK、MISC_CHECK
  • path :請求real serserver上的路徑。
  • digest/status_code :分別表示用genhash算出的結果和http狀態碼。
  • connect_port :健康檢查,若是端口通則認爲服務器正常。
  • connect_timeout :無響應超時時間,單位秒。
  • nb_get_retry :重試次數。在Keepalived 2.x版本以前使用nb_get_retry,2.x版本以後使用retry。
  • delay_before_retry :重試間隔時間,單位秒。

更多配置參考官網說明

KeepAlived - LVS 部署

爲模擬集羣環境,咱們準備了五臺虛擬機分別爲Client、LVS-一、LVS-二、RealServer一、RealServer2,VIP設爲192.168.0.100

  • Client :192.168.0.6
  • LVS-1 :192.168.0.2
  • LVS-2 :192.168.0.3
  • RealServer1 :192.168.0.4
  • RealServer2 :192.168.0.5

RealServer 配置

與系列二文章同樣,須要在RealServer的進行如下操做

  • 部署http服務
  • 在設備lo上配置VIP,掩碼/32
  • 修改arp_ignore/arp_announce配置
[root@RealServer1 ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@RealServer1 ~]# yum install nginx -y
[root@RealServer1 ~]# chkconfig nginx on
[root@RealServer1 ~]# systemctl start nginx
//啓動nginx
[root@RealServer1 ~]# echo 'RealServer1 192.168.0.4' > /usr/share/nginx/html/index.html
//默認html改成 'RealServer1 192.168.0.4',同理RealServer2 上改成 'RealServer2 192.168.0.5'
[root@RealServer1 ~]# curl 127.0.0.1
RealServer1 192.168.0.4
//至此部署好了http服務
[root@RealServer1 ~]# ifconfig lo:0 192.168.0.100 broadcast 192.168.0.100 netmask 255.255.255.255 up
[root@RealServer1 ~]# route add -host 192.168.0.100 dev lo:0
//將VIP添加到lo:0上,掩碼爲/32
[root@RealServer1 ~]# echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
[root@RealServer1 ~]# echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RealServer1 ~]# echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
[root@RealServer1 ~]# echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
//修改 arp_ignore/arp_announce 配置

手動配置比較繁瑣,能夠用如下腳本替代

realserver.sh

#!/bin/bash
# Script to start LVS DR real server.
# description: LVS DR real server
. /etc/rc.d/init.d/functions
 
VIP=192.168.0.100 #修改成VIP
host=`/bin/hostname`
case "$1" in
    start)
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev lo:0
        ;; 
    stop)
        /sbin/ifconfig lo:0 down
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        ;; 
    status)
        islothere=`/sbin/ifconfig lo:0 | grep $VIP`
        isrothere=`netstat -rn | grep "lo" | grep $VIP`
        if [ ! "$islothere" -o ! "isrothere" ];then
            # Either the route or the lo:0 device not found.
            echo "LVS-DR real server Stopped." 
        else
            echo "LVS-DR real server Running." 
        fi
        ;; 
    *) 
        # Invalid entry.
        echo "$0: Usage: $0 {start|status|stop}"
        exit 1
        ;; 
    esac
    exit 0

編輯好腳本後,測試下是否能正常運行

[root@RealServer1 ~]# vi  realserver.sh
[root@RealServer1 ~]# chmod +x realserver.sh
//添加執行權限
[root@RealServer1 ~]# ./realserver.sh start
[root@RealServer1 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.4  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20c:29ff:febd:38da  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:bd:38:da  txqueuelen 1000  (Ethernet)
        RX packets 181  bytes 20289 (19.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 157  bytes 41577 (40.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.0.100  netmask 255.255.255.255
// lo:0 配置生效
[root@RealServer1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0 ens33
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.0.100   0.0.0.0         255.255.255.255 UH    0      0        0 lo
// 路由添加成功
[root@RealServer1 ~]# cat /proc/sys/net/ipv4/conf/lo/arp_ignore
1
[root@RealServer1 ~]# cat /proc/sys/net/ipv4/conf/lo/arp_announce
2
[root@RealServer1 ~]# cat /proc/sys/net/ipv4/conf/all/arp_ignore
1
[root@RealServer1 ~]# cat /proc/sys/net/ipv4/conf/all/arp_announce
2
// arp_ignore/arp_announce 配置生效
[root@RealServer1 ~]#

至此RealServer配置完成

LVS 配置

LVS部署需完成如下步驟

  • 部署http服務,當後端RealServer所有異常時返回本機告警頁面
  • 安裝ipvsadm,用查看ipvs規則
  • 安裝並部署KeepAlived

安裝 nginx、ipvsadm、keepalived

[root@LVS1 ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@LVS1 ~]# yum install nginx -y
[root@LVS1 ~]# chkconfig nginx on
[root@LVS1 ~]# systemctl start nginx
[root@RealServer1 ~]# echo 'LVS1 192.168.0.2' > /usr/share/nginx/html/index.html
// 默認html 改成 'LVS1 192.168.0.2',同理 LVS2 改成 'LVS2 192.168.0.3'
[root@LVS1 ~]# curl 127.0.0.1
LVS1 192.168.0.2
[root@LVS ~]# yum install ipvsadm -y 
// 安裝 ipvsadm
[root@LVS1 ~]# cd keepalived-xxx
[root@LVS1 ~]# ./configure --prefix=/usr/local/keepalived --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --mandir=/usr/share
[root@LVS1 ~]# make && make install
// 示例爲官網編譯安裝最新版本

配置keepalived.conf

! RealServer1

global_defs {
    router_id LVS1 #路由器標識
    script_user root
    enable_script_security
}

vrrp_instance VI_1 {
    state BACKUP    #爲了使原來爲主的機器異常恢復以後不會搶佔如今爲主的資源,因此主備兩臺機器都會配置爲BACKUP,同時配置上非搶佔模式-nopreempt
    interface ens33    #通告VRRP所用接口
    priority 150    #另外一臺設置爲50
    nopreempt    #開啓非搶佔模式,即使自身權值高也不搶佔
    virtual_router_id 1
    advert_int 1    #VRRP通告間隔,單位秒
    authentication {
    auth_type PASS
    auth_pass test
    }
    unicast_peer {    #VRRP包的單播發送
    192.168.0.3    #對端IP
    }
    virtual_ipaddress_excluded {
    192.168.0.100    #VIP
    }
}

virtual_server 192.168.0.100 80 {
    delay_loop 5
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60
    persistence_granularity 255.255.255.255
    protocol tcp
    inhibit_on_failure on
    ha_suspend
    sorry_server 127.0.0.1 80
    real_server 192.168.0.4 80 {
        weight 10
        HTTP_GET{
            url{
                path /
                status_code 200
            }
        connect_port 80
        connect_timeout 2
        retry 1
        delay_before_retry 1
        }
    }
    real_server 192.168.0.5 80 {
        weight 10
        HTTP_GET{
            url{
                path /
                status_code 200
            }
        connect_port 80
        connect_timeout 2
        retry 1
        delay_before_retry 1
        }
    }
}

配置keepalived日誌

因爲keepalived日誌默認保存在/var/log/message,不方便查看,爲此咱們將keepalived日誌單獨保存

[root@LVS1 ~]# vi /etc/sysconfig/keepalived
// 改成 KEEPALIVED_OPTIONS="-D -d -S 0"
[root@LVS1 ~]# vi /etc/rsyslog.conf
// 增長如下兩行
//# keepalived -S 0 
//local0.* /var/log/keepalived.log
[root@LVS1 ~]# systemctl  restart rsyslog
[root@LVS1 ~]# systemctl  restart keepalived

集羣測試

LVS1

[root@LVS1 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7068/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7061/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7224/master
tcp6       0      0 :::22                   :::*                    LISTEN      7061/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      7224/master
[root@LVS1 ~]# curl 127.0.0.1
LVS1 192.168.0.2
//測試nginx正常
[root@LVS1 ~]# systemctl  start  keepalived
[root@LVS1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.100:80 wrr persistent 60
  -> 192.168.0.4:80               Route   10     0          0
  -> 192.168.0.5:80               Route   10     0          0
//調度到了後端兩臺RealServer上而且狀態正常
[root@LVS1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:af:6b:f7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.2/24 brd 192.168.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.0.100/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feaf:6bf7/64 scope link
       valid_lft forever preferred_lft forever
// VIP成功掛在到網卡ens33上
[root@LVS1 ~]# tail /var/log/keepalived.log  -n 50
// 查看keepalived日誌

Client

在LVS2上啓用keepalived服務後,LVS1仍然爲Master

[root@Client ~]# arping 192.168.0.100
ARPING 192.168.0.100 from 192.168.0.6 ens33
Unicast reply from 192.168.0.100 [00:0C:29:AF:6B:F7]  1.191ms
Unicast reply from 192.168.0.100 [00:0C:29:AF:6B:F7]  1.065ms
Unicast reply from 192.168.0.100 [00:0C:29:AF:6B:F7]  0.836ms
^C Sent 3 probes (1 broadcast(s))
Received 3 response(s)
[root@Client ~]# arping 192.168.0.2
ARPING 192.168.0.2 from 192.168.0.6 ens33
Unicast reply from 192.168.0.2 [00:0C:29:AF:6B:F7]  1.176ms
Unicast reply from 192.168.0.2 [00:0C:29:AF:6B:F7]  0.771ms
^C Sent 2 probes (1 broadcast(s))
Received 2 response(s)
//VIP在LVS1上
[root@Client ~]# curl 192.168.0.100
RealServer1 192.168.0.4
[root@Client ~]# curl 192.168.0.100
RealServer1 192.168.0.4
// 因爲設置有persistence,短期內請求會分發到同一臺RealSever上
相關文章
相關標籤/搜索