LVS基本原理 性能調優

1、LVS基礎及介紹  

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

目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR);十種調度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)

【參考資料:】

1)官方中文參考資料:

http://www.linuxvirtualserver.org/zh/index.html

[LVS項目介紹] [LVS集羣的體系結構] [LVS集羣中的IP負載均衡技術]

[LVS集羣的負載調度]

2)LinuxTone 相關LVS技術檔彙總:

http://bbs.linuxtone.org/thread-1191-1-1.html

2、 LVS 三種IP負載均衡技術對比:

三種IP負載均衡技術的優缺點歸納在下表中:

VS/NAT VS/TUN VS/DR Server any Tunneling Non-arp device server network private LAN/WAN LAN server number low (10~20) High (100) High (100) server gateway load balancer own router Own router

【注】

以上三種方法所能支持最大服務器數目的估計是假設調度器使用100M網卡,調度器的硬件配置與後端服務器的硬件配置相同,而且是對一般Web服務。使用更

高的硬件配置(如千兆網卡和更快的處理器)作爲調度器,調度器所能調度的服務器數量會相應增加。當應用不同時,服務器的數目也會相應地改變。所以,以上數

據估計主要是爲三種方法的伸縮性進行量化比較。

3、LVS目前實現的幾種調度算法

IPVS在內核中的負載均衡調度是以連接爲粒度的。在HTTP協議(非持久)中,每個對象從WEB服務器上獲取都需要建立一個TCP連接,同一用戶的不同請求會被調度到不同的服務器上,所以這種細粒度的調度在一定程度上可以避免單個用戶訪問的突發性引起服務器間的負載不平衡。

在內核中的連接調度算法上,IPVS已實現了以下十種調度算法:

* 輪叫調度(Round-Robin Scheduling)

* 加權輪叫調度(Weighted Round-Robin Scheduling)

* 最小連接調度(Least-Connection Scheduling)

* 加權最小連接調度(Weighted Least-Connection Scheduling)

* 基於局部性的最少鏈接(Locality-Based Least Connections Scheduling)

* 帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication Scheduling)

* 目標地址散列調度(Destination Hashing Scheduling)

* 源地址散列調度(Source Hashing Scheduling)

* 最短預期延時調度(Shortest Expected Delay Scheduling)

* 不排隊調度(Never Queue Scheduling)

對應: rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,

Ldirecotrd配置選項及ipvsadm使用參數.

ldirectord配置選項

ipvsadm使用的參數

ipvsadm -L的輸出

LVS轉發方法

gate

-g

Route

LVS-DR

ipip

-i

Tunnel

LVS-TUN

masq

-m

Masq

LVS-NAT

4、集羣架構時我們應該採用什麼樣的調度算法?

在一般的網絡服務(如HTTP和Mail Service等)調度中,我會使用加權最小連接調度wlc或者加權輪叫調度wrr算法。

基於局部性的最少鏈接LBLC和帶複製的基於局部性最少鏈接LBLCR主要適用於Web Cache集羣。

目標地址散列調度和源地址散列調度是用靜態映射方法,可能主要適合防火牆調度。

最短預期延時調度SED和不排隊調度NQ主要是對處理時間相對比較長的網絡服務。

其實,它們的適用範圍不限於這些。我想最好參考內核中的連接調度算法的實現原理,看看那種調度方法適合你的應用。

5、LVS的ARP問題

2.4.x kernels:

Hidden Patch

arptable

iptables

2.6.x kernels: (關閉arp查詢響應請求)

net.ipv4.conf.eth0.arp_ignore = 1

net.ipv4.conf.eth0.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

arping tools

二、基礎知識及一些要點.

1、InActConn並不代表錯誤連接,它是指不活躍連接(Inactive Connections),

我們將處於TCP ESTABLISH狀態以外的連接都稱爲不活躍連接,例如處於SYN_RECV狀態的連接,處於TIME_WAIT狀態的連接等。

2、用四個參數來關閉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

3、ipvsadm -L -n --stats

Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes

連接數 輸入包 輸出包 輸入流量 輸出流量

4、注意事項:

1)在LVS方案中,虛擬ip地址與普通網絡接口大大不同,這點需要特別注意。

虛擬ip地址的廣播地址是它本身,子網掩碼是255.255.255.255。爲什麼要這樣呢?因爲有若干機器要使用同一個ip地址,

用本身做廣播地址和把子網掩碼設成4個255就不會造成ip地址衝突了,否則lvs將不能正常轉發訪問請求。

2)假如兩臺VS之間使用的互備關係,那麼當一臺VS接管LVS服務時,可能會網絡不通,這時因爲路由器的MAC緩存表裏關於vip這個地址的MAC地址還是被替換的VS的MAC,有兩種解決方法,一種是修改新VS的MAC地址,另一種是使用send_arp 命令(piranha軟件包裏帶的一個小工具) 格式如下:

send_arp:

send_arp [-i dev] src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr

這個命令不一定非要在VS上執行,只+要在同一VLAN即可。

/sbin/arping -f -q -c 5 -w 5 -I eth0 -s $WEB_VIP -U $GW

5.Virtual Server via Direct Routing(VS/DR)

VS/DR通過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地

提高集羣系統的伸縮性。這種方法沒有IP隧道的開銷,對集羣中的真實服務器也沒有必須支持IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連

在同一物理網段上。

6. LVS 經驗:

1). LVS調度的最小單位是“連接”。

2). 當apache的KeepAlive被設置成Off時,“連接”才能被較均衡的調度。

3). 在不指定-p參數時,LVS才真正以“連接”爲單位按“權值”調度流量。

4). 在指定了-p參數時,則一個client在一定時間內,將會被調度到同一臺RS。

5). 可以通過”ipvsadm –set tcp tcpfin udp”來調整TCP和UDP的超時,讓連接淘汰得快一些。

6). 在NAT模式時,RS的PORT參數纔有意義。

7). DR和TUN模式時,InActConn 是沒有意義的(Thus the count in the InActConn column for LVS-DR, LVS-Tun is

inferred rather than real.)

/sbin/arping -f -q -c 5 -w 5 -I eth0 -s $WEB_VIP -U $GW

三、LVS 性能調優

Least services in System or Compile kernel.

Performace Tuning base LVS:

LVS self tuning( ipvsadm Timeout (tcp tcpfin udp)).

ipvsadm -Ln --timeout

Timeout (tcp tcpfin udp): 900 120 300

ipvsadm --set tcp tcpfin udp

Improving TCP/IP performance

net.ipv4.tcp_tw_recyle=1

net.ipv4.tcp_tw_reuse=1

net.ipv4.tcp_max_syn_backlog=8192

net.ipv4.tcp_keepalive_time=1800

net.ipv4.tcp_fin_timeout=30

net.core.rmem_max=16777216

net.core.wmem_max=16777216

net.ipv4.tcp_rmem=4096 87380 16777216

net.ipv4.tcp_wmem=4096 65536 16777216

net.core.netdev_max_backlog=3000

項目實施案例及經驗分享:

1、機房無法實時刷新MAC,LVS+Heartbeat方案無法正常隨機切換IP?

假如兩臺VS之間使用的互備關係,那麼當一臺VS接管LVS服務時,可能會網絡不通,這時因爲路由器的MAC緩存表裏無法及時刷新MAC.關於vip這個

地址的MAC地址還是替換的VS的MAC,有兩種解決方法,一種是修改新VS的MAC地址,另一種是使用send_arp /arpiing命令.

以arping命令爲例.

/sbin/arping -I eth0 -c 3 -s ${vip}${gateway_ip} > /dev/null 2>&1

Eg:

/sbin/arping -I eth0 -c 3 -s 192.168.1.6192.168.1.1

【注】07年部署某大型商業網站項目時,263機房遇到此問題,最好讓機房調整路由

MAC緩存表的刷新頻率;同朋公司移動機房實施相關項目時發現切換IP後還是無法

訪問VIP,最後利用上面的arping一個命令搞定.

【附】如果採用Piranha/keealived方案切換的時候會內置自動發送send_arp命令.

UltraMonkey方案經測試也會自動發送此命令.如用heartbeat方案,需要寫一個send_arp或者arping相關的腳本當作

heartbeat一個資源切換服務的時候自動發送

相關命令腳本.

2、某臺機器down掉以後,IPVS列表中權值已經置0了,爲什麼還輪詢到這臺機器上?

配置 ldirectord.conf

quiescent=no或 echo 1 >/proc/sys/net/ipv4/vs/expire_nodest_conn

【注】經如上設置某臺Realserver服務down掉以後如何從IPVS列表自動中刪除恢復時如何自動添加.

3、爲什麼做壓力測試的時候,LVS不能負載均衡多部分連接只到某一臺機器上?

難道是LVS不能實現真正的負載均衡?

這和LVS腳本里指定-p參數有關,如果指定了一個client在一定的時間內,將會被調度到同一臺RS上。所以你在從來源來做壓力測試的時候大部分連接

會調度到同一臺機器上,這樣就出現了負載不均衡的狀況。很多人經常問我這個問題,仍後我叫他們多從幾個點去同時向LVS服務器做壓力測試的時候就發現負載

很均衡了。

 

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