LVS总结
??? LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。
LVS為了在不同場景中使用而提供了4種實現模型: 分別為
??? NAT???????? -m?
??? DR????????? -g?
??? Tunnel????? -i?
??? FULLNAT???? -b?
???
LVS的用到幾個IP縮寫
??? CIP: 用戶的IP
??? VIP: LVS虛擬的IP,用于用戶訪問
??? DIP: LVS Director調度器自已的IP
??? RID: Real server 的IP
??? LIP: LVS Director調度器指定的local address,FULLNAT模式下專用的
NAT模型工作流程
??? 1、客戶端請求VIP(Virtual IP Address)
??? 2、Director接受到請求, 根據連接調度算法從一組真實服務器中選出一臺服務器, 將報文的目標地址VIP(Virtual IP Address)改寫成選定服務器的地址,報文的目標端口改寫成選定服務器的相應端口,最后將修改后的報文發送給選出的服務器。
??? 3、調度器在連接Hash 表中記錄這個連接,當這個連接的下一個報文到達時,從連接Hash表中可以得?到原選定服務器的地址和端口,進行同樣的改寫操作,并將報文傳給原選定的服務 器。當來自真實服務器的響應報文經過調度器時,調度器將報文的源地址和源端口改為Virtual IP Address和相應的端口,再把報文發給用戶
??? 不同的報文會使得連接處于不同的狀態,不同的狀態有不同的超時值。在TCP 連接中,根據標準的TCP有限狀態機進行狀態遷移;在UDP中,只設置一個UDP狀態。
不同狀態的超時值是可以設置的,在缺省情況下:
??? SYN狀態的超 時為1分鐘
??? ESTABLISHED狀態的超時為15分鐘
??? FIN狀態的超時為1分鐘
??? UDP狀態的超時為5分鐘
??? 當連接終止或超時,調度器將這個連接從 連接Hash表中刪除。
實現NAT模型有幾點需要注意的:
??? 1、RS和Director可以不在同一IP網段中
??? 2、可以實現端口映射
??? 3、請求報文和響應報文都必須經過Director
???
??? 在一些網絡服務中,它們將IP地址或者端口號在報文的數據中傳送,若只對報文頭的IP地址和端口號作轉換,這樣就會出現不一致性,服務會中斷。 所以,針對這些服務,需要編寫相應的應用模塊來轉換報文數據中的IP地址或者端口號。現已經知道有這個問題的網絡服務有FTP、IRC、H.323、 CUSeeMe、Real Audio、Real Video、Vxtreme/Vosiac、VDOLive、VIVOActive、True Speech、RSTP、PPTP、StreamWorks、NTT AudioLink、NTT SoftwareVision、Yamaha MIDPlug、iChat Pager、Quake和Diablo。
DR模型工作流程
??? 1、客戶端請求VIP
??? 2、Director接收到請求報文,不修改也不封裝IP報文,而是將數據幀的MAC地址改為選出服務器的 MAC地址,再將修改后的數據幀在與服務器組的局域網上發送。因為數據幀的MAC地址是選出的服務器,所以交換機會將數據幀發送給選出的服務器,服務器從中可以獲得該IP報文。
??? 3、RIP接收到DIP發過來的報文后,發現報文的目標地址VIP是在本地的網絡設備上,服務器處理這個報文,然后根據路由表將響應報文直接返回給客戶。
因為VIP分別存在于Director和RS,造成IP沖突,解決方法:
??? 1、網絡設備中設置VIP地址和DIrector的MAC地址進行綁定
??? 2、Linux系統中有一個軟件可以實現對ARP廣播進行過濾, arptables
??? 3、可以修改內核參數來實現, arp_ignore, arp_announce
實現DR模型需要注意的:
??? 1、RS和Director必須要在同一個二層網段中,中間沒有隔有路由器(MAC地址無法穿越三層設備)
??? 2、請求報文必須經過Director, 但是響應報文一定不能通過Director
??? 3、不能實現端口映射
三種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服 務。使用更高的硬件配置(如千兆網卡和更快的處理器)作為調度器,調度器所能調度的服務器數量會相應增加。當應用不同時,服務器的數目也會相應地改變。所 以,以上數據估計主要是為三種方法的伸縮性進行量化比較。
???
FULLNAT工作流程
??? 1、引入LIP(local address),可以配置多個,也可以使用DIP
??? 2、客戶端請求VIP
??? 3、Director接受到請求,根據調度算法得出轉發的RS, 將CIP修改為LIP, VIP修改為對應RIP, 轉發給RS
??? 4、RS接受到請求后, 響應請求給LIP, Director將響應報文RIP改為VIP, LIP改為CIP, 響應給用戶
???
實現FULLNAT模型需要注意的:
??? 1、請求報文和響應報都要通過Director
??? 2、RIP接收到的請求報文的源地址為LIP,目標地址為RIP
??? 3、支持端口映射
??? 4、為了保證應用透明性,通過tcp option傳遞client ip給RealServer(TOA).要RS讀取數據包中的tcp option來記錄client ip
??? 5、和NAT比,正常轉發性能下降<10%
LVS的調度算法
??? IPVS在內核中的負載均衡調度是以連接為粒度的。在HTTP協議(非持久)中,每個對象從WEB服務器上獲取都需要建立一個TCP連接,同一用戶 的不同請求會被調度到不同的服務器上,所以這種細粒度的調度在一定程度上可以避免單個用戶訪問的突發性引起服務器間的負載不平衡。
??? RR:Round Robin, 輪詢 將用戶請求輪詢到各個RS上
??? WRR: Weighted Round Robin, 加權輪輪詢, 根據每一臺RS的權重將用戶請求輪詢分發到各個RS上
??? SH: Source Hash, 源地址哈希, 將同一客戶端的請求轉發到同一個RS上
??? DH: Destination Hash, 將同一類型的請求轉發到同一個RS上
??? LC:least connections, 最小連接. 公式: Active*256+Inactive
??? WLC:Weighted Least Connections, 加權最小連接. 公式: (Active*256+Inactive)/Weighted
??? SED:Shortest Expection Delay, 最短延遲預期. 公式: (Active+1)*256/Weighted
??? NQ:Never Queue, 永不排隊, 對sed算法的改進
??? LBLC:Locality-Based Least-Connections, 基于局部的最少鏈接, 即為動態的dh算法
??? LBLCR:locality-based least-connections replication, 帶復制功能的lblc
Hash表
??? LVS的調優建議將hash table的值設置為不低于并發連接數。例如,并發連接數為200,Persistent時間為200S,那么hash桶的個數應設置為盡可能接近200x200=40000,2的15次方為32768就可以了。當ip_vs_conn_tab_bits=20 時,哈希表的的大小(條目)為 pow(2,20),即 1048576,對于64位系統,IPVS占用大概16M內存,可以通過demsg看到:IPVS: Connection hash table configured (size=1048576, memory=16384Kbytes)。對于現在的服務器來說,這樣的內存占用不是問題。所以直接設置為20即可。
??? 關于最大“連接數限制”:這里的hash桶的個數,并不是LVS最大連接數限制。LVS使用哈希鏈表解決“哈希沖突”,當連接數大于這個值時,必然會出現哈稀沖突,會(稍微)降低性能,但是并不對在功能上對LVS造成影響。
??? 關于連接占用內存:
每條記錄用一個ip_vs_conn結構表示,這個結構使用了Linux里面的典型數據結構struct list_head構造雙向鏈表,使得所有的記錄以鏈表形式鏈接起來。
* struct ip_vs_conn 里面的其他元素就是每個連接的具體信息,在32位系統上為128字節,64位系統上為192字節 。
* struct list_head 在32位系統上為8字節,在64位系統上為16字節。
??? 所以,hash表里面的每條記錄(每個連接),在32位系統上占據136字節內存,在64位系統上占用208字節。
調整 ip_vs_conn_tab_bits的方法
如果顯示IP Virtual Server version 1.2.1 (size=4096),則ip_vs conn_tab_bits為默認的12
在/etc/modprobe.d/目錄下添加文件ip_vs.conf,內容為:
重新查看
IP Virtual Server version 1.2.1 (size=1048576)
假如沒有變化,則需要重新調內核整編譯選項,重新編譯內核。
參考:
http://zh.linuxvirtualserver.org/node/2580
http://zh.linuxvirtualserver.org/files/LVS%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E5%8A%A0%E7%9B%AE%E5%BD%95%E7%89%88.doc
轉載于:https://blog.51cto.com/1step/1763704
總結
- 上一篇: bs4抓起大众点评的用户评论
- 下一篇: C# 数组与 list 互相转换案例