LVS簡介
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個由章文嵩博士開發的一款自由軟件。利用LVS可以實現高可用的、可伸縮的Web、Mail、Cache等網絡服務,并在此基礎上開發支持龐大用戶數的高可用商務應用。
LVS集群的組成
基于LVS構建的服務器集群系統由3個部分組成:最前端的負載均衡層,中間的服務器池層,以及后端的數據存儲層。以下是LVS的架構框圖:
-
負載均衡層:由一臺或多臺負載均衡調度器組成。而LVS的核心模板IPVS就在調度器上,調度器的主要作用類似于路由器,通過預先設定的ipvs規則,將用戶的請求分發到服務器池的Real Server上。
-
服務器池層:由一組實際運行應用服務的機器組成,Real Server可以是Web服務器、FTP服務器、Mail服務器等中的一個或多個。
-
數據存儲層:為所有的Real Server提供共享存儲空間和內容一致性的存儲區域。一般可以通過NFS網絡文件系統共享數據。
LVS集群實現原理
LVS的IP負載均衡技術是通過IPVS模塊實現的。IPVS是LVS的核心軟件,它的主要作用是:改變netfilter中INPUT鏈處理數據包的路徑,同時在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬IP去訪問服務器。訪問的請求首先通過此IP到達調度器,然后由調度器根據規則從服務器池中選擇一個Real Server響應用戶的請求。而此處Real Server如何返回數據給用戶就是LVS實現的重點,可以分為常用的3種方式:NAT、TUN和DR。下面進行詳細的介紹。
-
NAT:確切地來說是DNAT,通過請求的目標網絡地址轉換實現LVS。當用戶請求調度器時,調度器將請求報文的目標地址(VIP)改寫為根據調度算法挑選出的Real Server地址,同時也可以將報文的目標端口映射為Real Server的相應端口,最后將報文請求發送給選定的Real Server。Real Server在將數據返回給用戶時,需要再次經過調度器將報文的源IP和源端口改為VIP和相應端口,然后將數據發送給用戶,完成整個負載均衡調度過程。
-
DR:即Director Routing,也就是用直接路由技術實現LVS。調度器收到請求報文后通過改寫請求報文中的源目MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給用戶,不再經過調度器。那么在這一過程中有一個點需要重點把握,那就是Real Server和調度器都使用了VIP,如何能保證請求報文會先發給Real Server,那么核心思想是不要讓Real Server對廣播的ARP請求做出響應,最有效的方法是修改Real Server主機的內核參數。
-
TUN:即通過IP隧道技術實現LVS。也就是當調度器收到請求報文時不會去修改請求報文的三層頭部,而是在原有的IP頭部外再封裝一個IP頭部,新的IP頭部的目標IP是根據調度算法挑選出來的Real Server的IP。
LVS調度算法
前文一直在講調度器根據算法選定服務器池中的Real Server,那么到底如何選擇的,這里就淺析一下IPVS的調度算法,分為靜態和動態兩大類調度算法。
靜態調度算法:
①RR:輪詢(round robin):是一種1:1調度,實現將外部用戶的請求按順序1:1地分配到每一個Real Server上,不考慮Real Server的負載狀況。
②WRR:加權輪詢(weighted round robin):能者多勞的機制,根據Real Server的不同負載能力去調度訪問請求。通過預先在每臺Real Server上設定權重值來區別它們的處理能力。
③DH:目標地址散列(Destination Hash ):根據請求的目標IP地址,作為散列鍵(HashKey)從靜態分配的散列表找出對應的服務器,即將來自同一個IP的請求始終調度至同一個RS,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
④SH:源地址散列(Source Hash):源地址散列”調度算法根據請求的源IP地址,作為散列鍵(HashKey)從靜態分配的散列表找出對應的服務器,即將對同一個目標IP的請求始終調度至同一個RS,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空?
動態調度算法:
①LC:最少連接(Least Connections):動態地將用戶請求調度到當前活動連接數最少的Real Server上。
②WLC:加權最少連接(Weighted LC):對每個服務節點用相應的權值表示其處理能力。WLC在進行調度時盡可能使Real Server的活動連接數與權重成正比。
③SED:最短期望延遲(Shortest Expection Delay): 對WLC的改進,Overhead = (ACTIVE+1)*256/權重值,防止在最初始狀態時,調度器會將請求轉發給負載能力差的Real Server。
④NQ:最少隊列調度(Never Queue):對SED的改進,防止服務器資源的浪費,因為SED算法可能會導致權重過大的Real Server一直在處理請求,而權重小的一直空閑。
⑤LBLC:基于局部性的最少連接(Locality-Based LC):目前主要用于Cache集群系統?該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器。
⑥LBLCR:帶復制的基于局部性最少連接(LBLC with Replication):對LBLC的改進,防止調度器一直轉發請求給同一個緩存服務器,而使其他服務器處于空閑,而LBLCR實現的就是緩存服務器可向其他緩存服務器請求的功能,即復制他們的數據,這比從遠端數據庫請求數據高效很多,也使服務器資源充分利用。
原創文章,作者:Net21_charles,如若轉載,請注明出處:http://www.www58058.com/23872
寫的很好,排版也很棒,圖畫的也很棒,加油