天天看點

伺服器叢集之負載均衡叢集—LB Cluster (Load Balance)

什麼是負載均衡:

1.負載均衡叢集—LB Cluster (Load Balance)

當大量使用者并發通路時,将請求轉發到不同的機器止實作負載均衡。我們這裡使用lvs實作。LVS是Linux Virtual Server的簡寫,意即Linux虛拟伺服器,是一個虛拟的伺服器叢集系統。

什麼是IPVS:

        ipvs稱之為IP虛拟伺服器(IP Virtual Server,簡寫為IPVS)。是運作在LVS下的提供負載平衡功能的一種技術,工作在OSI定義的第四層,可以在編譯linux核心的時候将功能整合進去,IPVS是LVS的關鍵,因為LVS的IP負載平衡技術就是通過IPVS子產品來實作的,IPVS是LVS叢集系統的核心軟體,它的主要作用是:安裝在Director Server上,同時在Director Server上虛拟出一個IP位址,使用者必須通過這個虛拟的IP位址通路服務。這個虛拟IP一般稱為LVS的VIP,即Virtual IP。通路的請求首先經過VIP到達負載排程器,然後由負載排程器從Real Server清單中選取一個服務節點響應使用者的請求。

Director排程器:使用者請求先到達的主機。它根據工作模型與排程方法把請求轉發到真實伺服器上

RS:RealServer,真正響應使用者請求的伺服器

VIP:Virtual IP,一般為一個公網IP,是使用者直接通路的IP,此IP所在的主機不直接提供服務,是以該主機稱為Virtual Server,一般為排程器,該IP稱為VIP

DIP:Direct IP,與RS通信的IP

RIP:Real IP,真正響應使用者請求的伺服器IP

CIP:Client IP,用戶端IP

LVS的工作模型:

1、VS/NAT(Virtual Server via Network Address Translation)

用戶端請求到達Director,Director根據ipvs上生效的排程算法修改封包的目标IP為真實伺服器的RIP,然後轉發到後端的RS上,RS收到封包後建構響應封包,然後再發到Director,Director再将封包的源IP也就是RIP還原為VIP發給用戶端,這一過程與DNAT很相似。

<a href="http://s3.51cto.com/wyfs02/M02/39/18/wKiom1O2AxCCBtbgAAIkMhu-JC4821.jpg" target="_blank"></a>

NAT: 

1、RealServer應該使用私有IP位址;

2、RealServer的網關應該指向DIP;

3、RIP和DIP應該在同一個網段内;

4、進出的封包都得經過Directory,在高負載下,Directory會成為系統性能瓶頸;

5、支援端口映射;

6、RealServer可以使用任意OS;

2、VS/DR(Virtual Server via Direct Routing)

<a href="http://s3.51cto.com/wyfs02/M01/39/4E/wKiom1O35reAwVQRAAGzkyn5zTQ227.jpg" target="_blank"></a>

        因為NAT模型下Director很容易成為整個系統的瓶頸,是以DR模式下Director不再轉發響應的封包,相對于響應封包,請求封包要小的多,這樣Director就被釋放出來了。

        當請求封包到達路由後,路由會發出廣播,得到VIP的mac位址,把封包目标MAC改為VIP MAC位址并交給Director,Director根據排程算法選擇一個RealServer,把封包中的目标mac改為選擇的RealServer的mac,然後發給交換機,交換機根據封包目标mac将封包發向了RealServer,RealServer收到封包後,會檢查封包的目标IP,發現目标IP是VIP而本機沒有VIP就舍棄封包,是以RS上必須設定個VIP位址,然而這樣會導緻ARP響應沖突的,我們必須解決這個問題才能實作整個流程,解決這個問題的方法有很多,1、修改路由,使用靜态ARP,2、在RS上使用arptables,禁止響應對VIP的ARP廣播請求,3、在RS上修改其核心參數,并向VIP配置在與RIP不同的接口的别名上。常用的是第三種,不響應關于它的任何ARP請求,也不向外發送關于VIP的ARP廣播,這樣就不會導緻ARP沖突了。這時當封包到達RS時,RS會接受封包,并響應請求,但是預設情況下,響應封包的源IP是RIP,當這個封包發到Client時,用戶端檢查封包會發現源IP不是自己請求的IP,會舍棄該封包,是以RS的響應封包源IP應該是VIP,這就需要在RS中加條路由,凡是目标IP是VIP的封包,先從定義VIP那裝置出去,這樣源IP就是VIP了。響應封包發向Switch,經由Router響應使用者,不用經過Director了。這是生産環境中最常用的模型。

DR模式的特點:

1.DIP和RIP必須在同一個實體網絡中,它的轉發機制是基于Mac位址轉發

2.RIP可以使用私有位址(建議使用公網位址)

3.入站封包經過Directory,出站則由RealServer直接響應Client

4.叢集節點(Real Server)的網關一定不能指向DIP

5.不支援端口映射

6.絕大多數的作業系統都可以實作Real Server

7.比NAT模型的Director能帶動更多的RealServer

LVS排程算法:

分為兩類:靜态算法與動态算法

靜态:僅根據算法本身排程,不關心RS上的連接配接狀态      

RR(RoundRobin):輪調,所有的請求依次輪流配置設定到後端RS,如果機器性能不一緻則負載均衡失去意義。    

WRR:權重weight,不能反映伺服器的狀态,WRR在RR的基礎上加上了權重,能者多勞,性能好的多配置設定,性能差的少配置設定,比例與設定的權重值成正比。

sh:源位址哈希,持久會話。

dh:同一個用戶端請求同一個RS,相應也會通過同一個防火牆,解決防火牆的連接配接追蹤問題。 

lc(least connection):Overhead=Active*256+Inactive,計算發給overhead值小的伺服器。

wlc:預設的排程算法,Overhead=(Active*256+Inactive)/Weight

sed(shortest Expect Delay):Overhead=(Active+1)*256/Weight

nq(Never Queue)

<b>lblc:</b>(dh+lc) Locality-based Least Connection

<b>lblcr:</b>Replicated and Locality-based least Connection,可以實作緩存伺服器彼此之間互相複制緩存對象,是lblc的改進版,可以使對負載均衡的損耗降到最低。

實驗一、現在我們來實作工作于VS/NAT模型的負載均衡

我通過使用ipvsadm工具管理ipvs,先安裝程式。

yum install ipvsadm -y

ipvsadm:

ipvsadm -A|E -t|u|f service-address [-s scheduler]

添加一個叢集服務,一個服務位址必須唯一,定義方式三組合一,IP位址、端口和協定,二者選一。

這官方的翻譯有點難懂哈,其實格式就是IP:端口。

-A, --add-service

Add a virtual service. A service  address  is  uniquely  defined  by  a

triplet:  IP  address, port number, and protocol. Alternatively, a vir-

tual service may be defined by a firewall-mark.

-E:編輯

-t:tcp

-u:udp

-f:firewall mark

service-address:VIP:Port

-s:指定排程算法

-C:清空規則

-Z:重置計數器

-L:檢視

        -n

        --rate:檢視速率

        --stats:檢視狀态

        --timeout:檢視逾時資訊

        -c:顯示連接配接

example:ipvsadm -A -t 172.16.100.3:80 -s rr

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]

添加一個真實伺服器到叢集

-a, --add-server

Add a real server to a virtual service.

編輯一個叢集裡的真實伺服器

-e, --edit-server

Edit a real server in a virtual service.

從叢集删除一個伺服器

-d, --delete-server

Remove a real server from a virtual service.

-r, --real-server 指定RealServer位址

-g:dr模型(預設)

-i:tun模型

-m:nat模型

-w:weight

将一個伺服器添加到叢集:

example:ipvsadm -a -t 172.16.100.3:80 -r 192.168.10.2 -m 

從叢集删除一個伺服器:

example:ipvsadm -d -t 172.16.100.3:80 -r 192.168.10.7

儲存:

service ipvsadm save

/etc/sysconfig/ipvsadm

ipvsadm -S &gt; /paht/to/ipvsadm.rules    儲存規則

ipvsadm -R &lt; /path/to/ipvsadm.rules    恢複規則

實驗環境拓撲:

<a href="http://s3.51cto.com/wyfs02/M00/39/1C/wKioL1O2B6yR0AkvAAGcwj1erMw542.jpg" target="_blank"></a>

配置Web服務,配置IP位址這些我就省略了。

配置Director虛拟IP。

ifconfig eth0:0 192.168.1.220/24

添加一個叢集

ipvsadm -A -t 192.168.1.220:80 -s rr

添加RealServer到叢集

ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.2 -m

ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.3 -m

檢視清單

ipvsadm -L -n

<a href="http://s3.51cto.com/wyfs02/M02/39/26/wKiom1O2FPLBNhxJAAHHzS5QvFQ591.jpg" target="_blank"></a>

開啟資料包轉發功能

echo '1' &gt; /proc/sys/net/ipv4/ip_forward

現在我們用浏覽器測試,第一次通路。

<a href="http://s3.51cto.com/wyfs02/M01/39/28/wKioL1O2FczTn2ttAAE-6tdxf5Y400.jpg" target="_blank"></a>

測試第二次通路。

<a href="http://s3.51cto.com/wyfs02/M01/39/28/wKiom1O2FhuhXMslAAE4vc_7Wgw606.jpg" target="_blank"></a>

檢視狀态

ipvsadm -L -n --stats

<a href="http://s3.51cto.com/wyfs02/M02/39/2C/wKiom1O2F3rBMJVeAAHUkTzfb1Q203.jpg" target="_blank"></a>

由此可以看出他們的連接配接都是平均的。

現在我們換一個排程算法。

ipvsadm -E -t 192.168.1.220:80 -s wrr

修改伺服器權重

ipvsadm -e -t 192.168.1.220:80 -r 172.16.1.2 -m -w 2

<a href="http://s3.51cto.com/wyfs02/M01/39/35/wKiom1O2JeDSSM_KAAIVKeJBdM8531.jpg" target="_blank"></a>

實驗二、實作工作于VS/DR模型的負載均衡

環境拓撲:

<a href="http://s3.51cto.com/wyfs02/M00/39/52/wKioL1O4mNSy0mibAAGsGotJ2Uk847.jpg" target="_blank"></a>

配置兩台Web伺服器,已經配置IP位址,過程我就省略了。

RealServer的配置:

echo 1 &gt; /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 &gt; /proc/sys/net/ipv4/conf/lo/arp_announce

echo 1 &gt; /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 &gt; /proc/sys/net/ipv4/conf/all/arp_announce

ifconfig lo:0 192.168.1.200  broadcast 192.168.1.200 netmask 255.255.255.255 up

route add -host 192.168.1.200 dev lo:0

Director配置:

ifconfig eth0:1 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up

route add -host 192.168.1.200 dev eth0:1

iptables -F

iptables -Z

ipvsadm -C

ipvsadm -A -t 192.168.1.200:80 -s wlc

ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.10 -g -w 2

ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.11 -g -w 3

<a href="http://s3.51cto.com/wyfs02/M01/39/53/wKioL1O4wTyD0hIVAAG4TaDoSsg794.jpg" target="_blank"></a>

進行壓力測試,檢視狀态。

<a href="http://s3.51cto.com/wyfs02/M01/39/54/wKioL1O4xvChGVn2AALF2-qFDyA709.jpg" target="_blank"></a>

LVS Persistent 

    由于http是無狀态的連接配接,客戶每次請求會被當做新請求,比如我們登入了一個論壇,以重新整理頁面,伺服器會把你當新通路,你還得重新登入,這樣很不友善,尤其在電子商務類的網站上,好不容易選了好多商品準備付款,重新整理了一次或者網頁跳轉了一次資訊都丢失了。為了追蹤客戶的狀态,才有了cookies 和session。cookies是什麼?它是動态網站發給每個用戶端的一個識别碼SessionID,識别碼是有有效期的。session中文意思是會話,伺服器端發給用戶端一個識别碼,伺服器端會也會把這個識别碼儲存到檔案上,這個檔案包含了用戶端的識别碼與一些用戶端通路過頁面的資訊,是以我們登入論壇後,伺服器會給我們發一個SessionID,浏覽器會自己儲存下來,當我們再次通路的時候,httpd請求首部會包含你的SessionID,伺服器收到請求封包後會檢視該SessionID,如果伺服器上有該sessionID并在有效期内,則驗證通過,剛才的通路狀态還會存在,如果登入資訊,比如購物車中的商品。

但是負載均衡以後,用戶端請求可能被排程到不同的RealServer,而其他的RealServer中并沒有該用戶端的Session認證檔案,這樣就又無法追蹤客戶狀态了,是以LVS引入了持久連接配接,它會啟用一段記憶體空間生成一個hash表用來儲存用戶端與伺服器的請求狀态,凡是來自同一個IP的用戶端都會被排程同一個RealServer,當然這個持久連接配接是有有效期的。持久連接配接有三種:

PCC Persistent client connections 持久用戶端連接配接,将IP的所有請求都轉發到一個RS。

定義方式:

ipvsadm -A -t 172.16.1.3:0 -s rr -p

ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.2 -g

ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.3 -g

這裡端口寫的是0,表示所有端口請求都定義到一個伺服器。

PPC persistent port connections  将IP中的一個服務轉發到一個RS

PFM—— 基于防火牆标記的持久連接配接,可以将幾個服務定義為同一種标記轉發。  

iptables為定義的服務封包打上防火牆标記,凡是有該防火牆标記的服務請求LVS都會根據他們的來源IP把他們排程到同一個RS上。

要想實作給一個資料包打标,需要在mangle表的PREROUTING鍊上實作。

example:

iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 80 -j MARK --set-mark 10 (0-99)均可

iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 443 -j MARK --set-mark 10

在定義叢集的時候,則可以使用-f選項。

ipvsadm -A -f 10 -s rr -p 

實驗三、建構一個DR模型的叢集,VIP與RIP不在同一個子網内,并且使用防火牆标記的持久連接配接,來實作同一個IP來通路時,http與https的請求都發往一個RS。

<a href="http://s3.51cto.com/wyfs02/M00/39/5B/wKioL1O5h7HQK8qsAAGPQ6Q4qkQ084.jpg" target="_blank"></a>

配置Web伺服器,和配置https,我這裡就省略了。

RealServer配置核心參數,配置VIP。

Director配置IP。

ifconfig eth0 172.16.0.100/16 

route add -net default gw 172.16.0.1

Director配置防火牆标記。

iptables -t mangle -A PREROUTING -d 192.168.1.200 -p tcp --dport 80 -j MARK --set-mark 6

iptables -t mangle -A PREROUTING -d 192.168.1.200 -p tcp --dport 443 -j MARK --set-mark 6

Director配置VIP和主機路由。

echo 1 &gt;  /proc/sys/net/ipv4/ip_forward

Director配置IPVSec

ipvsadm -A -f 6 -s rr -p

ipvsadm -a -f 6 -r 172.16.0.12 -g

ipvsadm -a -f 6 -r 172.16.0.11 -g

注意如果路由不知道如何找到VIP,可以在路由上加一條規則。

route add -host 192.168.1.200 gw 172.16.0.100

這時我們來測試下,通路www.tuchao.com。

<a href="http://s3.51cto.com/wyfs02/M01/39/5B/wKioL1O5hmCQYL29AAFkm2mrXD0135.jpg" target="_blank"></a>

換成https協定再測試

<a href="http://s3.51cto.com/wyfs02/M02/39/5B/wKioL1O5hqfQUuN1AAFGPpfihUo448.jpg" target="_blank"></a>

哈,實驗成功,這就完成了基于防火牆标記的持久連接配接,實作了當一個IP請求http與https,lvs都會轉發給一台RealServer。

太晚了,明天還要上班,以後這篇文章我以後還會再做完善。

有問題歡迎與我交流QQ1183710107

本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1434362

繼續閱讀