天天看點

LVS的DR模式和持久連接配接

###############################

叢集的定義和分類

LVS簡介和基本使用

LVS工作模型和排程算法

DR模型的實作

LVS的持久連接配接

一、叢集的定義

叢集(cluster)技術是一種較新的技術,通過叢集技術,可以在付出較低成本的情況下獲得在性能、可靠性、靈活性方面的相對較高的收益,其任務排程則是叢集系統中的核心技術。

二、叢集的分類

1、Scale ON(向上擴充)

實體擴充,提高硬體參數

缺點:硬體的參數增長比例所帶來的性能提升,不是線性的,價格往往高于硬體參數的倍數,并且CPU數量越多,仲裁機制消耗的資源就越大。

2、Scale Out 向外擴充 數量擴充

增加伺服器數量

優點:在不影響業務的情況下,可以實作動态的線上擴容,每台伺服器的費用可以成正比的轉化為性能。

High Availability()

保證服務永久線上可用的叢集,通過健康檢測機制,大幅度的增強服務的可用性,HA叢集中一個資源隻能被一個節點占用,節點數通常為奇數。

可用性衡量标準=線上時間/(線上時間+故障處理時間)

Load Balancing(負載均衡叢集)

那使用者的請求均攤到多台伺服器上的機制叫做負載均衡,主要是增加處理能力。

排程算法:論調(Round Robin)、權重(WRR)等……

硬體

F5 BIG IP

Citrix Netscaler

A10 AX系列

軟體

四層 不能處理應用層協定,工作性能好,支援的功能特性有限 LVS

七層 可以過濾和修改應用層協定,性能略差于四層裝置 Nginx、Haproxy

High Performance

科學叢集是并行計算的基礎。通常,科學叢集涉及為叢集開發的并行應用程式,以解決複雜的科學問題。科學叢集對外就好像一個超級計算機,這種超級計算機内部由十至上萬個獨立處理器組成,并且在公共消息傳遞層上進行通信以運作并行應用程式。

一、LVS簡介

LVS工作在核心空間的TCP/IP協定棧上,LVS監控在INPUT鍊上,當使用者請求的是叢集服務(套接字),ipvs鈎子函數會根據定義的規則修改請求并送至POSTROUTING鍊上,LVS和iptbles不能同時使用。

ipvsadm是工作在使用者空間的規則編寫的指令行工具

ipvs是工作在核心空間INPUT鍊上的鈎子函數

注意:排程器的實作基于套接字(IP+port),是以一個排程器可以排程多個不同類型的服務,但通常排程能力有限,通常都為一種服務實作叢集排程功能。

二、ipvsadm的用法

ipvsadm管理叢集服務

1

2

3

4

5

6

7

8

<code>添加 -A - t|u|f  service-address [-s scheduler]預設排程算法是wlc</code>

<code>        </code><code>-t  TCP 協定的叢集</code>

<code>        </code><code>-u  UDP 協定的叢集</code>

<code>            </code><code>service-address IP:PORT</code>

<code>        </code><code>-f  FireWallMark    LVS持久連接配接</code>

<code>            </code><code>service-address MarkNumber</code>

<code>修改 -E</code>

<code>删除 -D - t|u|f service-address</code>

ipvsadm管理叢集服務中的realserver

<code>添加 -a   - t|u|f service-address -r server-address -[g|i|m] [-w weight]</code>

<code>        </code><code>在NAT模型中server-address可以是 IP:PORT</code>

<code>        </code><code>-g:DR   預設就是DR模型</code>

<code>        </code><code>-m:NAT</code>

<code>        </code><code>-i:TUN</code>

<code>修改 -e</code>

<code>删除 -d - t|u|f service-address -r server-address</code>

ipvsadm檢視

<code>ipvsadm檢視</code>

<code>         </code><code>- L|l      顯示規則</code>

<code>         </code><code>-n         不反解析IP位址和端口,數字格式顯示主機位址和端口号</code>

<code>         </code><code>--status   統計資料</code>

<code>         </code><code>--rate     速率</code>

<code>         </code><code>--timeout  顯示tcp、tcpfin和udp的會話逾時時長</code>

<code>         </code><code>--</code><code>sort</code>     <code>顯示目前的ipvs連接配接狀況</code>

<code>         </code><code>-c         檢視連接配接數</code>

删除所有叢集服務

<code>-C          清空ipvs所有規則</code>

儲存ipvs規則

<code>-S  &gt; </code><code>/path/file</code>   <code>儲存規則</code>

<code>service ipvsadm save</code>

載入ipvs規則

<code>-R  &lt; </code><code>/path/somefile</code>

NAT

<a href="http://blog.51cto.com/attachment/201309/064256156.jpg" target="_blank"></a>

使用者請求到達INPUT鍊由ivps的比對規則并修改就用戶端的目标IP為叢集服務中的Realserver位址,DNAT的動态擴充,同樣支援端口映射,向外提供的服務和内部服務端口可以不一緻,Realserver的網關指向DIP。

缺點:由于Director為後端realserver網關,是以能夠排程的Realserver有限,10個就已經差強人意了。

DR

<a href="http://blog.51cto.com/attachment/201309/064403347.jpg" target="_blank"></a>

叢集節點跟Director必須在同一實體網絡中,因為它靠mac位址轉發資料包,ARP廣播包不允許跨路由

RIP可以不用是私有位址,實作便捷的遠端原理

Director隻負責入站請求,響應封包由Realserver直接發網用戶端,請求封包很小,是以DR模式的LVS能帶動100台Realserver

叢集節點一定不能使用Director當做其預設網關

不支援端口映射

大多數的作業系統都可以用在Realserver,要求必須能隐藏VIP

TUN

<a href="http://blog.51cto.com/attachment/201309/064437159.jpg" target="_blank"></a>

叢集節點可以跨越Intelnet

RIP必須是公網位址

Director僅負責入站請求,響應封包則由Realserver直接發網用戶端

Realserver網關不能指向Director

隻有支援隧道功能的OS才能用于Realserver

二、LVS的排程算法

1、靜态排程方法(director不考慮realserver已建立的活動連結和非活動連結狀況)

rr 輪詢

排程器通過“輪叫”排程算法将外部請求按順序輪流配置設定到叢集中的真實伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連接配接數和系統負載。

wrr 權重輪詢

排程器通過“權重輪叫”排程算法根據真實伺服器的不同處理能力來排程通路請求。這樣可以保證處理能力強的伺服器能處理更多的通路流量。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值。

sh 源位址哈希

源位址hash,對請求的用戶端IP進行hash計算,内部維持着一張hash表,它的主要功能使用者實作session affinity,會話綁定,它在一定程度上破壞了負載均衡效果,但是為了現實應用的需求這種功能是必要的,如果每個realserver通過session sharing的叢集機制共享session,就可以不适用source hash這種功能。

dh 目标位址哈希

“目标位址散列”排程算法根據請求的目标IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。

2、動态排程方法

lc 最少連接配接數

排程器通過“最少連接配接”排程算法動态地将網絡請求排程到已建立的連結數最少的伺服器上。如果叢集系統的真實伺服器具有相近的系統性能,采用“最小連接配接”排程算法可以較好地均衡負載,active*256+inactive。

wlc 權重最少連接配接數

在叢集系統中的伺服器性能差異較大的情況下,排程器采用“權重最少連結”排程算法優化負載均衡性能,具有較高權值的伺服器将承受較大比例的活動連接配接負載。排程器可以自動問詢真實伺服器的負載情況,并動态地調整其權值(active*256+inactive)/weight。

sed 最短期望延遲

wlc的改進版,權重大的伺服器事先被挑中,(active+1)*256/weight,權重大的伺服器有很多的時候,權重小的伺服器可能一個都沒有。

nqnever queue 永不排隊

無需隊列,如果有台 realserver的連接配接數=0就直接配置設定過去,不需要在進行sed運算。

lblc 基于本地的最少連接配接

它的主要目的跟dh一樣,隻是dh并不考慮從但前cacheserver的連接配接數,lblc考慮而已。盡管要保證命中的提高,并同樣的請求發網通一個cache server但也要考慮輪詢新的連接配接用一個相對空閑的cache server來響應。

lblcr 基于本地的帶複制功能的最少連接配接

“帶複制的基于局部性最少連結”排程算法也是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統。它與LBLC算法的不同之處是它要維護從一個目标 IP位址到一組伺服器的映射,而LBLC算法維護從一個目标IP位址到一台伺服器的映射。該算法根據請求的目标IP位址找出該目标IP位址對應的伺服器組,按“最小連接配接”原則從伺服器組中選出一台伺服器,若伺服器沒有超載,将請求發送到該伺服器;若伺服器超載,則按“最小連接配接”原則從這個叢集中選出一台伺服器,将該伺服器加入。

一、實作原理

<a href="http://blog.51cto.com/attachment/201309/070222206.png" target="_blank"></a>

用戶端送出請求封包至路由網關,路由網關eth1發出ARP解析請求,請求資料包目标IP(192.168.1.200)的MAC位址是多少,所有realserver均收到APR請求,此時為了讓解析的MAC為Director的MAC,需要對所有realserver做出設定如下:

9

10

11

12

13

<code>######所有realserver配置資訊</code>

<code>sysctl -w net.ipv4.conf.eth0.arp_announce=2</code>

<code>sysctl -w net.ipv4.conf.all.arp_announce=2</code>

<code>sysctl -w net.ipv4.conf.eth0.arp_ignore=1</code>

<code>sysctl -w net.ipv4.conf.all.arp_ignore=1</code>

<code>#######解釋說明</code>

<code>arp_ignore      接收到别人請求後的響應級别</code>

<code>            </code><code>0   隻要本機配置有相應位址就給予相應</code>

<code>            </code><code>1   僅在請求目标位址配置在請求到達的接口上的時候,才給予相應</code>

<code>arp_annonce     主動向外通告過自己IP位址和MAC位址對應關系的通告級别</code>

<code>            </code><code>0   将本機任何接口上的任何位址向外通過</code>

<code>            </code><code>1   試圖僅向目标網絡通告與其網絡比對的位址資訊</code>

<code>            </code><code>2   僅向目标網絡通告與其網絡比對的位址資訊是</code>

用戶端成功解析VIP的MAC位址為Director的MAC,将封包轉發至排程器。

Director根據排程算法和規則選擇為Realserver_one,并發出APR解析請求得到RIP對應的MAC位址,并重新封裝資料封包的幀首部,将源MAC位址改為自己,目标MAC位址改為解析到的RIP的MAC位址,并發送封包至Realserver_one。

Realserver_one收到Director發來的封包處理并相應此請求封包,響應封包的源IP位址,必須是請求封包的目标IP(VIP)位址,需要對realserver做如下設定:

<code>ifconfiglo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255</code>

<code>route add -host 192.168.1.200 dev lo:0</code>

此後整個傳輸過程資料包源IP為VIP,目标IP位CIP,資料封包沿着路由器轉發至用戶端,完成整個請求和相應過程。

二、配置過程

Director配置

<code>route add -host 192.168.1.200 dev eth0:0    </code>

<code>ipvsadm -A -t 192.168.1.200:80 -s wlc</code>

<code>ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.10 -g -w 2</code>

<code>ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.20 -g -w 1</code>

realserver端配置

三、健康檢測機制

使用ldirectord來實作對realserver的健康狀态檢測

為了從主Director将LVS負載均衡資源故障轉移到備用Director,并從叢集中自動移除節點,我們需要使用ldirectord程式,這個程式在啟動時自動建立IPVS表,然後監視叢集節點的健康情況,在發現失效節點時将其自動從IPVS表中移除,本文沒有使用這種方法,而是簡單的通過腳本的方式來實作。

使用腳本來實作對realserver的健康狀态檢測

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<code>#!/bin/bash</code>

<code>#</code>

<code>VIP=192.168.1.200</code>

<code>CPORT=80</code>

<code>BACKUP=127.0.0.1</code>

<code>STATUS=(</code><code>"1"</code><code>"1"</code><code>)</code>

<code>RS=(</code><code>"192.168.1.10"</code><code>"192.168.1.20"</code><code>)</code>

<code>RW=(</code><code>"2"</code><code>"1"</code><code>)</code>

<code>RPORT=80</code>

<code>TYPE=g</code>

<code>while</code><code>:; </code><code>do</code>

<code>letCOUNT=0</code>

<code>add() {</code>

<code>   </code><code>ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2</code>

<code>   </code><code>[ $? -eq0 ] &amp;&amp; return0 || return1</code>

<code>}</code>

<code>del() {</code>

<code>   </code><code>ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT</code>

<code>forI </code><code>in</code><code>${RS[*]}; </code><code>do</code>

<code>   </code><code>ifcurl --connect-timeout 1 http:</code><code>//</code><code>$I &amp;&gt; </code><code>/dev/null</code><code>; </code><code>then</code>

<code>      </code><code>if</code><code>[ ${STATUS[$COUNT]} -eq0 ]; </code><code>then</code>

<code>         </code><code>add $I ${RW[$COUNT]}</code>

<code>     </code><code>[ $? -eq0 ] &amp;&amp; STATUS[$COUNT]=1</code>

<code>      </code><code>fi</code>

<code>   </code><code>else</code>

<code>      </code><code>if</code><code>[ ${STATUS[$COUNT]} -eq1 ]; </code><code>then</code>

<code>         </code><code>del $I</code>

<code>     </code><code>[ $? -eq0 ] &amp;&amp; STATUS[COUNT]=0</code>

<code>   </code><code>fi</code>

<code>   </code><code>letCOUNT++</code>

<code>done</code>

<code>sleep5</code>

注意:各節點之間的時間偏差不應該超過1秒,NTP時間伺服器來同步時間。

一、持久連接配接的實作機制

無論使用什麼算法,LVS持久連接配接都能實作在一點時間内,将來自于同一個用戶端請求派發至此前標明的realserver,DH排程算法本身依賴于TCP會話逾時時間等其他計時器,而持久連接配接依賴于持久連接配接模闆,每個新的連接配接請求,無論用戶端的連接配接狀态無論是否斷開,隻要用戶端曾經通路過,LVS就會在持久連接配接模闆中記錄資訊,持久連接配接模闆(記憶體緩沖區):記錄每一個用戶端及配置設定的realserver的映射關系。

PPC 持久端口連接配接 基于端口

來自于同一個用戶端對同一個服務的請求,始終定向至此前標明的realserver。

<code>ipvsadm -A -t 192.168.1.200:23 -s rr-p 3600</code>

<code>ipvsadm -a -t 192.168.1.200:23 -r 192.168.1.10 -g -w 2</code>

<code>ipvsadm -a -t 192.168.1.200:23 -r 192.168.1.20 -g -w 1</code>

PCC 持久用戶端連接配接 基于所有端口

來自于同一個用戶端對所有服務的請求,始終定向至此前標明的realserver

<code>ipvsadm -A -t 192.168.1.200:0 -s rr -p 600</code>

<code>ipvsadm -a -t 192.168.1.200:0 -r 192.168.1.10 -g -w 2</code>

<code>ipvsadm -a -t 192.168.1.200:0 -r 192.168.1.20 -g -w 1</code>

PNMPP 持久防火牆标記連接配接

來自于同一用戶端對指定服務的請求,始終定向至此算定的realserver基于指定的端口,它可以将兩個毫不相幹的端口定義為一個叢集服務,例如:合并http telnet為同一個叢集服務。

<code>######PNMPP是通過路由前給資料包打标記來實作的</code>

<code>iptables -t mangle -A PREROUTING -d 192.168.1.200 -eth0 -p tcp --dport 80 -j MARK --</code><code>set</code><code>-mark 3</code>

<code>iptables -t mangle -A PREROUTING -d 192.168.1.200 -eth0 -p tcp --dport 23 -j MARK --</code><code>set</code><code>-mark 3</code>

<code>ipvsadm -A -f 3 -s rr -p 600</code>

<code>ipvsadm -a -f 3 -r 192.168.1.10 -g -w 2</code>

<code>ipvsadm -a -f 3 -r 192.168.1.20 -g -w 2</code>

注意:以上三種持久連接配接均使用了"-p"選項,它保證了持久性,預設為300秒

警告:Director沒有定義使用者請求的叢集服務,将試圖自己響應用戶端請求。

本文轉自 ftmoonfans  51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1299896

繼續閱讀