天天看點

叢集之LVSLVS

所需要的軟體:

從Linux核心版本2.6起,ip_vs code已經被整合進了核心中,是以,隻要在編譯核心的時候選擇了ipvs的功能,您的Linux即能支援LVS。Linux 2.4.23以後的核心版本也整合了ip_vs code,但如果是更舊的核心版本,您得自己手動将ip_vs code整合進核心原碼中,并重新編譯核心方可使用lvs。

一、關于ipvsadm:

ipvsadm是運作于使用者空間、用來與Ipvs互動的指令行工具,它的作用表現在:

1、定義在Director上進行dispatching的服務(service),以及用此伺服器(server)用來提供此服務;

2、為每台同時提供某一種服務的伺服器定義其權重(即概據伺服器性能确定的其承擔負載的能力);

注:權重用整數來表示,有時候也可以将其設定為atomic_t;其有效表示值範圍為24bit整數空間,即(2^24-1);

是以,ipvsadm指令的主要作用表現在以下方面:

1、添加服務(通過設定其權重>0);

2、關閉服務(通過設定其權重>0);此應用場景中,已經連接配接的使用者将可以繼續使用此服務,直到其退出或逾時;新的連接配接請求将被拒絕;

3、儲存ipvs設定,通過使用“ipvsadm-sav > ipvsadm.sav”指令實作;

4、恢複ipvs設定,通過使用“ipvsadm-sav < ipvsadm.sav”指令實作;

5、顯示ip_vs的版本号,下面的指令顯示ipvs的hash表的大小為4k;

# ipvsadm

    IP Virtual Server version 1.2.1 (size=4096)

6、顯示ipvsadm的版本号

# ipvsadm --version

   ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)

二、ipvsadm使用中應該注意的問題

預設情況下,ipvsadm在輸出主機資訊時使用其主機名而非IP位址,是以,Director需要使用名稱解析服務。如果沒有設定名稱解析服務、服務不可用或設定錯誤,ipvsadm将會一直等到名稱解析逾時後才傳回。當然,ipvsadm需要解析的名稱僅限于RealServer,考慮到DNS提供名稱解析服務效率不高的情況,建議将所有RealServer的名稱解析通過/etc/hosts檔案來實作;

三、排程算法

Director在接收到來自于Client的請求時,會基于"schedule"從RealServer中選擇一個響應給Client。ipvs支援以下排程算法:

1、輪詢(round robin, rr),權重輪詢(Weighted round robin, wrr)——新的連接配接請求被輪流配置設定至各RealServer;算法的優點是其簡潔性,它無需記錄目前所有連接配接的狀态,是以它是一種無狀态排程。輪叫排程算法假設所有伺服器處理性能均相同,不管伺服器的目前連接配接數和響應速度。該算法相對簡單,不适用于伺服器組中處理性能不一的情況,而且當請求服務時間變化比較大時,輪叫排程算法容易導緻伺服器間的負載不平衡。

2、最少連接配接(least connected, lc), 權重最少連接配接(weighted least connection, wlc)——新的連接配接請求将被配置設定至目前連接配接數最少的RealServer;最小連接配接排程是一種動态排程算法,它通過伺服器目前所活躍的連接配接數來估計伺服器的負載情況。排程器需要記錄各個伺服器已建立連接配接的數目,當一個請求被排程到某台伺服器,其連接配接數加1;當連接配接中止或逾時,其連接配接數減一。

3、基于局部性的最少連結排程(Locality-Based Least Connections Scheduling,lblc)——針對請求封包的目标IP位址的負載均衡排程,目前主要用于Cache叢集系統,因為在Cache叢集中客戶請求封包的目标IP位址是變化的。這裡假設任何後端伺服器都可以處理任一請求,算法的設計目标是在伺服器的負載基本平衡情況下,将相同目标IP位址的請求排程到同一台伺服器,來提高各台伺服器的通路局部性和主存Cache命中率,進而整個叢集系統的處理能力。LBLC排程算法先根據請求的目标IP位址找出該目标IP位址最近使用的伺服器,若該伺服器是可用的且沒有超載,将請求發送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處于其一半的工作負載,則用“最少連結”的原則選出一個可用的伺服器,将請求發送到該伺服器。

4、帶複制的基于局部性最少連結排程(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是針對目标IP位址的負載均衡,目前主要用于Cache叢集系統。它與LBLC算法的不同之處是它要維護從一個目标IP位址到一組伺服器的映射,而 LBLC算法維護從一個目标IP位址到一台伺服器的映射。對于一個“熱門”站點的服務請求,一台Cache 伺服器可能會忙不過來處理這些請求。這時,LBLC排程算法會從所有的Cache伺服器中按“最小連接配接”原則選出一台Cache伺服器,映射該“熱門”站點到這台Cache伺服器,很快這台Cache伺服器也會超載,就會重複上述過程選出新的Cache伺服器。這樣,可能會導緻該“熱門”站點的映像會出現在所有的Cache伺服器上,降低了Cache伺服器的使用效率。LBLCR排程算法将“熱門”站點映射到一組Cache伺服器(伺服器集合),當該“熱門”站點的請求負載增加時,會增加集合裡的Cache伺服器,來處理不斷增長的負載;當該“熱門”站點的請求負載降低時,會減少集合裡的Cache伺服器數目。這樣,該“熱門”站點的映像不太可能出現在所有的Cache伺服器上,進而提供Cache叢集系統的使用效率。LBLCR算法先根據請求的目标IP位址找出該目标IP位址對應的伺服器組;按“最小連接配接”原則從該伺服器組中選出一台伺服器,若伺服器沒有超載,将請求發送到該伺服器;若伺服器超載;則按“最小連接配接”原則從整個叢集中選出一台伺服器,将該伺服器加入到伺服器組中,将請求發送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,将最忙的伺服器從伺服器組中删除,以降低複制的程度。

5、目标位址散列排程(Destination Hashing,dh)算法也是針對目标IP位址的負載均衡,但它是一種靜态映射算法,通過一個散列(Hash)函數将一個目标IP位址映射到一台伺服器。目标位址散列排程算法先根據請求的目标IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。

6、源位址散列排程(Source Hashing,sh)算法正好與目标位址散列排程算法相反,它根據請求的源IP位址,作為散列鍵(Hash Key)從靜态配置設定的散清單找出對應的伺服器,若該伺服器是可用的且未超載,将請求發送到該伺服器,否則傳回空。它采用的散列函數與目标位址散列排程算法的相同。除了将請求的目标IP位址換成請求的源IP位址外,它的算法流程與目标位址散列排程算法的基本相似。在實際應用中,源位址散列排程和目标位址散列排程可以結合使用在防火牆叢集中,它們可以保證整個系統的唯一出入口。

四、關于LVS追蹤标記fwmark:

如果LVS放置于多防火牆的網絡中,并且每個防火牆都用到了狀态追蹤的機制,那麼在回應一個針對于LVS的連接配接請求時必須經過此請求連接配接進來時的防火牆,否則,這個響應的資料包将會被丢棄。

檢視LVS上目前的所有連接配接

<code># ipvsadm -Lcn</code>

或者

<code>#cat /proc/net/ip_vs_conn</code>

檢視虛拟服務和RealServer上目前的連接配接數、資料包數和位元組數的統計值,則可以使用下面的指令實作:

<code># ipvsadm -l --stats</code>

檢視包傳遞速率的近似精确值,可以使用下面的指令:

<code># ipvsadm -l --rate</code>

安裝:

解決依賴關系後,安裝ipvsadm

<code>yum </code><code>install</code> <code>ipvsadm</code>

VS/NAT

LVS-NAT基于cisco的LocalDirector。VS/NAT不需要在RealServer上做任何設定,其隻要能提供一個tcp/ip的協定棧即可,甚至其無論基于什麼OS。基于VS/NAT,所有的入站資料包均由Director進行目标位址轉換後轉發至内部的RealServer,RealServer響應的資料包再由Director轉換源位址後發回用戶端。 

VS/NAT模式不能與netfilter相容,是以,不能将VS/NAT模式的Director運作在netfilter的保護範圍之中。現在已經有更新檔可以解決此問題,但尚未被整合進ip_vs code。

<a href="http://s4.51cto.com/wyfs02/M02/89/DE/wKioL1ggM0nxw3ApAAAUxB6PGgA021.png" target="_blank"></a>

設定VS/NAT模式的LVS(這裡以web服務為例)

Director:

建立服務

<code># ipvsadm -A -t VIP:PORT -s rr</code>

如:

<code># ipvsadm -A -t 192.168.0.220:80 -s rr</code>

設定轉發:

<code># ipvsadm -a -t VIP:PORT -r RIP_N:PORT -m -w N</code>

如:

<code># ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.2 -m -w 1</code>

<code># ipvsadm -a -t 192.168.0.220:80 -r 192.168.10.3 -m -w 1</code>

打開路由轉發功能

<code># echo "1" &gt; /proc/sys/net/ipv4/ip_forward</code>

服務控制腳本:

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

<code>#</code>

<code># chkconfig: - 88 12</code>

<code># description: LVS script for VS/NAT</code>

<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>

<code>VIP=192.168.0.219</code>

<code>DIP=192.168.10.10</code>

<code>RIP1=192.168.10.11</code>

<code>RIP2=192.168.10.12</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>start)           </code>

<code>  </code><code>/sbin/ifconfig</code> <code>eth0:1 $VIP netmask 255.255.255.0 up</code>

<code># Since this is the Director we must be able to forward packets</code>

<code>  </code><code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/ip_forward</code>

<code># Clear all iptables rules.</code>

<code>  </code><code>/sbin/iptables</code> <code>-F</code>

<code># Reset iptables counters.</code>

<code>  </code><code>/sbin/iptables</code> <code>-Z</code>

<code># Clear all ipvsadm rules/services.</code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-C</code>

<code># Add an IP virtual service for VIP 192.168.0.219 port 80</code>

<code># In this recipe, we will use the round-robin scheduling method. </code>

<code># In production, however, you should use a weighted, dynamic scheduling method. </code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-A -t $VIP:80 -s rr</code>

<code># Now direct packets for this VIP to</code>

<code># the real server IP (RIP) inside the cluster</code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-a -t $VIP:80 -r $RIP1 -m</code>

<code>  </code><code>/sbin/ipvsadm</code> <code>-a -t $VIP:80 -r $RIP2 -m</code>

<code>  </code> 

<code>  </code><code>/bin/touch</code> <code>/var/lock/subsys/ipvsadm</code><code>.lock</code>

<code>;;</code>

<code>stop)</code>

<code># Stop forwarding packets</code>

<code>  </code><code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/ip_forward</code>

<code># Reset ipvsadm</code>

<code># Bring down the VIP interface</code>

<code>  </code><code>ifconfig</code> <code>eth0:1 down</code>

<code>  </code><code>rm</code> <code>-rf </code><code>/var/lock/subsys/ipvsadm</code><code>.lock</code>

<code>status)</code>

<code>  </code><code>[ -e </code><code>/var/lock/subsys/ipvsadm</code><code>.lock ] &amp;&amp; </code><code>echo</code> <code>"ipvs is running..."</code> <code>|| </code><code>echo</code> <code>"ipvsadm is stopped..."</code>

<code>*)</code>

<code>  </code><code>echo</code> <code>"Usage: $0 {start|stop}"</code>

<code>esac</code>

本文轉自 SoulMio 51CTO部落格,原文連結:http://blog.51cto.com/bovin/1870230,如需轉載請自行聯系原作者