keepalived+LVS實現高可用的Web負載均衡

數據流架構圖:

wKiom1k-T9OhQHDDAACF_BZBj48079.png

一、測試環境

主機名ipvip
lvs01192.168.137.150


192.168.137.80

lvs02192.168.137.130
web01192.168.137.128--
web02192.168.137.134--

二、安裝配置lvs、keepalived

1.分別在lvs01,lvs02主機上安裝ipvsadm keepalived

    yum install ipvsadm keepalived -y

    Installed:

      ipvsadm.x86_64 0:1.27-7.el7          keepalived.x86_64 0:1.2.13-9.el7_3

2.lvs01上的keepalived配置文件,按以下內容進行修改,將lvs01配置爲MASTER節點,並設置LVS的負載均衡模式爲DR模式

lvs01 ~]# vi /etc/keepalived/keepalived.conf

! Configuration Filefor keepalived

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   [email protected]

   smtp_server 192.168.137.150

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

  

vrrp_instance VI_1 {

    state MASTER #MASTER

    interface ens33

    virtual_router_id 52

    priority 100 #必須比BACKUP的值大

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.137.80 #VIP

    }

}

  

virtual_server 192.168.137.80 80 {

    delay_loop 6

    lb_algo rr #輪詢算法

    lb_kind DR #DR模式

    #persistence_timeout 50

    protocol TCP

  

    real_server 192.168.137.128 80 {

        weight 1

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

  

    real_server 192.168.137.134 80 {

        weight 1

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

3、修改lvs02上的keepalived配置文件,按以下內容進行修改,其實只有2處地方與主節點的配置文件不同,即state 要修改爲Backup,priority數值要比master的小
lvs02 ~]# vi /etc/keepalived/keepalived.conf

! Configuration Filefor keepalived

  

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   [email protected]

   smtp_server 192.168.137.130

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

  

vrrp_instance VI_1 {

    state BACKUP #BACKUP

    interface eth0

    virtual_router_id 52

    priority 90 #必須比MASTER的值小

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.137.80 #VIP

    }

}

  

virtual_server 192.168.137.80 80 {

    delay_loop 6

    lb_algo rr #輪詢算法

    lb_kind DR #DR模式

    #persistence_timeout 50

    protocol TCP

  

    real_server 192.168.137.128 80 {

        weight 1

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

  

    real_server 192.168.137.134 80 {

        weight 1

            TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

4.lvs01和lvs02主機上上設置keepalived開機自動啓動,並啓動keepalived服務


lvs01 ~]# systemctl enable keepalived

Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.


lvs01 ~]# systemctl start keepalived


注:查看日誌是否有相關日誌文件/var/log/messages輸出

systemd: Started LVS and VRRP High Availability Monitor.

Keepalived_vrrp[2416]:VRRP_Instance(VI_1) Transition to MATER STATE

Keepalived_healthcheckers[2415]: Netlink reflector reports IP 192.168.137.80 added.


Jun 12 17:07:26 server2 Keepalived_vrrp[15654]: VRRP_Instance(VI_1) Entering BACKUP STATE


5.查看vip是否已經綁定到網卡,

lvs01 ~]# ip a

inet 192.168.137.150/24 brd 192.168.137.255 scope global ens33

       valid_lft forever preferred_lft forever

inet 192.168.137.80/32 scope global ens33

       valid_lft forever preferred_lft forever


lvs02 ~]# ip a          ##介意可以看到vip不在lvs02上

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:a5:b4:85 brd ff:ff:ff:ff:ff:ff

    inet 192.168.137.130/24 brd 192.168.137.255 scope global eth0

    inet6 fe80::20c:29ff:fea5:b485/64 scope link 

       valid_lft forever preferred_lft forever


6.查看LVS的狀態,可以看到VIP和兩臺Realserver的相關信息

lvs01 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.137.80:80 rr

  -> 192.168.137.128:80           Route   1      0          0         

  -> 192.168.137.134:80           Route   1      0          0


7.由於DR模式是後端兩臺realserver在響應請求時直接將數據包發給客戶端,無需再經過LVS,這樣減輕了LVS的負擔、提高了效率,但由於LVS分發給realserver的數據包的目的地址是VIP地址,因此必須把VIP地址綁定到realserver的迴環網卡lo上,否則realserver會認爲該數據包不是發給自己因此會丟棄不作響應。另外由於網絡接口都會進行ARP廣播響應,因此當其他機器也有VIP地址時會發生衝突,故需要把realserver的lo接口的ARP響應關閉掉。我們可以用以下腳本來實現VIP綁定到lo接口和關閉ARP響應。


web01 ~]# vim /etc/init.d/lvsrs.sh

#!/bin/bash

#chkconfig: 2345 80 90

vip=192.168.137.80

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

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

sysctl -p


執行該腳本設置該腳本開機自動執行,查看IP地址,發現lo接口已經綁定了VIP地址

@web01 ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet 192.168.137.80/32 brd 192.168.137.80 scope global lo:0

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever


@web02 ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet 192.168.137.80/32 brd 192.168.137.80 scope global lo:0

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever


三、LVS負載均衡測試

wKioL1k-caijkuw5AABGSnPzwps970.png

wKioL1k-ciGzXCdHAABE5QbnEJU855.png

3、查看LVS的狀態,可以看到兩臺realserver各有2個不活動的連接,說明按1:1權重的輪詢也有生效,不活動連接是因爲我們只是訪問一個靜態頁面,訪問過後很快就會處於不活動狀態

lvs01 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.137.80:80 rr

  -> 192.168.137.128:80           Route   1      0          2         

  -> 192.168.137.134:80           Route   1      0          2 


四、Keepalived高可用測試

1、停止lvs01上的keepalived服務,再觀察它的日誌,可以發現其綁定的VIP被移除,兩個realserver節點也被移除了

lvs01 ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1

    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 qlen 1000

    link/ether 00:0c:29:77:71:4e brd ff:ff:ff:ff:ff:ff

    inet 192.168.137.150/24 brd 192.168.137.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::1565:761b:d9a2:42e4/64 scope link 

       valid_lft forever preferred_lft forever

lvs01 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn


此時發現vip及rs節點出現在lvs02上:並且用vip可還可正常訪問,表示漂移成功,並且如果之後lvs01恢復正常,vip依然會漂到lvs01上,原因爲keepalived的配置文件裏狀態爲master,

lvs02 ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:a5:b4:85 brd ff:ff:ff:ff:ff:ff

    inet 192.168.137.130/24 brd 192.168.137.255 scope global eth0

    inet 192.168.137.80/32 scope global eth0

    inet6 fe80::20c:29ff:fea5:b485/64 scope link 

       valid_lft forever preferred_lft forever

[root@lvs02 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.137.80:80 rr

  -> 192.168.137.128:80           Route   1      0          0         

  -> 192.168.137.134:80           Route   1      0          0 


2.我們將web01的httpd服務停止,模擬web01出現故障不能提供web服務,測試keepalived能否及時監控到並將web01從LVS中剔除,不再分發請求給web01,防止用戶訪問到故障的web服務器

@web01 ~]# /usr/local/apache24/bin/httpd -k stop


@lvs02 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.137.80:80 rr

  -> 192.168.137.134:80           Route   1      0          0         

@lvs02 ~]#


此時把web01的http服務啓動,keepalive的進程會檢測到rs恢復,自動添加到rs池中。


五、keepalived配置文件相關參數介紹

persistence_timeout 0 #保持客戶端的請求在這個時間段內全部發到同一個真實服務器,單位秒,動態
網站此參數很重要。
router_id LVS_DEVEL    # 設置lvs的id,在一個網絡內應該是唯一的
vrrp_instance VI_1 {    #vrrp實例定義部分
    state MASTER     #設置lvs的狀態,MASTER和BACKUP兩種,必須大寫
    interface eno16777736    #設置對外服務的接口
    lvs_sync_daemon_inteface     #負載均衡器之間的監控接口,類似於 HA HeartBeat的心跳線。但它的機制優於 Heartbeat,因爲它沒有“裂腦”這個問題,它是以優先級這個機制來規避這個麻煩的。在DR 模式中,lvs_sync_daemon_inteface 與服務接口 interface 使用同一個網絡接口。 
    virtual_router_id 60  #設置虛擬路由標示,這個標示是一個數字,同一個vrrp實例使用唯一標示
    priority 80    #定義優先級,數字越大優先級越高,在一個vrrp——instance下,master的優先級必須大於backup
    advert_int 1    #設定master與backup負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {  #設置驗證類型和密碼
        auth_type PASS  #主要有PASS和AH兩種
        auth_pass 1111  #驗證密碼,同一個vrrp_instance下MASTER和BACKUP密碼必須相同
    }
    virtual_ipaddress {  #設置虛擬ip地址,可以設置多個,每行一個
        192.168.1.253
    }
}
 
virtual_server 192.168.1.253 80 {  #設置虛擬服務器,需要指定虛擬ip和服務端口
    delay_loop 3    #健康檢查時間間隔
    lb_algo rr     #負載均衡調度算法
    lb_kind DR    #負載均衡轉發規則
    persistence_timeout 50    #設置會話保持時間,對動態網頁非常有用
    protocol TCP    #指定轉發協議類型,有TCP和UDP兩種
 
    real_server 192.168.1.87 80 {  #配置服務器節點1,需要指定real server的真實IP地址和端口
    weight 1    #設置權重,數字越大權重越高
    TCP_CHECK {     #realserver的狀態監測設置部分單位秒
            connect_timeout 3    #超時時間
            nb_get_retry 3      #重試次數
            delay_before_retry 3    #重試間隔
            connect_port 80      #監測端口
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章