LVS(Linux virtual server)
簡介
即linux虛擬服務器
四層負載均衡基本上都會使用 LVS,據了解 BAT 等大廠都是 LVS 重度使用者,就是因為 LVS 非常出色的性能,能為公司節省巨大的成本。LVS,全稱 Linux Virtual Server 是由國人章文嵩博士發起的一個開源的項目,在社區具有很大的熱度,是一個基于四層、具有強大性能的反向代理服務器。它現在是標準內核的一部分。
它具備可靠性、高性能、可擴展性和可操作性的特點,從而以低廉的成本實現最優的性能。LVS工作模式分為NAT模式、TUN模式、以及DR模式
相關術語:
DS:Director Server。指的是前端負載均衡器節點。
RS:Real Server。后端真實的工作服務器。
VIP:Virtual IP 向外部直接面向用戶請求,作為用戶請求的目標的IP地址。
DIP:Director Server IP,主要用于和內部主機通訊的IP地址。
RIP:Real Server IP,后端服務器的IP地址。
CIP:Client IP,訪問客戶端的IP地址。
結構
LVS采用三層結構,分別是:
第一層: 負載調度器
第二層: 服務池
第三層:共享存儲
負載調度器(load balancer/ Director),是整個集群的總代理,它有兩個網卡,一個網卡面對訪問網
站的客戶端,一個網卡面對整個集群的內部。負責將客戶端的請求發送到一組服務器上執行,而客戶也
認為服務是來自這臺主的。舉個生動的例子,集群是個公司,負載調度器就是在外接攬生意,將接攬到
的生意分發給后臺的真正干活的真正的主機們。當然需要將活按照一定的算法分發下去,讓大家都公平
的干活。
服務器池(server pool/ Realserver),是一組真正執行客戶請求的服務器,可以當做WEB服務器。就
是上面例子中的小員工。
共享存儲(shared storage),它為服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相
同的內容,提供相同的服務。一個公司得有一個后臺賬目吧,這才能協調。不然客戶把錢付給了A,而
換B接待客戶,因為沒有相同的賬目。B說客戶沒付錢,那這樣就不是客戶體驗度的問題了。
負載均衡策略
LVS的DR模式
DR:direct routing(直接路由技術)
原理:
客戶端發送請求到DS的 VIP,數據包的目標 IP 為 VIP,目標 MAC 為調度器的 MAC
調度器接收數據包,根據負載均衡算法選擇 RS
調度器不修改 IP 地址,僅將數據包的目標 MAC 地址改為 RS 的 MAC(通過 ARP 獲取 RS 的 MAC 地址),然后轉發給 RS。此時數據包的目標 IP 仍為 VIP,源 IP 為CIP
RS 收到數據包后,發現目標 IP 是自身配置的 VIP(雖禁用 ARP 響應,但可接收發往 VIP 的數據包),于是處理請求并生成響應
RS 直接將響應數據包返回給客戶端(源 IP 為 VIP,目標 IP 為客戶端 IP),無需經過調度器
RS 響應時使用 VIP 作為源 IP,客戶端認為響應來自調度器(VIP),實現了負載均衡的透明性
優點:響應速度快,因為后端服務器可以直接將響應返回給客戶端,減輕了 LVS 負載均衡器的壓力。
限制:
所有服務器需要在同一個物理網絡中,并且后端服務器的網關不能指向 LVS 負載均衡器。調度器與 RS 必須在同一網段(受 MAC 廣播限制)
RS 需配置 VIP 并禁用 ARP 響應
firewall-cmd --add-masquerade
其作用是開啟網絡地址轉換(NAT)功能,也稱為 IP 偽裝(Masquerading)
特性
1.請求報文一定經過ds,而返還結果一定不經過ds,直接發給client
2.rs和ds要在同一物理網絡中
案例
ip配置
client
router
?lvs
rs1
rs2
1.在router中啟動路由內核功能
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
2.在rs1和rs2中解決相應問題
DR 模型中各主機上均需要配置 VIP ,解決地址沖突的方式有三種:
(1) 在前端網關做靜態綁定
(2) 在各 RS 使用 arptables
(3) 在各 RS 修改內核參數,來限制 arp 響應和通告的級別
限制響應級別 :arp_ignore
0: 默認值,表示可使用本地任意接口上配置的任意地址進行響應
1: 僅在請求的目標 IP 配置在本地主機的接收到請求報文的接口上時,才給予響應
限制通告級別 :arp_announce
0: 默認值,把本機所有接口的所有信息向每個接口的網絡進行通告
1: 盡量避免將接口信息向非直接連接網絡進行通告
2: 必須避免將接口信息向非本網絡進行通告
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce [root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
3.在rs1和2中安裝httpd,關閉防火墻
[root@RS1 ~]# yum install httpd -y
[root@RS1 ~]# echo "welcome to RS1 - 192.168.0.10" > /var/www/html/index.html
[root@RS1 ~]# systemctl restart httpd
[root@RS1 ~]# systemctl stop firewalld
[root@RS1 ~]# yum install httpd -y
[root@RS1 ~]# echo "welcome to RS1 - 192.168.0.10" > /var/www/html/index.html
[root@RS1 ~]# systemctl restart httpd
[root@RS1 ~]# systemctl stop firewalld
4.lvs中安裝ipvsadm添加策略
[root@lvs ~]# yum install ipvsadm -y[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 wrr-> 192.168.0.10:80 Route 1 0 0 -> 192.168.0.20:80 Route 2 0 0 [root@lvs ~]# systemctl stop firewalld
測試
[root@client ~]# for i in {1..10}; do curl 192.168.0.200; done
welcome to RS2 - 192.168.0.20
welcome to RS1 - 192.168.0.10
welcome to RS2 - 192.168.0.20
welcome to RS2 - 192.168.0.20
welcome to RS1 - 192.168.0.10
welcome to RS2 - 192.168.0.20
welcome to RS2 - 192.168.0.20
welcome to RS1 - 192.168.0.10
welcome to RS2 - 192.168.0.20
welcome to RS2 - 192.168.0.20
LVS的NAT模式
NAT:network address translation(網絡地址翻譯)
當用戶請求到達Director Server。此時報文的源IP為CIP,目標IP為VIP
DS接收數據包,根據負載均衡算法選擇一臺RS
調度器修改數據包的目標 IP 地址為 RS 的 IP,同時記錄連接狀態(通過 NAT 表或 conntrack 跟蹤),然后轉發給 RS
Real Server收到數據包開始構建響應報文發回給Director Server。 此時報文的源IP為RIP,目標IP為CIP
Director Server在響應客戶端前,此時會將源IP地址修改為自己的VIP地址,然后響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP
將修改后的響應數據包轉發給客戶端,完成一次請求響應流程
優點:配置簡單,只需要一個公網 IP 地址就可以實現負載均衡。
缺點:LVS 負載均衡器需要處理所有的請求和響應,容易成為性能瓶頸;而且后端服務器必須將網關指向 LVS 負載均衡器。
特性
1.?dip和rip在同一網段
2.RS使用私有地址,網關指向DIP
3.請求和響應報文都需要經過Director Server
案例
ip配置
lvs配置
在?lvs?中啟用內核路由功能
[root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
添加策略?
設置lvs策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr-> 192.168.0.10:80 Masq 1 0 0 -> 192.168.0.20:80 Masq 1 0 0
安裝ipvsadm?
[root@lvs ~]# yum install ipvsadm -y
在rs1和r2中安裝httpd,關閉防火墻
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo "welcome to webserver1 - 192.168.0.10" > /var/www/html/index.html
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# systemctl stop firewalld
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo "welcome to webserver2 - 192.168.0.20" > /var/www/html/index.html
[root@webserver2 ~]# systemctl restart httpd
[root@webserver2 ~]# systemctl stop firewalld
測試
[root@client ~]# for i in {1..10}; do curl 172.25.254.100; done
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
LVS的TUN模式
Tunnel 模式在國內使用的比較少,不過據說騰訊使用了大量的 Tunnel 模式。它也是一種單臂的模式,只有請求數據會經過 lvs,響應數據直接從后端服務器發送給客戶端,性能也很強大,同時支持跨機房。下邊繼續看圖分析原理
客戶端請求階段
客戶端發送請求到調度器的 VIP,數據包的目標 IP 為 VIP,源 IP 為客戶端 IP。
調度器接收數據包,根據負載均衡算法選擇 RS。
關鍵操作:調度器將原始數據包封裝在新的 IP 數據包中(外層 IP 頭的源 IP 為調度器 IP,目標 IP 為 RS 的 IP),通過 IP 隧道轉發給 RS。此時原始數據包的目標 IP 仍為 VIP,源 IP 為客戶端 IP。
RS 解封裝與響應階段
RS 收到隧道數據包后,解封裝獲取原始數據包,發現目標 IP 是自身配置的 VIP,于是處理請求并生成響應。
RS 直接將響應數據包返回給客戶端(源 IP 為 VIP,目標 IP 為客戶端 IP),無需經過調度器。
關鍵邏輯:RS 響應時使用 VIP 作為源 IP,客戶端認為響應來自調度器(VIP),實現跨網段的負載均衡
優點:后端服務器可以分布在不同的地理位置,擴展性好;LVS 負載均衡器只處理請求的轉發,壓力相對較小。
缺點:配置復雜,需要支持 IP 隧道協議;增加了數據包的封裝和解封裝過程,會帶來一定的性能開銷。
調度算法
靜態算法
rr
RR(輪詢:Round Robin), 算法就是按依次循環的方式將請求調度到不同的服務器上,該算法最大的特點就是實現簡單。輪詢算法假設所有的服務器處理請求的能力都一樣的,調度器會將所有的請求平均分配給每個真實服務器。特點是將收到的訪問請求按順序輪流分配給集群中的各節點真實服務器中,不管服務器實際的連接數和系統負載。輪詢 RS分別被調度,當RS配置有差別時不推薦
wrr
WRR(加權輪詢:Weighted Round Robin),算法主要是對輪詢算法的一種優化與補充,LVS會考慮每臺服務器的性能,并給每臺服務器添加一個權值,如果服務器A的權值為1,服務器B的權值為2,則調度器調度到服務器B的請求會是服務器A的兩倍。權值越高的服務器,處理的請求越多。加權輪詢根據RS的配置進行加權調度,性能差的RS被調度的次數少
sh
SH( 源地址散列調度:Source Hashing )源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定
算法先根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且并未超載,將請求發送到該服務器,否則返回空。它采用的散列函數與目標地址散列調度算法的相同,它的算法流程與目標地址散列調度算法的基本相似。
dh
目標地址哈希,第一次輪詢調度至RS,后續將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡,如:寬帶運營商
DH(目標地址散列調度:Destination Hashing )算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且并未超載,將請求發送到該服務器,否則返回空。
動態算法
LC(最小連接調度:Least Connections )算法是把新的連接請求分配到當前連接數最小的服務器。最小連接調度是一種動態的調度算法,它通過服務器當前活躍的連接數來估計服務器的情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1;當連接中斷或者超時,其連接數減1。
適用于長連接應用Overhead(負載值)=activeconns(活動鏈接數) x 256+inactiveconns(非活動鏈接數) (集群系統的真實服務器具有相近的系統性能,采用最小連接調度算法可以比較好地均衡負載。) ?
WLC(加權最少連接:(Weight Least Connections )算法是最小連接調度的超集,各個服務器相應的權值表示其處理性能。服務器的缺省權值為1,系統管理員可以動態地設置服務器的權值。加權最小連接調度在調度新連接時盡可能使服務器的已建立連接數和其權值成比例。調度器可以自動問詢真實服務器的負載情況,并動態地調整其權值。默認調度方法Overhead=(activeconns x 256+inactiveconns)/weight
LBLC(基于局部的最少連接調度:Locality-Based Least Connections )算法是針對請求報文的目標IP地址的 負載均衡調度,目前主要用于Cache集群系統,因為在Cache集群客戶請求報文的目標IP地址是變化的。這里假設任何后端服務器都可以處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺服務器,來提高各臺服務器的訪問局部性和Cache命中率,從而提升整個集群系統的處理能力。LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于一半的工作負載,則使用’最少連接’的原則選出一個可用的服務器,將請求發送到服務器。
LBLCR(帶復制的基于局部性的最少連接:Locality-Based Least Connections with Replication )算法也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統,它與LBLC算法不同之處是它要維護從一個目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。按’最小連接’原則從該服務器組中選出一一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按’最小連接’原則從整個集群中選出一臺服務器,將該服務器加入到這個服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。
SED (最短的期望的延遲調度:Shortest Expected Delay )算法基于WLC算法。舉個例子吧,ABC三臺服務器的權重分別為1、2、3 。那么如果使用WLC算法的話一個新請求進入時它可能會分給ABC中的任意一個。使用SED算法后會進行一個運算 A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把請求交給得出運算結果最小的服務器。 預期的延遲時間為(Ci +1)/ Ui,其中 Ci 是第 i 個服務器上的連接數,而 Ui 是第 i 個服務器的固定服務速率(權重)
初始連接高權重優先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,當node1的權重為1,node2的權重為10,經過運算前幾次的調度都會被node2承接 ?
NQ(最少隊列調度:Never Queue )算法,無需隊列。如果有realserver的連接數等于0就直接分配過去,不需要在進行SED運算。
軟件相關信息
配置文件:/etc/sysconfig/ipvsadm-config 程序包: ipvsadm Unit File: ipvsadm.service 主程序: /usr/sbin/ipvsadm 規則保存工具: /usr/sbin/ipvsadm-save 規則重載工具: /usr/sbin/ipvsadm-restore ipvs 調度規則文件: /etc/sysconfig/ipvsadm
ipvsadm
ipvsadm命令是LVS在應用層的管理命令,我們可以通過這個命令去管理LVS的配置。 ipvsadm是一個工具,同時它也是一條命令,用于管理LVS的策略規則。
子命令
--add-service ? ? -A ? ? ? 添加一個集群服務,需要使用選項--edit-service ? -E ? ? ? 編輯一個集群服務,需要使用選項--delete-service -D ? ? ? 刪除指定集群服務,需要使用選項--clear ? ? ? ? ? -C ? ? ? 刪除所有集群服務,包括真實服務器轉發策略規則--restore ? ? ? ? -R ? ? ? 從標準輸入中恢復策略規則--save ? ? ? ? ? -S ? ? ? 保存策略規則到標準輸出--add-server ? ? -a ? ? ? 添加一個真實服務器,需要使用選項--edit-server ? ? -e ? ? ? 編輯一個真實服務器,需要使用選項--delete-server ? -d ? ? ? 刪除一個真實服務器,需要使用選項--list ? ? ? ? ? -L|-l ? ? 查看集群服務列表,包括真實服務器轉發策略規則--zero ? ? ? ? ? -Z ? ? ? 計數器清零。清除連接數、包轉發等數量統計信息 --set <超時時間> ? ? ? ? ? 設置TCP、TCPFIN(TCP關閉連接狀態)、UDP連接超時時間,用于會話保持。一般情況下TCP和UDP超時時間保持默認就好,TCPFIN可以根據情況設定,指定它則用戶請求連接關閉,該連接則會變為非活躍(InActive)空閑等待狀態,在空閑等待時間內,如果來自同一源IP的請求,則還會轉發給后端的同一臺真實服務器上--start-daemon ? ? ? ? ? ? 開啟連接同步守護進程。在選項后面指定自己是Master(主)還是backup(備),主負載調度器會同步所有策略及連接狀態到備負載調度器,當主故障,備可以接替其工作--stop-daemon ? ? ? ? ? ? ? 停止連接同步守護進程--help ? ? ? ? ? -h ? ? ? 顯示幫助信息
選項
--tcp-service -t <集群服務地址> ? 允許集群服務使用的傳輸協議為TCP。<IP:Port>--udp-service -u <集群服務地址> ? 允許集群服務使用的傳輸協議為UDP。<IP:Port>--fwmark-service -f <防火墻標識> ? 使用一個整數值來防火墻標識集群服務,而不是地址、端口和協議使用它,我們可以通過結合IPtables將多個以調度器為目標的端口定義成一個防火墻標識,由ipvsdam通過此項關聯標識,則可以實現對一個IP多端口調度,即實現后端服務器可以開放多個服務--scheduler ? -s scheduler ? ? ? ? 指定集群服務使用的調度算法:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認為wlc--persistent ? -p <超時時間> ? ? ? 開啟持久化服務,開啟它則表示在指定時間內,來自同一IP的請求都會轉發到后端同一臺真實服務器上--netmask ? ? -M <網絡掩碼> ? ? ? 使用網絡掩碼來屏蔽持久化來源IP的地址范圍,默認值為255.255.255.255,即所有來源IP請求都會享受持久化服務--real-server -r <真實服務器地址> 指定真實服務器的主機IP與端口--gatewaying ? -g ? ? ? ? ? ? ? ? ? 指定真實服務器轉發工作模式,使用DR模式,默認--ipip ? ? ? ? -i ? ? ? ? ? ? ? ? ? 指定真實服務器轉發工作模式,使用TUN模式--masquerading -m ? ? ? ? ? ? ? ? ? 指定真實服務器轉發工作模式,使用NAT模式--weight ? ? ? -w <權重值> ? ? ? ? 指定真實服務器的權重值--u-threshold -x <上閥值> ? ? ? ? 設置轉發請求的最大上連接閥值,范圍為0~65535,當當連接數超過指定上限時,LVS則不會轉發請求 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --l-threshold -y <下閥值> ? ? ? ? 設置轉發請求的下連接閥值,范圍為0~65535,當連接數降低至指定值時,LVS則繼續提供服務,默認值為0--mcast-interface interface ? ? ? ? 設置用于連接同步守護進程的組播接口--syncid sid ? ? ? ? ? ? ? ? ? ? ? 設置連接同步守護進程的SID號,用于標識,范圍0~255--connection ? -c ? ? ? ? ? ? ? ? ? 顯示連接信息,一般與"-l"連用--timeout ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示TCP、TCPFIN、UDP超時時間信息,一般與"-l"連用--daemon ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示連接同步守護信息,一般與"-l"連用--stats ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示統計信息,一般與"-l"連用--rate ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示轉發速率信息,一般與"-l"連用--exact ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示數據包和字節計數器的確切值,擴大字符長度--thresholds ? ? ? ? ? ? ? ? ? ? ? 顯示閥值信息,一般與"-l"連用--persistent-conn ? ? ? ? ? ? ? ? ? 顯示持久化連接信息,一般與"-l"連用--numeric ? ? -n ? ? ? ? ? ? ? ? ? 地址和端口以數字格式顯示,一般與"-l"連用--sched-flags -b <標識> ? ? ? ? ? 設置調度算法的范圍標識,用于SH算法,有兩個標識:sh-fallback,如果真實服務器不可用,則將其轉發到其他真實服務器上。sh-port,將源地址的端口號也添加到散列鍵=值中 ?