天天看點

lvs+nginx負載均衡

1       學習目标

掌握什麼是負載均衡及負載均衡的作用和意義。

了解lvs負載均衡的三種模式。

了解lvs-DR負載均衡部署方法。

掌握nginx實作負載均衡的方法。

掌握lvs+nginx負載均衡拓撲結構。

2       負載均衡方案

2.1    什麼是負載均衡

         一台普通伺服器的處理能力是有限的,假如能達到每秒幾萬個到幾十萬個請求,但卻無法在一秒鐘内處理上百萬個甚至更多的請求。但若能将多台這樣的伺服器組成一個系統,并通過軟體技術将所有請求平均配置設定給所有伺服器,那麼這個系統就完全擁有每秒鐘處理幾百萬個甚至更多請求的能力。這就是負載均衡最初的基本設計思想。

         負載均衡是由多台伺服器以對稱的方式組成一個伺服器集合,每台伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助。通過某種負載分擔技術,将外部發送來的請求按照某種政策配置設定到伺服器集合的某一台伺服器上,而接收到請求的伺服器獨立地回應客戶的請求。負載均衡解決了大量并發通路服務問題,其目的就是用最少的投資獲得接近于大型主機的性能。 

lvs+nginx負載均衡

2.2    相關技術

2.2.1  基于DNS的負載均衡

         DNS(Domain Name System,域名系統),網際網路上作為域名和IP位址互相映射的一個分布式資料庫,能夠使使用者更友善的通路網際網路,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機名對應的IP位址的過程叫做域名解析(或主機名解析)。DNS協定運作在UDP協定之上,使用端口号53。

         DNS負載均衡技術是最早的負載均衡解決方案,它是通過DNS服務中的随機名字解析來實作的,在DNS伺服器中,可以為多個不同的位址配置同一個名字,而最終查詢這個名字的客戶機将在解析這個名字時得到其中的一個位址。是以,對于同一個名字,不同的客戶機會得到不同的位址,它們也就通路不同位址上的Web伺服器,進而達到負載均衡的目的。

如下圖:

lvs+nginx負載均衡

優點:實作簡單、實施容易、成本低、适用于大多數TCP/IP應用;

缺點:

1、 負載配置設定不均勻,DNS伺服器将Http請求平均地配置設定到背景的Web伺服器上,而不考慮每個Web伺服器目前的負載情況;如果背景的Web伺服器的配置和處理能力不同,最慢的Web伺服器将成為系統的瓶頸,處理能力強的伺服器不能充分發揮作用;

2、可靠性低,如果背景的某台Web伺服器出現故障,DNS伺服器仍然會把DNS請求配置設定到這台故障伺服器上,導緻不能響應用戶端。

3、變更生效時間長,如果更改NDS有可能造成相當一部分客戶不能享受Web服務,并且由于DNS緩存的原因,所造成的後果要持續相當長一段時間(一般DNS的重新整理周期約為24小時)。

2.2.2  基于四層交換技術的負載均衡

         基于四層交換技術的負載均衡是通過封包中的目标位址和端口,再加上負載均衡裝置設定的伺服器選擇方式,決定最終選擇的内部伺服器與請求用戶端建立TCP連接配接,然後發送Client請求的資料。

lvs+nginx負載均衡

         client發送請求至4層負載均衡器,4層負載均衡器根據負載政策把client發送的封包目标位址(原來是負載均衡裝置的IP位址)修改為後端伺服器(可以是web伺服器、郵件服務等)IP位址,這樣client就可以直接跟後端伺服器建立TCP連接配接并發送資料。

具有代表意義的産品:LVS(開源軟體),F5(硬體)

優點:性能高、支援各種網絡協定

缺點:對網絡依賴較大,負載智能化方面沒有7層負載好(比如不支援對url個性化負載),F5硬體性能很高但成本也高需要人民币幾十萬,對于小公司就望而卻步了。

2.2.3  基于七層交換技術的負載均衡

         基于七層交換技術的負載均衡也稱内容交換,也就是主要通過封包中的真正有意義的應用層内容,再加上負載均衡裝置設定的伺服器選擇方式,決定最終選擇的伺服器。

lvs+nginx負載均衡

         七層負載均衡伺服器起了一個代理伺服器的作用,client要通路webserver要先與七層負載裝置進行三次握手後建立TCP連接配接,把要通路的封包資訊發送給七層負載均衡;然後七層負載均衡再根據設定的均衡規則選擇特定的webserver,然後通過三次握手與此台webserver建立TCP連接配接,然後webserver把需要的資料發送給七層負載均衡裝置,負載均衡裝置再把資料發送給client。

具有代表意義的産品:nginx(軟體)、apache(軟體)

優點:對網絡依賴少,負載智能方案多(比如可根據不同的url進行負載)

缺點:網絡協定有限,nginx和apache支援http負載,性能沒有4層負載高

2.3    确定使用四層+七層負載結合方案

四層負載使用lvs軟體或F5硬體實作。

七層負載使用nginx實作。

如下圖是lvs+nginx的拓撲結構:

lvs+nginx負載均衡

2.4    nginx叢集背景

在keepalived+nginx的主備容災高可用的架構中,nginx是作為外部通路系統的唯一入口,理論上一台nginx的最大并發量可以高達50000,但是當并發量更大的時候,keepalived+nginx的高可用機制是沒辦法滿足需求的,因為keepalived+nginx的架構中确确實實是一台nginx在工作,隻有當master當機或異常時候,備份機才會上位。那麼如何解決更大的高并發問題呢,也許會問能不能搭建nginx叢集,直接對外提供通路?

很顯然這是欠妥當的,因為當nginx作為外部的唯一通路入口,沒辦法直接以叢集的形式對外提供服務,沒有那麼多的公網ip資源可用,既太浪費也不友好。但是在内網環境下,是可以用nginx叢集(nginx橫向擴充服務集合)的,當然總得有一個對外入口,是以需要在nginx叢集之上,在加一層負載均衡器,作為系統的唯一入口。

3       lvs實作四層負載DR模式(了解)

3.1    什麼是lvs

         LVS是Linux Virtual Server的簡寫,意即Linux虛拟伺服器,是一個虛拟的伺服器叢集系統。本項目在1998年5月由章文嵩博士成立,是中國國内最早出現的自由軟體項目之一。

3.2    lvs實作負載的三種方式

         運作 lPVS軟體的伺服器,在整個負載均衡叢集中承擔一排程角色 軟體的伺服器,(即 向真實伺服器配置設定從用戶端過來的請求。LVS中的排程方法有三種 :NAT(Network Address Translation網絡位址轉換)、TUN(tunnel 隧道)、DR(direct route 直接路由)

3.2.1  LVS-DR 模式

lvs+nginx負載均衡

         請求由LVS接受,由真實提供服務的伺服器(RealServer, RS)直接傳回給使用者,傳回的時候不經過LVS。

        DR模式下需要LVS伺服器和RS綁定同一個VIP, 一個請求過來時,LVS隻需要将網絡幀的MAC位址修改為某一台RS的MAC,該包就會被轉發到相應的RS處理,注意此時的源IP和目标IP都沒變,RS收到LVS轉發來的包,發現MAC是自己的,發現IP也是自己的,于是這個包被合法地接受,而當RS傳回響應時,隻要直接向源IP(即使用者的IP)傳回即可,不再經過LVS。

         DR模式下,lvs接收請求輸入,将請求轉發給RS,由RS輸出響應給使用者,性能非常高。

它的不足之處是要求負載均衡器與RS在一個實體段上。

3.2.2  LVS-NAT模式

lvs+nginx負載均衡

         NAT(Network Address Translation)是一種外網和内網位址映射的技術。NAT模式下,LVS需要作為RS的網關,當網絡包到達LVS時,LVS做目标位址轉換(DNAT),将目标IP改為RS的IP。RS接收到包以後,處理完,傳回響應時,源IP是RS IP,目标IP是用戶端的IP,這時RS的包通過網關(LVS)中轉,LVS會做源位址轉換(SNAT),将包的源位址改為VIP,對于用戶端隻知道是LVS直接傳回給它的。

         NAT模式請求和響應都需要經過lvs,性能沒有DR模式好。

3.2.3  LVS-TUN模式

lvs+nginx負載均衡

         TUN模式是通過ip隧道技術減輕lvs排程伺服器的壓力,許多Internet服務(例如WEB伺服器)的請求包很短小,而應答包通常很大,負載均衡器隻負責将請求包分發給實體伺服器,而實體伺服器将應答包直接發給使用者。是以,負載均衡器能處理很巨大的請求量。相比NAT性能要高的多,比DR模式的優點是不限制負載均衡器與RS在一個實體段上。但是它的不足需要所有的伺服器(lvs、RS)支援"IP Tunneling"(IP Encapsulation)協定。

3.3    lvs-DR環境

vip:192.168.101.100

lvs-director:192.168.101.8

nginx1:192.168.101.3

nginx2:192.168.101.4

3.4    lvs排程伺服器Director安裝

3.4.1  安裝lvs

在192.168.101.8上安裝lvs

centos6.5自帶lvs,檢查linux核心是否內建lvs子產品:

modprobe -l | grep ipvs

lvs+nginx負載均衡

3.4.2  安裝lvs的管理工具ipvsadm

  • 安裝依賴

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*

  •   安裝ipvsadm

将ipvsadm-1.26.tar.gz拷貝至/usr/local/下

cd /usr/local

tar -zxvf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make

make install       

校驗是否安裝成功:

lvs+nginx負載均衡

3.5    真實伺服器Real Server安裝

在192.168.101.3和192.168.101.4上安裝nginx。

3.5.1  nginx配置檔案

建立nginx-lvs.conf,http内容如下:

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

 

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }

    }      

3.6    Director Server配置

3.6.1  在eth0上綁定虛拟ip

ifconfig eth0:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up       

此處在eth0裝置上綁定了一個虛拟裝置eth0:0,同時設定了一個虛拟IP是192.168.101.100,然後指定廣播位址也為192.168.101.100,需要特别注意的是,虛拟ip位址的廣播位址是它本身,子網路遮罩是255.255.255.255。

lvs+nginx負載均衡

3.6.2  添加路由規則

route add -host 192.168.101.100 dev eth0:0      

3.6.3  啟用系統的包轉發功能

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

參數值為1時啟用ip轉發,為0時禁止ip轉發。

3.6.4  清除原有轉發規則

ipvsadm --clear      

3.6.5  添加虛拟IP規則

ipvsadm -A -t 192.168.101.100:80 -s rr      

-s rr表示采用輪詢政策。

:80表示負載轉發的端口是80

3.6.6  在虛拟IP中添加服務規則

ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.3:80 -g

ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.4:80 -g       

在新加虛拟IP記錄中添加兩條新的Real Server記錄,-g表示指定LVS 的工作模式為直接路由模式。

lvs進行負載轉發需要保證lvs負載的端口要和nginx服務的端口的一緻,這裡都為80。

3.6.7  重新開機lvs

ipvsadm

lvs+nginx負載均衡

3.7    Real Server配置

         在lvs的DR和TUn模式下,使用者的通路請求到達真實伺服器後,是直接傳回給使用者的,而不再經過前端的Director Server,是以,就需要在每個Real server節點上增加虛拟的VIP位址,這樣資料才能直接傳回給使用者。

3.7.1  在回環裝置上綁定了一個虛拟IP位址

ifconfig lo:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up

/sbin/route add -host 192.168.101.100 dev lo:0      
lvs+nginx負載均衡

3.7.2  關閉arp解析

arp_announce :定義不同級别:當ARP請求通過某個端口進來是否利用這個接口來回應。

         0 -利用本地的任何位址,不管配置在哪個接口上去響應ARP請求;

         1 - 避免使用另外一個接口上的mac位址去響應ARP請求;

         2 - 盡可能使用能夠比對到ARP請求的最佳位址。

arp_ignore:當ARP請求發過來後發現自己正是請求的位址是否響應;

            0 - 利用本地的任何位址,不管配置在哪個接口上去響應ARP請求;

            1 - 哪個接口上接受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 

sysctl -p #使用修改生效      

 sysctl -p #使用修改生效

lvs+nginx負載均衡

3.8    測試

3.8.1  預期目标

由于lvs設定為rr輪詢政策,當通路虛IP http://192.168.101.100,每次重新整理請求通過lvs負載到不同的伺服器。

3.8.2  注意事項

1、測試時需要在nginx的http中設定keepalive_timeout  0; 取消使用http持久連接配接模式,保證每次用戶端發起請求都需要向服務端建立連接配接,這樣做是為了每次重新整理頁面都要經過lvs負載轉發。

2、lvs進行負載轉發需要保證lvs負載的端口要和nginx服務的端口的一緻,這裡都為80。

keepalive_timeout說明:

在nginx中keepalive_timeout的預設值是75秒,預設使用http持久連接配接模式,可使用戶端到伺服器端的連接配接持續有效,當出現對伺服器的後繼請求時,可避免建立或重建立立連接配接。生産環境建議keepalive_timeout不要設定為0。

3.8.3  測試過程

修改192.168.101.3和192.168.101.4下html目錄中index.html的内容使之個性化。

第一次請求:http://192.168.101.100

lvs+nginx負載均衡

重新整理,相當于第二次請求:

lvs+nginx負載均衡

依次交替測試,發現每次請求被負載到不同的nginx上。

任意停止掉一個nginx,請求http://192.168.101.100繼續可以浏覽,由于lvs采用輪詢政策如果其中一個nginx請求不可到達則去請求另外的nginx。

3.9    腳本封裝

為了友善配置啟動lvs将上邊Director Server和Real Server的配置過程封裝在shell腳本中。

3.9.1  Director Server配置

在/etc/init.d下建立lvsdr,内容如下:

#!/bin/sh
# 定義虛拟ip
VIP=192.168.101.100 #虛拟 ip根據需求修改
# 定義realserver,并已空格分開,根據需求修改
RIPS="192.168.101.3 192.168.101.4"

# 定義提供服務的端口
SERVICE=80

# 調用init.d腳本的标準庫
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "Start LVS of DR Mode"
        # 開啟ip轉發
        echo "1" > /proc/sys/net/ipv4/ip_forward
        # 綁定虛拟ip
        ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        route add -host $VIP dev eth0:0
        # 清除lvs規則
        ipvsadm -C
        # 添加一條虛拟伺服器記錄
    # -p指定一定的時間内将相同的用戶端配置設定到同一台後端伺服器
    # 用于解決session的問題,測試時或有别的解決方案時建議去掉
        ipvsadm -A -t $VIP:$SERVICE -s rr

        # 添加真實伺服器記錄
        for RIP in $RIPS
    do
        echo $RIP:$SERVICE;
                ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
        done
        # 設定tcp tcpfin  udp的逾時連接配接值
        ipvsadm --set 30 120 300
        ipvsadm
        ;;

        stop)
        echo "Stop LVS DR"
        ifconfig eth0:0 down
        ipvsadm -C
        ;;
        *)
        echo "Usage:$0 {start ¦ stop}"
        exit 1
esac      

修改腳本權限:chmod +x /etc/init.d/lvsdr

啟動Director server:service lvsdr start

停止Director server:service lvsdr stop

3.9.2  Real Server配置

#!/bin/sh
VIP=192.168.101.100 #虛拟ip,根據需求修改
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "lo:0 port starting"
        # 為了相應lvs排程器轉發過來的包,需在本地lo接口上綁定vip
        ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        # 限制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
        ;;
        stop)
        echo "lo:0 port closing"
        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
        ;;
        *)
        echo "Usage: $0 {start ¦ stop}"
        exit 1
esac      

啟動real server:service lvsdr start

停止real server:service lvsdr stop

4       nginx實作七層負載

參考nginx教案。

5       lvs四層+nginx七層負載均衡

5.1    需求

         lvs采用DR模式基本上沒有性能瓶頸,使用者請求輸入至lvs經過負載轉發到背景服務上,通過背景服務輸出響應給使用者。nginx的負載性能遠沒有lvs好,lvs四層+nginx七層負載的好處是最前端是lvs接收請求進行負載轉發,由多個nginx共同完成七層負載,這樣nginx的負載性能就可以線性擴充。

5.2    準備環境

nginx1:192.168.101.3                              安裝nginx

nginx2:192.168.101.4                              安裝nginx

tomcat1:192.168.101.5                           安裝tomcat

tomcat2:192.168.101.6                           安裝tomcat

5.3    配置

5.3.1  Director Server配置

參考lvs四層負載DR模式進行配置

5.3.2  Real Server配置

參考lvs四層負載DR模式進行配置,需要修改nginx的配置檔案使每個nginx對兩個tomcat進行負載,如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

   upstream tomcat_server_pool{
        server 192.168.101.5:8080 weight=10;
        server 192.168.101.6:8080 weight=10;
        }

    server {
        listen 80;
        server_name localhost;
        location / {
                 proxy_pass http://tomcat_server_pool;
                 index index.jsp index.html index.htm;
        }
    }
      
    }       

5.4    測試

請求http://192.168.101.100,lvs負載到不同的nginx上,如果停止任意一台nginx或停止任意一台tomcat不影響通路。

6       lvs高可用(了解)

6.1    什麼是高可用

         lvs作為負載均衡器,所有請求都先到達lvs,可見lvs處于非常重要的位置,如果lvs伺服器當機後端web服務将無法提供服務,影響嚴重。

         為了屏蔽負載均衡伺服器的當機,需要建立一個備份機。主伺服器和備份機上都運作高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的運作狀況。當備份機不能在一定的時間内收到這樣的資訊時,它就接管主伺服器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP位址,這樣的主伺服器就開始再次提供負載均衡服務。

6.2    keepalived+lvs實作主備

6.2.1  什麼是keepalived

         keepalived是叢集管理中保證叢集高可用的一個服務軟體,用來防止單點故障。

        Keepalived的作用是檢測web伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動将web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的web伺服器。

6.2.2  keepalived工作原理

         keepalived是以VRRP協定為實作基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛拟路由備援協定。

         虛拟路由備援協定,可以認為是實作路由器高可用的協定,即将N台提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在區域網路内其他機器的預設路由為該vip),master會發多點傳播,當backup收不到VRRP包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。

         keepalived主要有三個子產品,分别是core、check和VRRP。core子產品為keepalived的核心,負責主程序的啟動、維護以及全局配置檔案的加載和解析。check負責健康檢查,包括常見的各種檢查方式。VRRP子產品是來實作VRRP協定的。

詳細參考:Keepalived權威指南中文.pdf

6.2.3  keepalived+lvs實作主備過程

6.2.3.1 初始狀态

lvs+nginx負載均衡

6.2.3.2 主機當機

lvs+nginx負載均衡

6.2.3.3 主機恢複

lvs+nginx負載均衡

6.2.4  準備環境

lvs-director:192.168.101.8   主lvs

lvs-director:192.168.101.9   備lvs

6.2.5  安裝keepalived

分别在主備lvs上安裝keepalived,參考“安裝手冊”進行安裝:

6.2.6  配置keepalived

6.2.6.1 主lvs

修改主lvs下/etc/keepalived/keepalived.conf檔案

! Configuration File for keepalived

global_defs {
   notification_email {
    #[email protected]                                   # 發生故障時發送的郵箱
   }
   #notification_email_from [email protected]             # 使用哪個郵箱發送
   #smtp_server xxx.com                                  # 發件伺服器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER             # 标示為主lvs
    interface eth0           # HA檢測端口
    virtual_router_id 51     # 主備的virtual_router_id 必須相同
    priority 100             # 優先級,備lvs要比主lvs稍小
    advert_int 1             # VRRP Multicast 廣播周期秒數
    authentication {         # 定義認證
        auth_type PASS       # 認證方式為密碼認證
        auth_pass 1111       # 定義密碼
    }
    virtual_ipaddress {      # 定義vip
        192.168.101.100        # 多個vip可換行添加
    }
}

virtual_server 192.168.101.100 80 {
    delay_loop 6       # 每隔6秒檢視realserver狀态
    lb_algo wlc        # 排程算法為權重最小連接配接數
    lb_kind DR         # lvs工作模式為DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50  # 同一IP 的連接配接50秒内被配置設定到同一台realserver(測試時建議改為0)
    protocol TCP            # 用TCP監測realserver的狀态

    real_server 192.168.101.3 80 {       # 定義realserver
        weight 3                       # 定義權重
        TCP_CHECK {  # 注意TCP_CHECK和{之間的空格,如果沒有的話隻會添加第一個realserver
            connect_timeout 3          # 三秒無響應逾時
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.101.4 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}      

6.2.6.2 備lvs

修改備lvs下/etc/keepalived/keepalived.conf檔案

配置備lvs時需要注意:需要修改state為BACKUP , priority比MASTER低,virtual_router_id和master的值一緻

! Configuration File for keepalived

global_defs {
   notification_email {
    #[email protected]                                   # 發生故障時發送的郵箱
   }
   #notification_email_from [email protected]             # 使用哪個郵箱發送
   #smtp_server xxx.com                                  # 發件伺服器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP             # 标示為備lvs
    interface eth0           # HA檢測端口
    virtual_router_id 51     # 主備的virtual_router_id 必須相同
    priority 99              # 優先級,備lvs要比主lvs稍小
    advert_int 1             # VRRP Multicast 廣播周期秒數
    authentication {         # 定義認證
        auth_type PASS       # 認證方式為密碼認證
        auth_pass 1111       # 定義密碼
    }
    virtual_ipaddress {      # 定義vip
        192.168.101.100        # 多個vip可換行添加
    }
}

virtual_server 192.168.101.100 80 {
    delay_loop 6       # 每隔6秒檢視realserver狀态
    lb_algo wlc        # 排程算法為權重最小連接配接數
    lb_kind DR         # lvs工作模式為DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50  # 同一IP 的連接配接50秒内被配置設定到同一台realserver(測試時建議改為0)
    protocol TCP            # 用TCP監測realserver的狀态

    real_server 192.168.101.3 80 {       # 定義realserver
        weight 3                       # 定義權重
        TCP_CHECK {  # 注意TCP_CHECK和{之間的空格,如果沒有的話隻會添加第一個realserver
            connect_timeout 3          # 三秒無響應逾時
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.101.4 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}       

6.2.7  測試

6.2.7.1 啟動

  • director Server啟動:

注意:使用keepalived就不用手動配置啟動lvs,在主、備lvs上啟動keepalived即可。

主備lvs(192.168.101.8、192.168.101.9)都啟動keepalived。

service keepalived start       
  • real server啟動:

192.168.101.3、192.168.101.4啟動nginx和lvs的realserver配置

cd /usr/local/nginx/sbin

./nginx -c /usr/local/nginx/conf/nginx-lvs.conf      

啟動lvs的realserver配置:

service lvsdr start      

注意:real server的lvs配置需要使用lvsdr腳本。

  • tomcat 啟動

6.2.7.2 初始狀态

檢視主lvs的eth0設定:

vip綁定在主lvs的eth0上。

lvs+nginx負載均衡

查詢lvs狀态:

lvs+nginx負載均衡

檢視備lvs的eth0設定:

vip沒有綁定在備lvs的eth0上。

lvs+nginx負載均衡

通路http://192.168.101.100,可以正常負載。

6.2.7.3 主機當機

将主lvs的keepalived停止或将主lvs關機(相當于模拟當機),檢視主lvs的eth0:

eth0沒有綁定vip

lvs+nginx負載均衡

檢視備lvs的eth0:

vip已經漂移到備lvs。

lvs+nginx負載均衡

6.2.7.4 主機恢複

将主lvs的keepalived啟動。

檢視主lvs的eth0:

vip漂移到主lvs。

lvs+nginx負載均衡
lvs+nginx負載均衡

6.3    keepalived+lvs實作雙主

         上邊主備方案是目前隻有一台lvs工作,這造成資源浪費,可以采用雙主結構,讓兩台lvs目前都進行工作,采用dns輪詢方式,當使用者通路域名通過dns輪詢每台lvs,雙主結構需要兩個vip,這兩個vip要綁定域名。

         同樣,在每台lvs上安裝keepalived軟體,當keepalived檢測到其中一個lvs當機則将當機的vip漂移到活動lvs上,當lvs恢複則vip又重新漂移回來。

6.3.1.1 初始狀态

         每台lvs綁定一個vip,共兩個vip,DNS設定域名對應這兩個vip,通過DNS輪詢每次解析到不同的vip上即解析到不同的lvs上。

lvs+nginx負載均衡

6.3.1.2 其中一個主機當機

         其中一個主機當機,每台lvs上安裝的keepalived程式會檢測到對方當機,将當機一方的vip漂移至活動的lvs伺服器上,這樣DNS輪詢全部到一台lvs繼續對外提供服務。

lvs+nginx負載均衡

6.3.1.3 主機恢複

當主機恢複又回到初始狀态,每個vip綁定在不同的lvs上。

lvs+nginx負載均衡

6.4    lvs擴充的思考

         前端使用1到2台lvs作為負載基本可以滿足中小型網站的并發要求,當lvs的負載成為瓶頸此時就需要對lvs進行優化、擴充。

  • 方案1:LVS-ospf叢集

         OSPF(Open Shortest Path First開放式最短路徑優先)是一個内部網關協定(Interior Gateway Protocol,簡稱IGP),用于在單一自治系統(autonomous system,AS)内決策路由。

LVS(DR)通過ospfd,做lvs叢集,實作一個VIP,多台LVS同時工作提供服務,這種方案需要依賴三層交換機裝置實作。

lvs+nginx負載均衡

         使用者請求(VIP:42.xx.xx.100)到達三層交換機之後,通過對原位址、端口和目的位址、端口的hash,将連結配置設定到叢集中的某一台LVS上,LVS通過内網(10.101.10.x)向後端轉發請求,後端再将資料傳回給使用者。

LVS-ospf叢集模式的最大優勢就在于:

1.LVS排程機自由伸縮,橫向線性擴充(最大8台,受限于三層裝置允許的等價路由數目maximum load-balancing);

2.LVS機器同時工作,不存在備機,提高使用率;

3.做到了真正的高可用,某台LVS機器當機後,不會影響服務

  • 方案2:DNS輪詢

上面講的是一組雙主結構,可以采用多組雙主結構達到橫向擴充lvs的目的,此方案需要每台lvs都綁定一個vip(公網ip),DNS設定域名輪詢多個vip,如下圖:

lvs+nginx負載均衡
  • 方案3:使用硬體負載均衡設定 

         如果資金允許可以購買硬體設定來完成負載均衡,性能不錯的有F5、Array等都可以滿足超高并發的要求。