LVS是Linux虛擬服務(Linux Virtual Server)的簡稱,是一個虛擬的服務器集羣系統,是國內最先的一批自由軟件項目,由章文嵩博士發起。如今LVS項目已經被Linux內核收錄,成爲Linux錶針內核的一個重要組成部分。
隨着互聯網大潮的不斷髮展,縱向拓展的高額成本和逐漸下降的性能提高不足以知足用戶的正常訪問,所以橫向拓展便成爲主要的發展方向。經過使用LVS提供的負載均衡技術和Linux操做系統進而實現一個高性能,高可用的服務器集羣,它具備着良好的可靠性,可拓展性和可操做性,從而可以以較低廉的成本價格來提供更好的性能提高。
LVS項目自從1998年提出開始,隨機不斷的發展,如今已經成爲了一個至關成熟的技術項目。能夠利用LVS技術來實現高度的可伸縮性和高可用性的網絡服務;有效的可管理性提供了便捷的異地管理主機;價格的有效性實現了整個系統的經濟性和成本的可控性。前端
LVS構建的集羣系統大體可分爲三個部分組成:前端的負載均衡層,中間的服務器集羣層和最底層的共享數據層。負載調度器可以無縫隙的將網絡請求調度到後端的真實提供服務的服務器上,從而使得服務器集羣的結構是透明的,用戶在訪問整個集羣的服務時就像是在訪問一臺高性能,高可用性的真實服務器同樣。客戶端的程序不會受到服務器集羣的修改而受到影響,服務器集羣的可伸縮性在於能夠經過向集羣中加入或者刪除節點來實現,經過對應的節點故障檢測和系統重置能夠實現高度的可用性。
LVS體系圖例
LVS各層次的具體劃分
負載均衡層:
處於整個集羣的最前端,由一臺或者多臺調度器構成,LVS模塊部署在調度器上,調度器根據既定的算法來實現將網絡請求調度到不一樣後端服務器,完成對應的功能。
服務器集羣層:
由一組實際運行着應用服務的服務器構成,後端服務器支持的服務包括,web服務,郵件服務,FTP服務,DNS服務等一個或者多個,每一個服務器之間能夠經過LAN或者更大範圍的WAN相連,在實際的應用場景中,調取服務器也能夠做爲應用服務器提供服務。
共享數據層:
向服務器集羣中的全部real server提供共享存儲空間和內容一致性的存儲區域。通常是由磁盤陣列組成,提供數據的一致性。也能夠由NFS提供。目前來講磁盤陣列更爲適合,NFS受網絡影響較大,不太穩定。web
注意:調度器在整個LVS體修中最爲關鍵,是整個系統的核心部分。目前來講調度器系統僅僅支持Linux,內核2.6以後已經無需設置就原生支持LVS,可是reasl server的系統並不受限制,大多數常見的系統都可做爲應用服務器提供服務。
算法
當前負載均衡技術有不少實現方案,例如基於DNS域名依次輪流解析、基於客戶端調度訪問、基於應用層系統負載的調度,還有基於IP地址的調度等,相比較而言IP負載均衡技術更爲成熟和效率。LVS的IP負載均衡技術是依賴於ipvs內核模塊來實現的,ipvs是LVS集羣系統的核心軟件,它的主要做用是:安裝在調度器上,同時在調度器上虛擬出一個IP地址(這個地址能夠正常訪問互聯網),用戶必須經過這個虛擬的IP地址訪問集羣服務。這個虛擬IP通常稱爲LVS的VIP。訪問的請求首先通過VIP到達負載調度器,而後由負載調度器從Real Server列表中根據不一樣的調度算法計算選取一個服務節點響應用戶的請求。
經常使用的調度機制
VS/NAT機制(Virtual Server via Network Address Translation)
經過網絡地址轉換技術。當用戶的請求報文發送到調度器時,調度器重寫請求報文的目標地址爲調度器經過算法得出的後端real server的IP地址,同時請求報文的目標端口號也會被重寫爲後端服務器提供服務的端口號,以後將從新構建的報文分派給後端的真實服務器;真實服務器的在返回數據報文給用戶時,響應報文在經過調度器時,調度器會再次將報文的源地址和源端口重寫爲虛擬IP地址和端口,再返回給客戶,完成整個負載調度過程。
多目標的DNAT(iptables);它經過修改請求報文的目標IP地址(同時可能會修改目標端口)至挑選出某RS的RIP地址實現轉發;
注意:
(1) RS應該和DIP應該使用私網地址,且RS的網關要指向DIP;
(2) 請求和響應報文都要經由director轉發;極高負載的場景中,director可能會成爲系統瓶頸;
(3) 支持端口映射;
(4) RS可使用任意操做系統;
(5) RS的RIP和Director的DIP必須在同一IP網絡;
VS/TUN機制(Virtual Server via IP Tunneling)
採用NAT技術時,因爲請求和響應報文都必須通過調度器地址重寫,當客戶請求愈來愈多時,調度器的處理能力將成爲瓶頸。採用IP隧道技術實現LVS,它的調度方法與NAT方式同樣,可是TUN的報文轉發方式不一樣,TUN方式中,調度器使用IP隧道技術將用戶的請求轉發到某個real server上,這個real server能夠直接經過網絡響應用戶的請求,沒必要通過調度器再次調度,所以調度器和real server的地域限制再也不存在,能夠與調度器在同一網段,也能夠在不一樣的網絡中。所以,在TUN中調度器僅僅負責處理用戶的報文請求,而沒必要處理響應報文,採用 VS/TUN技術後,集羣系統的最大吞吐量能夠提升10倍。
注意:
TUN不修改請求報文的ip首部,而是經過在原有的ip首部(cip<-->vip)以外,再封裝一個ip首部&(dip<-->rip);
(1) RIP, DIP, VIP全得是公網地址;
(2) RS的網關的不能指向DIP;
(3) 請求報文必須經由director調度,但響應報文必須不能經由director;
(4) 不支持端口映射;
(5) RS的OS必須支持隧道功能;
VS/DR(Virtual Server via Direct Routing)
經過直接路由技術構建,調度和管理與以前兩個相同,可是報文的轉發方式不一樣,DR模型經過修改請求報文的MAC地址,將請求發送到real server上,real server在完成請求後直接將響應迴應給用戶,減小了IP隧道的成本,也沒必要要求必須支持隧道協議;可是要求調度器和real server都有一塊網卡在同一物理網絡中。一樣DR模型也能夠極大地 提升集羣系統的伸縮性。
注意:
(1) 保證前端路由器將目標IP爲VIP的請求報文發送給director;
解決方案:
靜態綁定
arptables
修改RS主機內核的參數
(2) RS的RIP可使用私有地址;但也可使用公網地址;
(3) RS跟Director必須在同一物理網絡中 ;
(4) 請求報文經由Director調度,但響應報文必定不能經由Director;
(5) 不支持端口映射;
(6) RS能夠大多數OS;
(7) RS的網關不能指向DIP;
後端
靜態方法:僅根據算法自己進行調度;
RR:round robin,輪叫
「輪叫」調度也叫做「1:1」調度,調度器經過「輪叫」調度算法將外部用戶請求順序按照順序1:1的分配到集羣中的每一個real server上,這種算法平等的對待每一臺real server,不考慮不一樣機器的性能差別與系統當前的負載狀況。
WRR:weighted rr, 加權輪叫
加權輪叫算法是根據real server的不一樣的處理性能來調度訪問請求,能夠對每臺real server設置不一樣的權重值,對於性能好的機器能夠設置較高的去權重值,而對於性能較弱的機器,設置較低的權重值,這樣能夠保證性能強的機器可以分配到較多的用戶請求,性能較差的機器分配較少的用戶請求,合理的利用現有的資源,同時,調度器還能夠自動查詢real server的負載狀況,動態的進行權重來進行合理的分配資源。
SH: source hash, 實現session保持的機制;未來自於同一個IP的請求始終調度至同一RS;
「源地址散列「調度算法根據用戶請求的來源地址,做爲散列鍵(Hash key)從靜態分配的散列表內找出相對應的服務器,若被找出的服務器是可用且未超載,則調度器將請求發送到這臺服務器不然返回空。
DH:destination hash, 將對同一個目標的請求始終發往同一個RS;
「目標地址散列」調度算法,調度器根據請求的目標IP地址,做爲散列鍵從靜態分配的散列表中找出對應的服務器,若被找出的服務器是可用且未超載,則將請求發送到這臺服務器。
動態方法:根據算法及各RS的當前負載狀態進行調度;
Overhead=當前負載狀態
LC:Least Connection 最少鏈接數
Overhead=Active256+Inactive
「最少鏈接數」調度算法動態的將網絡請求調度到已經創建的鏈接數最少服務器上,假設集羣中的服務器都具備相近的運算性能,那麼使用「最小鏈接數」調度算法能夠很好的去均衡集羣的負載。
WLC: Weighted LC 加權最少鏈接
Overhead=(Active256+Inactive)/weight
「加權最少鏈接」調度算法是「最少鏈接」算法的進一步優化,每一個處理節點能夠設置不一樣的權重值來表示其不一樣的處理性能,網絡管理人員能夠動態調整這些權值。默認值是1.加權最小鏈接調度算法在調度時候儘量的去調度服務節點與權重值成正向比例。
SED: Shortest Expection Delay 最短時間望延遲
Overhead=(Active+1)*256/weight
NQ:Never Queue 永不排隊
「永不排隊」調度算法在負載較低時,會將請求直接分配到空閒的服務器之上,不會進行額外的算法調度,當整個集羣負載較高時,則會進行輪叫。
SED算法的改進;
LBLC:Locality-Based LC,即爲動態的DH算法;
正向代理情形下的cache server調度;
「基於局部的最少鏈接」調度算法,本質上是爲了實現基於目標IP地址的負載均衡。這個算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器可用且未超載,那麼進行調度;假如服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用"最少連接"的原則選出一個可用的服務 器,將請求發送到該服務器。
LBLCR:Locality-Based Least-Connection with Replication,帶複製功能的LBLC算法;
"帶複製的基於局部性最少連接"調度算法也是針對目標IP地址的負載均衡,應用與LBLC相同,不一樣之處是它要維護從一個 目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小鏈接"原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小鏈接"原則從這個集羣中選出一 臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。服務器
適用環境
調度器目前支持Linuxhe FreeBSD
支持的TCP:HTTP,HTTPS,FTP,SMTP,POP3,IMAP4,PROXY,LDAP,SSMTP
支持的UDP:DNS,NTP,ICP,視頻和音頻流播放協議。
LVS對應real server沒有限制,real server能夠運行在全部的支持TCP/IP的操做系統之上。
管理軟件ipvsadm與常見配置選項網絡
yum install ipvsadm -y
管理集羣服務
ipvsadm -A|E -t|u|f service-address [-s scheduler]
ipvsadm -D -t|u|f service-address
service-address:
tcp: -t ip:port
udp: -u ip:port
fwm: -f mark
-s scheculer:
默認爲wlc
管理集羣服務中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
server-address:
ip[:port]
lvs-type:
-g: gateway, dr
-i: ipip, tun
-m: masquerade, nat
清空和查看:
ipvsadm -C
ipvsadm -L|l [options]
-n: numeric,基於數字格式顯示地址和端口;
-c: connection,顯示ipvs鏈接;
--stats:統計數據
--rate: 速率
--exact: 精確值
保存和重載:
ipvsadm -R
ipvsadm -S [-n]session
置零計數器:
ipvsadm -Z [-t|u|f service-address]
註釋:
-A 添加一個新的集羣服務;
-E 修改一個己有的集羣服務;
-D 刪除指定的集羣服務;
-a 向指定的集羣服務中添加RS及屬性;
-e 修改RS屬性;
-t 指定爲tcp協議;
-u 指定爲udp協議;
-f 指定防火牆標記碼,一般用於將兩個或以上的服務綁定爲一個服務進行處理時使用;
-s 調度方法,默認爲wlc;
-w 指定權重,默認爲1;
-p timeout persistent connection, 持久鏈接超時時長;
-g Gateway, DR模型;
-i ipip, TUN模型;
-m masquerade, NAT模型;
-S 保存ipvsadm設定的規則策略,默認保存在/etc/sysconfig/ipvsadm中;
-R 載入己保存的規則策略,默認加載/etc/sysconfig/ipvsadm;
-C 清除全部集羣服務;
-Z 清除全部記數器;
-L 顯示當前己有集羣服務,能經過相應的options查看不一樣狀態信息;負載均衡