keepalive+LVS-DR模式做高可用,實現負載均衡(主備模式)

LVS:

    LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。

    LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉

移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、

高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程

序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。

    其中,LVS有三種工作模式:

    1、NAT模式(VS-NAT)

    把客戶端發來的數據包的IP頭的目的地址,在負載均衡器上換成其中一臺RS的IP地址,併發至此RS

來處理,RS處理完成後把數據交給經過負載均衡器,負載均衡器再把數據包的原IP地址改爲自己的IP,將

目的地址改爲客戶端IP地址即可期間,無論是進來的流量,還是出去的流量,都必須經過負載均衡器

    2、IP隧道模式(VS-TUN)

    由於互聯網上的大多Internet服務的請求包很短小,而應答包通常很大,所以,隧道模式就是把客

戶端發來的數據包,封裝一個新的IP頭標記(僅目的IP)發給RS,RS收到後,先把數據包的頭解開,還原數據

包,處理後,直接返回給客戶端,不需要再經過負載均衡器注意,由於RS需要對負載均衡器發過來的數據包

進行還原,所以必須支持IPTUNNEL協議,因此在RS的內核中,必須要編譯IPTUNNEL這個選項。

    3、直接路由模式(VS-DR)

    負載均衡器和RS都使用同一個IP對外服務但只有DR對ARP請求進行響應,所有RS對本身這個IP的ARP

請求保持靜默也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包後根據調度算法,

找出對應的RS,把目的MAC地址改爲RS的MAC(因爲IP一致)並將請求分發給這臺RS這時RS收到這個數據

包,處理完成之後,由於IP一致,可以直接將數據返給客戶,則等於直接從客戶端收到這個數據包無異,

處理後直接返回給客戶端由於負載均衡器要對二層包頭進行改換,所以負載均衡器和RS之間必須在一個

廣播域,也可以簡單的理解爲在同一臺交換機上


keepalive:

    簡單一點來說,keepalive就是一個在TCP中可以檢測死連接的機制。


搭建環境(CentOS 7)


拓撲圖如下:

4614342960c25e685ac867a6e8695345.png-wh_

說明:

        主機         ip        角色
        LVS-1      10.0.0.11  LVS-DR+keepalive     (LVS主調度器)


 

   vip:10.0.0.100

        LVS-2      10.0.0.12  LVS-DR+keepalive     (LVS從調度器)
        web-1      10.0.0.13     web服務器
        web-2      10.0.0.14     web服務器


配置實驗環境:


1、先分別給各臺主機配好ip,關閉SELinux,在這裏我把防火牆也關閉了,爲防止時間不同步,我們也

可以同步一下時間。

     ##同步時間:

    yum install -y ntpdate
    crontab -e
    * * * * * ntpdate -u 0.pool.ntp.org >> /dev/null

接下來就是開始安裝和配置服務了。


2、作爲web服務器的兩臺主機,我用yum的方式裝Apache作爲web服務器,這裏就不寫配置httpd服務的具體過程了(兩臺機的配置都是一樣的)。

    ##開啓路由轉發。

   echo "1">/proc/sys/net/ipv4/ip_forward

    ##綁定VIP(如果不想每次重啓失效,可以選擇寫進網卡里

   ifconfig ens33:0 10.0.0.100 broadcast 10.0.0.100 netmask 255.255.255.255 up

    ##添加發送數據包到vip的路由

   route add -host 10.0.0.100 dev ens33:0

    ##抑制ARP請求

    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

    到此web服務器就已經配置完畢了,接下來就是配置LVS調度器了。


3、LVS調度器的配置

   兩臺LVS調度器除了keepalive配置文件和ip地址不一樣之外,其他配置都是一樣的。

   ##開啓路由轉發。

   echo "1">/proc/sys/net/ipv4/ip_forward

    ##安裝相關軟件包

   yum install -y keepalived ipvsadm

    ##配置keepalive(因爲keepalived是爲了lvs而生的,所以我們可以直接用keepalived直接配置lvs

的DR模型)

##主LVS調度器的keepalive配置文件

[root@lvs-1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {                ##全局設置 
   notification_email {      ##設置報警郵件地址 
     root@localhost  
   }  
   notification_email_from root@localhost  ##設置郵件的發送地址
   smtp_server localhost  
   smtp_connect_timeout 30  
   router_id  LVS-1         ##表示該臺服務的ID
} 

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51      ##master和backup的id一致
    priority 150              ##優先級,master的一定比backup的高
    advert_int 1              ##master和backup之間的檢測時間
    authentication {
        auth_type PASS        ##認證方式
        auth_pass 123456      ##認證密碼
    }
    virtual_ipaddress {
        10.0.0.100            ##設置vip
    }
}

virtual_server 10.0.0.100 80 { 
   delay_loop 6                 ##設置運行情況檢查時間,單位是秒
   lb_algo rr                   ##負載算法,這裏是rr表示輪詢  
   lb_kind DR                   ##定義模式,這裏是Direct route
   persistence_timeout 0        ##會話保存時長(秒),0表示不使用stickyness會話
   protocol TCP                 
   sorry_server 127.0.0.1 80    ##假如後端服務器都不能使用了,則訪問本機的80端口
   real_server 10.0.0.13 80 {   
       weight 1                      
        HTTP_GET {               ##以http模式檢查該服務器監控狀態
            url { 
              path /index.html   ##檢測的網頁路徑
            }
            connect_timeout 3     ##連接超時時間
            nb_get_retry 3        ##重試次數
            delay_before_retry 3  ##每次重試前等待延遲時間
        }       
   }
   real_server 10.0.0.14 80 {    
       weight 1
        HTTP_GET {
            url { 
              path /index.html
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }        
   }
}
##從LVS調度器的keepalive配置文件

[root@lvs-2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {                ##全局設置 
   notification_email {      ##設置報警郵件地址 
     root@localhost  
   }  
   notification_email_from root@localhost  ##設置郵件的發送地址
   #smtp_server localhost  
   #smtp_connect_timeout 30  
   router_id  LVS-2         ##表示該臺服務的ID
} 
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51      ##master和backup的id一致
    priority 100              ##優先級,master的一定比backup的高
    advert_int 1              ##master和backup之間的檢測時間
    authentication {
        auth_type PASS        ##認證方式
        auth_pass 123456      ##認證密碼
    }
    virtual_ipaddress {
        10.0.0.100            ##設置vip
    }
}
virtual_server 10.0.0.100 80 { 
   delay_loop 6                 ##設置運行情況檢查時間,單位是秒
   lb_algo rr                   ##負載算法,這裏是rr表示輪詢  
   lb_kind DR                   ##定義模式,這裏是Direct route
   persistence_timeout 0        ##會話保存時長(秒),0表示不使用stickyness會話
   protocol TCP                 
   sorry_server 127.0.0.1 80    ##假如後端服務器都不能使用了,則訪問本機的80端口
   real_server 10.0.0.13 80 {   
       weight 1                      
        HTTP_GET {               ##以http模式檢查該服務器監控狀態
            url { 
              path /index.html   ##檢測的網頁路徑
            }
            connect_timeout 3     ##連接超時時間
            nb_get_retry 3        ##重試次數
            delay_before_retry 3  ##每次重試前等待延遲時間
        }       
   }
   real_server 10.0.0.14 80 {    
       weight 1
        HTTP_GET {
            url { 
              path /index.html
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }        
   }
}

注:如果要配置非搶佔模式,則兩個都爲BACKUP:
    state BACKUP
    nopreempt   ##這一句一定要加上去


4、啓動keepalive服務,由於主調度器的優先級比從調度器的要高,所以vip在主機LVS-1上。


主機LVS-1(主LVS調度器

[root@lvs-1 ~]# systemctl restart keepalived

[root@lvs-1 ~]# systemctl status keepalived

keepalived.service - LVS and VRRP High Availability Monitor

   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)

   Active: active (running) since Wed 2017-10-25 23:09:44 CST; 6s ago

  Process: 1173 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)

 Main PID: 1174 (keepalived)

   CGroup: /system.slice/keepalived.service

           ├─1174 /usr/sbin/keepalived -D

           ├─1175 /usr/sbin/keepalived -D

           └─1176 /usr/sbin/keepalived -D


Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

[root@lvs-1 ~]# ip addr

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:1d:7a:63 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.11/24 brd 10.0.0.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 10.0.0.100/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::f87c:449f:eb4a:ba03/64 scope link 

       valid_lft forever preferred_lft forever



主機LVS-2(從LVS調度器)

[root@lvs-2 ~]# systemctl restart keepalived   

[root@lvs-2 ~]# systemctl status keepalived   

keepalived.service - LVS and VRRP High Availability Monitor

   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)

   Active: active (running) since Wed 2017-10-25 23:13:46 CST; 2s ago

  Process: 1189 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)

 Main PID: 1190 (keepalived)

   CGroup: /system.slice/keepalived.service

           ├─1190 /usr/sbin/keepalived -D

           ├─1191 /usr/sbin/keepalived -D

           └─1192 /usr/sbin/keepalived -D


Oct 25 23:13:46 lvs-2 Keepalived_healthcheckers[1191]: Activating healthchecker for service [10.0.0.100]:80

Oct 25 23:13:46 lvs-2 Keepalived_healthcheckers[1191]: Activating healthchecker for service [10.0.0.100]:80

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Registering Kernel netlink reflector

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Registering Kernel netlink command channel

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Registering gratuitous ARP shared channel

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Opening file '/etc/keepalived/keepalived.conf'.

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: VRRP_Instance(VI_1) removing protocol VIPs.

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Using LinkWatch kernel netlink reflector...

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: VRRP_Instance(VI_1) Entering BACKUP STATE

Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]

[root@lvs-2 ~]# ip addr

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:76:bf:48 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.12/24 brd 10.0.0.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::8ec5:50ac:d71:20d7/64 scope link 

       valid_lft forever preferred_lft forever

    inet6 fe80::f87c:449f:eb4a:ba03/64 scope link tentative dadfailed 

       valid_lft forever preferred_lft forever



5、正常訪問web網頁測試


    在這裏我另外開了一臺虛擬機用來做訪問web服務的,當兩臺LVS調度器都正常的時候,能夠正常訪

問到web頁面

[root@localhost ~]# curl 10.0.0.100                   
It is web1
[root@localhost ~]# curl 10.0.0.100
It is web2
[root@localhost ~]# curl 10.0.0.100
It is web1
[root@localhost ~]# curl 10.0.0.100
It is web2
[root@localhost ~]# curl 10.0.0.100
It is web1
[root@localhost ~]# curl 10.0.0.100
It is web2


6、當把主LVS調度器(即主機LVS-1)的keepalive服務停掉了之後,我們可以看到vip飄到了從調度器

(主機LVS-2)上去了。


從LVS調度器(主機LVS-2)

[root@lvs-2 ~]# systemctl status keepalived 

keepalived.service - LVS and VRRP High Availability Monitor

   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)

   Active: active (running) since Wed 2017-10-25 23:13:46 CST; 13min ago

  Process: 1189 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)

 Main PID: 1190 (keepalived)

   CGroup: /system.slice/keepalived.service

           ├─1190 /usr/sbin/keepalived -D

           ├─1191 /usr/sbin/keepalived -D

           └─1192 /usr/sbin/keepalived -D


Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.100

Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100

[root@lvs-2 ~]# ip addr

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:76:bf:48 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.12/24 brd 10.0.0.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 10.0.0.100/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::8ec5:50ac:d71:20d7/64 scope link 

       valid_lft forever preferred_lft forever

    inet6 fe80::f87c:449f:eb4a:ba03/64 scope link tentative dadfailed 

       valid_lft forever preferred_lft forever


主LVS調度器(主機LVS-1)

[root@lvs-1 ~]# systemctl stop keepalived

[root@lvs-1 ~]# systemctl status keepalived

keepalived.service - LVS and VRRP High Availability Monitor

   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)

   Active: inactive (dead)


Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100

Oct 25 23:27:09 lvs-1 Keepalived[1174]: Stopping

Oct 25 23:27:09 lvs-1 systemd[1]: Stopping LVS and VRRP High Availability Monitor...

Oct 25 23:27:09 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) sent 0 priority

Oct 25 23:27:09 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) removing protocol VIPs.

Oct 25 23:27:10 lvs-1 systemd[1]: Stopped LVS and VRRP High Availability Monitor.

[root@lvs-1 ~]# ip addr

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:1d:7a:63 brd ff:ff:ff:ff:ff:ff

    inet 10.0.0.11/24 brd 10.0.0.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::f87c:449f:eb4a:ba03/64 scope link 

       valid_lft forever preferred_lft forever


當vip從主調度器飄到從調度器上時,還能正常訪問web頁面

[root@localhost ~]# curl 10.0.0.100
It is web1
[root@localhost ~]# curl 10.0.0.100
It is web2
[root@localhost ~]# curl 10.0.0.100
It is web1
[root@localhost ~]# curl 10.0.0.100
It is web2
[root@localhost ~]# curl 10.0.0.100
It is web1
[root@localhost ~]# curl 10.0.0.100
It is web2



    這次有關LVS-DR+keepalive做高可用,實現負載均衡的實驗就寫到這了,如果有寫得不好的地方請

見諒!!!

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