LVS原理解析
LVS簡介
LVS是Linux Virtual Server的簡寫,即Linux虛擬服務器,是一個虛擬的服務器集群系統。該項目由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。
使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux操作系統實現一個高性能、高可用的服務器群集,它具有良好可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的服務性能。
負載均衡技術有很多實現方案,如基於DNS域名輪流解析的方法、基於客戶端調度訪問的方法、基於應用層系統負載的調度方法,還有基於IP地址的調度方法,在這些負載調度算法中,執行效率最高的就是IP負載均衡技術。
LVS的IP負載均衡技術是通過ipvs內核模塊來實現的,ipvs是LVS集群系統的核心軟件,它的主要作用是:安裝在Director Server上,同時在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬的IP地址訪問集群服務。這個虛擬IP一般稱為LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然後由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。當用戶的請求到達負載調度器後,調度器如何將請求發送到提供服務的Real Server節點,而Real Server節點如何返回數據給用戶,是ipvs實現的重點技術,ipvs實現負載均衡機制有四種,分別是NAT、TUN和DR以及後來經淘寶開發的FullNat。
LVS的工作機制
lvs分為兩個部件:ipvs和ipvsadm
ipvs:工作於內核空間,主要用於使用戶定義的策略生效
ipvsadm:工作於用戶空間,管理集群服務的命令行
如上圖所示,ipvs工作於內核空間的INPUT鏈上,當收到用戶的請求為某集群服務時,通過PREROUTING鏈,經檢查本機路由表,送往INPUT鏈;在進入netfilter的INPUT鏈時,ipvs強行將請求報文通過ipvsadm定義的集群服務策略的路徑改為FORWORD鏈,將報文轉發至後端真實提供服務的主機。
LVS的三種工作類型
LVS有三種工作類型:
NAT:地址轉換
DR:直接路由
TUN:隧道
各類術語介紹:CIP為客戶端IP,VIP為虛擬ip,DIP為Director的ip,RIP為後端服務器的ip
LVS的NAT模型
此模型中,DR需要配置兩個網卡分別為vip(公網地址:114.100.80.10)和Dip(私網地址:101.0.0.10),VIP只需要配置到DR上,而DIP需設置為後端服務器的網關地址。
它的工作機制:
①用戶發出訪問請求,此時源地址:CIP(200.10.10.1),目標地址為VIP(114.100.80.10);
②當DR收到用戶的請求,並發現該請求為集群服務請求,則運用LVS調度算法選擇後端一臺服務器進行響應,並將請求報文目標地址(vip:114.100.80.10)轉換成經調度算法計算得出的後端主機IP(RIP:10.0.0.1)地址。此時源地址為CIP(200.10.10.1),目標地址轉換為RIP(10.0.0.1);
③後端主機(RIP:10.0.0.1)收到請求後,對該請求進行響應,並發送報文至DR,此時源地址為RIP(10.0.0.1),目標地址為CIP(200.10.10.1);
④由於響應的目標地址為CIP(200.10.10.1),後端服務器無法直接響應client,需要DR將源地址(RIP:10.0.0.1)轉換成VIP(114.100.80.10)的地址進行發送響應報文,轉換後源地址為VIP(114.100.80.10),目標地址為CIP(200.10.10.1);
NAT的特性:
1> RS應該使用私有地址;
2> RS的網關的必須指向DIP;
3> RIP和DIP必須在同一網段內;
4> 請求和響應的報文都得經過Director;在高負載場景中,Director很可能成為系統性能瓶頸;
5> 支持端口映射;
6> RS可以使用任意支持集群服務的OS;
LVS的DR模型
該類型中,DR上依舊配置有DIP和VIP,VIP配置在網卡別名上。每個RS都有自己的RIP以及在回環別名網卡中配置VIP,但是RS的vip隱藏起來,並不接收任何請求,只有在響應客戶端請求時作為源地址使用。
1)client(200.10.10.1)向目標VIP(114.100.80.10)發出請求,通過ARP協議進行廣播,找到DR,Director接收。此時源地址為CIP(200.10.10.1),目標地址為VIP(114.100.80.10);
2)DR接受請求後,發現該請求為集群服務,LVS根據負載均衡算法選擇一臺active的RS,並通過ARP協議進行廣播獲取RS的MAC(00:0c:29:d2),而後將原來的MAC首部拆除重新封裝,將選中的RS的網卡的mac地址作為目標mac地址。此時源地址為CIP,目標地址VIP,但VIP的MAC地址已經更改為RS的MAC地址。
3)RS在局域網中收到這個幀,拆開後發現目標IP(VIP)與本地匹配,於是處理這個報文.隨後重新封裝報文,發送給客戶端.此時源地址為RS中的VIP,目標地址為CIP。
當我們分析上面兩個網絡模型的數據報時會發現一些問題:
1)由於vip需要在每臺主機中配置,如何保證ARP請求報文不會被交換機或其它網絡設備知道?
2)如何保證ARP通告報文不被交換機或其它網絡設備知道?
3)由於RS只有一個網絡接口,而linux內核默認情況下包封裝時是從哪個網口出去那個網口就是源地址,如何確保RS轉發出來的報文源IP是VIP,而不是RIP?
4)因為DR與RS都配置有相同的VIP,如何避免各主機VIP廣播,造成無法通信?
解決辦法:
1)Linux內核有兩個關於ARP對待請回報文與通告報文的參數(arp_announce/arp_ignore),可以設定相應的級別來規避上述問題中的1、2兩點;
2)對於問題3,我們可以在數據報封裝後指定路由經lo別名上的接口發送出去然後再通過eth0網卡轉發出去;
3)對於問題4,我們只需要設定vip的廣播地址為它自己即可;
DR的特性:
1> 集群節點跟Director必須在同一個物理網絡中;
2> RIP可以為公網地址,實現遠程管理;
3> DR只負責入站請求,響應報文由RS直接發送給客戶端;
4> RS不能將網關指向DIP;
5> 不支持端口映射;
6> RS可以使用任意支持集群服務的OS;
LVS-TUN
在數據包必須傳遞到另一個網絡或因特網上時,可以使用ip隧道,ip隧道能夠將數據包從一個子網或虛擬局域網(VLAN)轉發到另一個子網或虛擬局域網(VLAN),建立ip隧道是Linux內核功能的一部分,LVS-TUN轉發方法允許你將集群節點放在與Director不同的網絡上。
請留意DR將數據包轉發給RS時的IP數據報文;由於DR,RS都不在同一局域網內,而DR要將client請求報文轉發給RS時,DR是直接在數據包中直接添加IP首部(源IP:DR和目標IP:RS),這樣就是隧道技術了。
同樣,該模型下RS都將配置VIP地址,且不能被外界所獲知VIP存在於RS上;
參考:http://junwang.blog.51cto.com/5050337/1439428
本文出自 “IT看看看” 博客,請務必保留此出處http://jinlong.blog.51cto.com/3276088/1969320
LVS原理解析