Linux——(7)Keepalived高可用

1、解決LVS server單點故障html

    若是集羣中只有一臺LVS server提供數據包分發服務,若是宕機,則會致使全部的業務重點,由於全部的請求都沒法到達後面的Real server。nginx

此時咱們能夠採用多臺LVS server造成主備模型,來解決單點故障的問題。須要解決的細節有如下幾個方面:後端

1)備機如何得知主機宕機瀏覽器

  要解決這個問題,有兩種解決方案:服務器

  • 一種是每臺備機按期向主機詢問,看主機是否宕機。
  • 第二種是主機定時進行廣播,全部備機只要按期能收到廣播包,就說明主機正常運行,連續屢次未收到包,則說明主機宕機。

2)主機宕機後,哪臺備機接替成爲主機網絡

  有兩個策略:負載均衡

  • 選舉:推薦,得票最多的接替主機
  • 謙讓:每臺服務器都配一個數字,誰數字最大誰就接替主機

 

在Keepalived的方案中,咱們選用主機廣播和謙讓兩種模式來解決LVS server單點故障問題。oop

 

2、解決Real server宕機檢測問題測試

    Real server發生宕機時,必須動態的從LVS server上剔除該宕機的Real server。因此必需要有監控機制。url

    1)經過ping的方式查看主機狀態:只能證實主機三層網絡是否正常,而沒法證實業務是否正常。

    2)Real server提供一個專用頁面,讓一個第三方程序定時訪問,若是返回200,則表示業務正常。

 

    Keepalived提供第二種方案來確保業務的監控準確性。

 

3、Keepalived原理

  VRRP協議(虛擬路由冗餘協議)—— Virtual Router Redundancy Protocol

  做用是在LVS server宕機時,將VIP漂移到備機上,能夠實現短期內的業務切換。

 

    Keepalived是用戶控件的程序,能夠代替ipvsadm來直接調用內核LVS提供的接口,因此咱們無需安裝ipvsadm軟件。可是ipvsadm能夠提供一些方面的命令來查看LVS的運行狀態,例如ipvsadm -lnc,因此建議安裝。

yum install keepalived -y

    Keepalived是經過配置文件來進行配置的,咱們無需手工配置LVS,因此在啓動keepalived後,全部LVS配置都會自動完成。

# 配置文件
vi /etc/keepalived/keepalived.conf
# 查看日誌
tail /var/log/message

 

3、Keepalived實驗

1.系統準備

準備四臺乾淨的虛擬機位於同一局域網,網段爲192.168.1.0。

四臺虛擬機IP分別是:

  LVS server 1:192.168.1.199  (DIP)

  LVS server 2:192.168.1.200  (DIP)

  Real server 1:192.168.1.201  (RIP)

  Real server 2:192.168.1.202  (RIP)

 

2.爲兩臺LVS server安裝ipvsadm(也能夠不安裝)

yum install ipvsadm -y
# 若是以前手工配置過LVS,則清除配置
ipvsadm -C

 

3.配置兩臺Real server

修改配置使其能夠隱藏VIP:

# 只響應詢問本身地址的請求,不迴應位於lo的VIP
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# 只主動播報與本接口地址匹配的信息
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

# 爲全部網卡添加一樣配置,好比後續添加新的網卡
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

給lo配置VIP:

ifconfig lo:2 192.168.1.10 netmask 255.255.255.255

安裝httpd:

yum install httpd -y

在httpd的發佈目錄下寫一個簡單的頁面index.html:

cd /var/www/html
vi index.html

from real-server-1

啓動httpd服務:

systemctl start httpd

 

4.安裝keepalived

爲兩臺LVS server都安裝keepalived:

yum install keepalived -y

 

5.配置keepalived

備份配置文件:

cd /etc/keepalived
cp keepalived.conf keepalived.conf.bak

查看配置文件:

[root@lvs-server-2 keepalived]# more keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

咱們能夠看到,配置文件中是按模塊配置的,主要有三大模塊:

  global_defs:全局配置,配置一些郵件信息,出現問題的時候能夠發郵件給管理者。

  vrrp_instance:VRRP冗餘協議配置。

  virtual_server:虛擬服務配置(也就是配置LVS server的冗餘,其中包含後端的多個Real server配置)

 

vrrp_instance配置部分:

# 這是模板
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id
51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.200.16 192.168.200.17 192.168.200.18 } }

解釋:

1.state能夠有MASTER和BACKUP兩種,例如企業中多臺LVS的主備配置不同,配置最好的設置爲MASTER,其餘設爲BACKUP。當Master宕機,則有某臺BACKUP接替,能MASTER搶修好了,MASTER會搶回主機角色。

  注意:這種主修復好後馬上搶回主機角色的模式,主要用於LVS這種四層負載,由於LVS無需保存業務上下文,主備切換的成本很低。主備機器除了一個擁有VIP,一個沒有VIP的區別意外,其餘都是同樣的,主備都是隨時監測Real server的狀態,實時更新Real server的列表,因此不管是主機仍是備機,他們都能提供正確的服務。

  而像nginx那種基於7層業務的負載均衡,則在主備切換的先後須要進行大量元數據的同步,若是主機修復好後,立刻搶回主機的角色,則須要在搶回以前鎖定備機,進行元數據同步,此時會致使備機沒法提供業務。切換成本很高。

 

2.interface配置的是心跳廣播使用哪一個網卡,能夠和業務公用一個網卡,例如eth0,也能夠單獨走一個網絡(使用eth1)。

3.virtual_router_id是一套keepalived的ID,例如一個企業可能有多套keepalived,使用該ID區分,以避免混淆。

4.priority就是優先級,每臺機器無論主備都應該是不同的,例如主機是100,備機是9九、9八、97......,用於備機接替主機時謙讓選舉。

5.advert_int、authentication 是用做驗證,無需關心。

6.virtual_ipaddress:192.168.1.10/24 dev eth0 label eth0:8

virtual_ipaddress {
        192.168.1.10/24 dev eth0 label eth0:8
}

若是配置不知道怎麼配,可使用man查看幫助文檔:

man 5 keepalived.conf

在幫助文檔中搜索關鍵字,例如 virtual_ipaddress。

 

配置完後以下:

# 這是當前實驗的配置(LVS server 1)
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.10/24 dev eth0 label eth0:8
    }
}

以上配置提供給Keepalived自動去配置LVS server的VIP,固然只有MASTER纔會被真正配置VIP,由於配有VIP的LVS就是提供服務的LVS。

 

virtual_server配置部分:

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

解釋:

如下幾項是對LVS內核的配置:

1.virtual_server 後面的IP地址就是VIP地址以及端口,例如咱們配爲192.168.1.10 80。

2.lb_algo是轉發模式,rr爲輪詢。

3.lb_kind負載均衡的模式,咱們選擇DR。

4.persistence_timeout:例如某個用戶頻繁訪問,若是該timeout設置爲0,則每次訪問均可能被分配到不一樣的Real server,一次訪問Real server可能會爲該用戶分配內存空間和建立一些對象。若是每次訪問都被分配到不一樣的Real server,則意味着這些Real server都要爲該用戶分配一些內存空間和建立一些對象,這樣回形成服務器資源的浪費。因此咱們設置該timeout爲長一點的時間,在這個時間範圍會,一個用戶重複訪問資源,都將其分到同一個Real server(也就是在LVS上記錄他上次分到的Real server,一段時間內的其餘請求也發給那個Real server)。正常業務時能夠設置爲180s。咱們這裏配置爲0,用於測試。

 

至此LVS就算配置完了,後面的real_server是對Real server的配置:

1.real_server後面的IP和端口就是真實提供服務的real server的IP以及Httpd的端口,這裏是192.168.1.201 80。

2.weight是Real server的權重,若是一臺爲1,一臺爲2,則第二臺被分配到的連接數量是第一臺的兩倍。

3. SSL_GET開始,就是Real server的健康檢查部分,這裏的SSL是對應https協議。咱們這裏採用的是http協議,因此修改成HTTP_GET。

4.url是提供給keepalived訪問的一個頁面,專門用來判斷Real server的業務是否正常。這裏用index.html頁面代替。用返回狀態200所謂判斷依據。

url {
    path /
    status_code 200      
}

5.connect_timeout是訪問測試頁面超時的時間,nb_get_retry是重試次數,delay_before_retry是重試前延遲時間,能夠保持默認。

 

配置完以下:

virtual_server 192.168.1.10 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.1.201 80 {
        weight 1
        SSL_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.202 80 {
        weight 1
        SSL_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

這樣就將LVS內核以及須要健康檢查的兩臺Real server都配置好了。

 

除了以上三個主要部分的配置,後面的配置模板能夠所有刪除了

 

配置另外一臺LVS server:

將配置好的配置文件拷貝到另一臺須要配置得LVS server,只須要修改vrrp_instance 模塊中的state,將其修改成BACKUP。並將priority修改成99。

 

6.啓動keepalived

啓動MASTER機器的keepalive:

systemctl start httpalived

啓動後,咱們查看ifconfig:

[root@lvs-server-1 keepalived]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.199  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 240e:398:c0:ddc0:20c:29ff:fe86:f385  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::20c:29ff:fe86:f385  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:86:f3:85  txqueuelen 1000  (Ethernet)
        RX packets 62538  bytes 65619264 (62.5 MiB)
        RX errors 0  dropped 6988  overruns 0  frame 0
        TX packets 4348  bytes 615699 (601.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:86:f3:85  txqueuelen 1000 (Ethernet)

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

發現keepalive爲咱們自動建立了VIP(MASTER上)。

啓動備機BACKUP的keepalive:

systemctl start keepalived
[root@lvs-server-2 keepalived]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.200  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 240e:398:c0:ddc0:20c:29ff:fea5:7756  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::20c:29ff:fea5:7756  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a5:77:56  txqueuelen 1000  (Ethernet)
        RX packets 28544  bytes 23854439 (22.7 MiB)
        RX errors 0  dropped 7251  overruns 0  frame 0
        TX packets 3701  bytes 669310 (653.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

咱們發現備機BACKUP啓動keepalived後,並無建立VIP,符合咱們的預期。

 

7.驗證負載均衡

使用ipvsadm -ln分別在主備LVS server上查看負載均衡狀況:

查詢結果一致:

[root@lvs-server-1 keepalived]# 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.1.10:80 rr
  -> 192.168.1.201:80             Route   1      0          1         
  -> 192.168.1.202:80             Route   1      0          1      

咱們發現VIP和下掛的Real server都被正確監控。

 

此時使用瀏覽器來訪問VIP:

 

發現沒法打開頁面,咱們ping一下VIP:

 

發現也沒法ping通。

檢查keepalived配置文件,發如今global_defs中有一行爲vrrp_strict,在兩臺LVS server上都將其註釋掉:

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

而後再次嘗試ping,就可以ping通了,再次嘗試瀏覽器訪問VIP:

 

此時,發現可以正常訪問了。。

 

8.測試異常狀況

測試四種狀況:

  1)MASTER宕機時

  2)MASTER恢復時

  3)Real server宕機時

  4)Real server恢復時

 

當LVS server的MASTER機器宕機時(使用down掉網卡來模擬):

檢查備機BACKUP也就是LVS server 2的網卡信息:

 

[root@lvs-server-2 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.200  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 240e:398:c0:ddc0:20c:29ff:fea5:7756  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::20c:29ff:fea5:7756  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a5:77:56  txqueuelen 1000  (Ethernet)
        RX packets 4668  bytes 417590 (407.8 KiB)
        RX errors 0  dropped 1135  overruns 0  frame 0
        TX packets 2830  bytes 292478 (285.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:a5:77:56  txqueuelen 1000 (Ethernet)

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

 

發現備機被自動添加了VIP,說明keepalived運行正常。

 

當LVS MASTER恢復時(使網卡UP):

檢查備機BACKUP的網卡信息:

[root@lvs-server-2 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.200  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 240e:398:c0:ddc0:20c:29ff:fea5:7756  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::20c:29ff:fea5:7756  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a5:77:56  txqueuelen 1000  (Ethernet)
        RX packets 5009  bytes 449806 (439.2 KiB)
        RX errors 0  dropped 1244  overruns 0  frame 0
        TX packets 3127  bytes 315912 (308.5 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

發現eth:8消失。

檢查恢復的主機MASTER的網卡信息:

[root@lvs-server-1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.199  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 240e:398:c0:ddc0:20c:29ff:fe86:f385  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::20c:29ff:fe86:f385  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:86:f3:85  txqueuelen 1000  (Ethernet)
        RX packets 3271  bytes 313970 (306.6 KiB)
        RX errors 0  dropped 1063  overruns 0  frame 0
        TX packets 3090  bytes 274434 (268.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:86:f3:85  txqueuelen 1000 (Ethernet)

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 30  bytes 2520 (2.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 30  bytes 2520 (2.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

發現eth0:7被從新設置,也就是VIP漂移回MASTER了。keepalived運行正常。

 

 

當Real server 1的Httpd服務宕掉時:

[root@real-server-1 ~]# systemctl stop httpd

檢查兩個LVS的負載信息:

# MASTER
[root@lvs-server-1 ~]# 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.1.100:80 rr
  -> 192.168.1.202:80             Route   1      1          0       
# BACKUP
[root@lvs-server-2 ~]# 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.1.100:80 rr
  -> 192.168.1.202:80             Route   1      1          0      

咱們發現兩個LVS server上Real server列表中都將Real server 1剔除,keepalived運行正常。

 

當Real server 1的Httpd服務恢復時:

[root@real-server-1 ~]# systemctl start httpd  

檢查兩個LVS的負載信息:

# MASTER
[root@lvs-server-1 ~]# 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.1.100:80 rr
  -> 192.168.1.201:80             Route   1      1          0         
  -> 192.168.1.202:80             Route   1      1          0         
# BACKUP
[root@lvs-server-2 ~]# 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.1.100:80 rr
  -> 192.168.1.201:80             Route   1      0          0         
  -> 192.168.1.202:80             Route   1      1          0        

咱們發現Real server 1又被正確的添加進了列表中,keepalived運行正常。

相關文章
相關標籤/搜索