LVS詳解

来源:https://www.cnblogs.com/wdliu/archive/2019/01/16/10279091.html
-Advertisement-
Play Games

一、LVS介紹 簡介 LVS是Linux Virtual Server的簡稱,即Linux虛擬伺服器,創始人前阿裡雲首席科學家章文嵩(現已經在滴滴),官方網站:www.linuxvirtualserver.org。從內核版本2.4開始,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直 ...


一、LVS介紹

簡介

    LVS是Linux Virtual Server的簡稱,即Linux虛擬伺服器,創始人前阿裡雲首席科學家章文嵩博士(現已經在滴滴),官方網站:www.linuxvirtualserver.org。從內核版本2.4開始,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。通過LVS提供的負載均衡技術和Linux操作系統可實現一個高性能、高可用的伺服器群集,它具有良好可靠性、可擴展性和可操作性,以低廉的成本實現最優的服務性能。  

通用體繫結構

  LVS集群採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的伺服器上執行,且調度器自動屏蔽掉服 務器的故障,從而將一組伺服器構成一個高性能的、高可用的虛擬伺服器。整個伺服器集群的結構對客戶是透明的,而且無需修改客戶端和伺服器端的程式,以下是體繫結構圖(來源http://www.linuxvirtualserver.org/architecture.html):

 

  • 負載調度器(load balancer),它是整個集群對外面的前端機,負責將客戶的請求發送到一組伺服器上執行。
  • 伺服器池(server pool),是一組真正執行客戶請求的伺服器,可以是WEB、MAIL、FTP和DNS伺服器等。
  • 共用存儲(shared storage),它為伺服器池提供一個共用的存儲區,這樣很容易使得伺服器池擁有相同的內容,提供相同的服務,例如資料庫、分散式文件系統、網路存儲等。

 優缺點

  • 高併發連接:LVS基於內核網路層面工作,有超強的承載能力和併發處理能力。單台LVS負載均衡器,可支持上萬併發連接。穩定性強:是工作在網路4層之上僅作分發之用,這個特點也決定了它在負載均衡軟體里的性能最強,穩定性最好,對記憶體和cpu資源消耗極低。
  • 成本低廉:硬體負載均衡器少則十幾萬,多則幾十萬上百萬,LVS只需一臺伺服器和就能免費部署使用,性價比極高。
  • 配置簡單:LVS配置非常簡單,僅需幾行命令即可完成配置,也可寫成腳本進行管理。
  • 支持多種演算法:支持8種負載均衡演算法,可根據業務場景靈活調配進行使用。
  • 支持多種工作模型:可根據業務場景,使用不同的工作模式來解決生產環境請求處理問題。
  • 應用範圍廣:因為LVS工作在4層,所以它幾乎可以對所有應用做負載均衡,包括http、資料庫、DNS、ftp服務等等。
  • 缺點:工作在4層,不支持7層規則修改,機制過於龐大,不適合小規模應用。

組件和專業術語

組件:
  • ipvsadm:用戶空間的客戶端工具,用於管理集群服務及集群服務上的RS等;
  • ipvs:工作於內核上的netfilter INPUT鉤子之上的程式,可根據用戶定義的集群實現請求轉發;
專業術語:
  • VS:Virtual Server ,虛擬服務
  • Director: Balancer ,也叫DS(Director Server)負載均衡器、分發器
  • RS:Real Server ,後端請求處理伺服器,真實伺服器
  • CIP: Client IP ,客戶端IP
  • VIP:Director Virtual IP ,負載均衡器虛擬IP
  • DIP:Director IP ,負載均衡器IP
  • RIP:Real Server IP ,後端請求處理的伺服器IP

工作模型  

VS工作在內核空間,基於內核包處理框架Netfilter實現的一種負責均衡技術,其在工作模式如上圖,大致過程:
  1. 當客戶端的請求到達負載均衡器的內核空間時,首先會到達PREROUTING鏈。
  2. 當內核發現請求數據包的目的地址是本機時,將數據包送往INPUT鏈。
  3. LVS由用戶空間的ipvsadm和內核空間的IPVS組成,ipvsadm用來定義規則,IPVS利用ipvsadm定義的規則工作,IPVS工作在INPUT鏈上,當數據包到達INPUT鏈時,首先會被IPVS檢查,如果數據包裡面的目的地址及埠沒有在規則裡面,那麼這條數據包將被放行至用戶空間。
  4. 如果數據包裡面的目的地址及埠在規則裡面,那麼這條數據報文將被修改目的地址為事先定義好的後端伺服器,並送往POSTROUTING鏈。
  5. 最後經由POSTROUTING鏈發往後端伺服器。

二、負載均衡模式

LVS-NAT模式

簡介

  NAT模式稱為全稱Virtualserver via Network address translation(VS/NAT),是通過網路地址轉換的方法來實現調度的。首先調度器(Director)接收到客戶的請求數據包時(請求的目的IP為VIP),根據調度演算法決定將請求發送給哪個後端的真實伺服器(RS)。然後調度就把客戶端發送的請求數據包的目標IP地址及埠改成後端真實伺服器的IP地址(RIP),這樣真實伺服器(RS)就能夠接收到客戶的請求數據包了。真實伺服器響應完請求後,查看預設路由(NAT模式下我們需要把RS的預設路由設置為DS伺服器。)把響應後的數據包發送給DS,DS再接收到響應包後,把包的源地址改成虛擬地址(VIP)然後發送回給客戶端。

具體工作流程:

說明:

(1)當用戶請求到達DirectorServer,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP。 (2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈。 (3) IPVS比對數據包請求的服務是否為集群服務,若是,修改數據包的目標IP地址為後端伺服器IP,然後將數據包發至POSTROUTING鏈。 此時報文的源IP為CIP,目標IP為RIP ,在這個過程完成了目標IP的轉換(DNAT)。 (4) POSTROUTING鏈通過選路,將數據包發送給Real Server。 (5) Real Server比對發現目標為自己的IP,開始構建響應報文發回給Director Server。 此時報文的源IP為RIP,目標IP為CIP 。 (6) Director Server在響應客戶端前,此時會將源IP地址修改為自己的VIP地址(SNAT),然後響應給客戶端。 此時報文的源IP為VIP,目標IP為CIP。    NAT模式優缺點:
  1. NAT技術將請求的報文和響應的報文都需要通過DS進行地址改寫,因此網站訪問量比較大的時候DS負載均衡調度器有比較大的瓶頸,一般要求最多之能10-20台節點。
  2. 節省IP,只需要在DS上配置一個公網IP地址就可以了。
  3. 每台內部的節點伺服器的網關地址必須是調度器LB的內網地址。
  4. NAT模式支持對IP地址和埠進行轉換。即用戶請求的埠和真實伺服器的埠可以不一致。 
  地址變化過程:

LVS-DR模式

簡介

  全稱:Virtual Server via Direct Routing(VS-DR),也叫直接路由模式,用直接路由技術實現虛擬伺服器。當參與集群的電腦和作為控制管理的電腦在同一個網段時可以用此方法,控制管理的電腦接收到請求包時直接送到參與集群的節點。直接路由模式比較特別,很難說和什麼方面相似,前種模式基本上都是工作在網路層上(三層),而直接路由模式則應該是工作在數據鏈路層上(二層)。

    工作原理    DS和RS都使用同一個IP對外服務。但只有DS對ARP請求進行響應,所有RS對本身這個IP的ARP請求保持靜默(對ARP請求不做響應),也就是說,網關會把對這個服務IP的請求全部定向給DS,而DS收到數據包後根據調度演算法,找出對應的 RS,把目的MAC地址改為RS的MAC併發給這台RS。這時RS收到這個數據包,則等於直接從客戶端收到這個數據包無異,處理後直接返回給客戶端。由於DS要對二層包頭進行改換,所以DS和RS之間必須在一個廣播域,也可以簡單的理解為在同一臺交換機上。   工作流程

說明:

  1. 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP為CIP,目標IP為VIP;
  2. PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈;
  3. IPVS比對數據包請求的服務是否為集群服務,若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址,然後將數據包發至POSTROUTING鏈。 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址;
  4. 由於DS和RS在同一個網路中,所以是通過二層,數據鏈路層來傳輸。POSTROUTING鏈檢查目標MAC地址為RIP的MAC地址,那麼此時數據包將會發至Real Server;
  5. RS發現請求報文的MAC地址是自己的MAC地址,就接收此報文。處理完成之後,將響應報文通過lo介面傳送給eth0網卡然後向外發出。 此時的源IP地址為VIP,目標IP為CIP;
  6. 響應報文最終送達至客戶端。

地址變化過程

 

  DR模式特點以及註意事項:

  1. 在前端路由器做靜態地址路由綁定,將對於VIP的地址僅路由到Director Server
  2. 在arp的層次上實現在ARP解析時做防火牆規則,過濾RS響應ARP請求。修改RS上內核參數(arp_ignore和arp_announce)將RS上的VIP配置在網卡介面的別名上,並限制其不能響應對VIP地址解析請求。
  3. RS可以使用私有地址;但也可以使用公網地址,此時可以直接通過互聯網連入RS以實現配置、監控等;
  4. RS的網關一定不能指向DIP;
  5. 因為DR模式是通過MAC地址改寫機制實現轉發,RS跟Dirctory要在同一物理網路內(不能由路由器分隔);
  6. 請求報文經過Directory,但響應報文一定不經過Director
  7. 不支持埠映射;
  8. RS可以使用大多數的操作系統;
  9. RS上的lo介面配置VIP的IP地址; 

 

LVS- UN模式

介紹

    在VS/NAT 的集群系統中,請求和響應的數據報文都需要通過負載調度器,當真實伺服器的數目在10台和20台之間時,負載調度器將成為整個集群系統的新瓶頸。大多數 Internet服務都有這樣的特點:請求報文較短而響應報文往往包含大量的數據。如果能將請求和響應分開處理,即在負載調度器中只負責調度請求而響應直 接返回給客戶,將極大地提高整個集群系統的吞吐量。     IP隧道(IP tunneling)是將一個IP報文封裝在另一個IP報文的技術,這可以使得目標為一個IP地址的數據報文能被封裝和轉發到另一個IP地址。IP隧道技 術亦稱為IP封裝技術(IP encapsulation)。IP隧道主要用於移動主機和虛擬私有網路(Virtual Private Network),在其中隧道都是靜態建立的,隧道一端有一個IP地址,另一端也有唯一的IP地址。     在TUN模式下,利用IP隧道技術將請求報文封裝轉發給後端伺服器,響應報文能從後端伺服器直接返回給客戶。但在這裡,後端伺服器有一組而非一個,所以我們不可能靜態地建立一一對應的隧道,而是動態地選擇 一臺伺服器,將請求報文封裝和轉發給選出的伺服器。   工作流程
  1. 客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址為VIP。
  2. 負載均衡器收到報文後,發現請求的是在規則裡面存在的地址,那麼它將在客戶端請求報文的首部再封裝一層IP報文,將源地址改為DIP,目標地址改為RIP,並將此包發送給RS。
  3. RS收到請求報文後,會首先拆開第一層封裝,然後發現裡面還有一層IP首部的目標地址是自己lo介面上的VIP,所以會處理次請求報文,並將響應報文通過lo介面送給eth0網卡直接發送給客戶端。註意:需要設置lo介面的VIP不能在共網上出現

地址變化過程

 

 

FULL-NAT模式

  

介紹     FULL-NAT模式可以實際上是根據LVS-NAT模式的一種擴展。在NAT模式下DS需要先對請求進行目的地址轉換(DNAT),然後對響應包進行源地址轉換(SNAT),先後進行兩次NAT,而 FULL-NAT則分別對請求進行和響應進行DNAT和SNAT,進行4次NAT,當然這樣多次數的NAT會對性能大大削減,但是由於對請求報文的目的地址和源地址都進行了轉換,後端的RS可以不在同一個VLAN下。    工作流程   

 

說明:
  1. 首先client 發送請求package給VIP;
  2. VIP 收到package後,會根據LVS設置的LB演算法選擇一個合適的RS,然後把package 的目地址修改為RS的ip地址,把源地址改成DS的ip地址;
  3. RS收到這個package後發現目標地址是自己,就處理這個package ,處理完後把這個包發送給DS;
  4. DS收到這個package 後把源地址改成VIP的IP,目的地址改成CIP(客戶端ip),然後發送給客戶端;

優缺點:
  1. RIP,DIP可以使用私有地址;
  2. RIP和DIP可以不再同一個網路中,且RIP的網關未必需要指向DIP;
  3. 支持埠映射;
  4. RS的OS可以使用任意類型;
  5. 請求報文經由Director,響應報文也經由Director;
  6. FULL-NAT因為要經過4次NAT,所以性能比NAT還要低;
  7. 由於做了源地址轉換,RS無法獲取到客戶端的真實IP; 

 

各個模式的區別 

lvs-nat與lvs-fullnat:請求和響應報文都經由Director      lvs-nat:RIP的網關要指向DIP      lvs-fullnat:RIP和DIP未必在同一IP網路,但要能通信 lvs-dr與lvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client      lvs-dr:通過封裝新的MAC首部實現,通過MAC網路轉發      lvs-tun:通過在原IP報文外封裝新IP頭實現轉發,支持遠距離通信

 

三、調度演算法 

LVS在內核中的負載均衡調度是以連接為粒度的。在HTTP協議(非持久)中,每個對象從WEB伺服器上獲取都需要建立一個TCP連接,同一用戶 的不同請求會被調度到不同的伺服器上,所以這種細粒度的調度在一定程度上可以避免單個用戶訪問的突發性引起伺服器間的負載不平衡。在內核中的連接調度演算法上,IPVS已實現了以下八種調度演算法:
  • 輪叫調度rr(Round-Robin Scheduling)
  • 加權輪叫調度wrr(Weighted Round-Robin Scheduling)
  • 最小連接調度lc(Least-Connection Scheduling)
  • 加權最小連接調度wlc(Weighted Least-Connection Scheduling)
  • 基於局部性的最少鏈接LBLC(Locality-Based Least Connections Scheduling)
  • 帶複製的基於局部性最少鏈接LBLCR(Locality-Based Least Connections with Replication Scheduling)
  • 目標地址散列調度DH(Destination Hashing Scheduling)
  • 源地址散列調度SH(Source Hashing Scheduling)

rr(輪詢)

  輪詢調度:這種是最簡單的調度演算法,調度器把用戶請求按順序1:1的分配到集群中的每個Real Server上,這種演算法平等地對待每一臺Real Server,而不管伺服器的壓力和負載狀況。

wrr(權重, 即加權輪詢)

    加權輪叫調度(Weighted Round-Robin Scheduling)演算法可以解決伺服器間性能不一的情況,它用相應的權值表示伺服器的處理性能,伺服器的預設權值為1。假設伺服器A的權值為1,B的 權值為2,則表示伺服器B的處理性能是A的兩倍。加權輪叫調度演算法是按權值的高低和輪叫方式分配請求到各伺服器。權值高的伺服器先收到的連接,權值高的服 務器比權值低的伺服器處理更多的連接,相同權值的伺服器處理相同數目的連接數

sh(源地址哈希)

  源地址散列:主要是實現將此前的session(會話)綁定。將此前客戶的源地址作為散列鍵,從靜態的散列表中找出對應的伺服器,只要目標伺服器是沒有超負荷的就將請求發送過去。就是說某客戶訪問過A,現在這個客戶又來了,所以客戶請求會被髮送到服務過他的A主機。

dh(目的地址哈希)

  目標地址散列調度(Destination Hashing Scheduling)演算法也是針對目標IP地址的負載均衡,但它是一種靜態映射演算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺伺服器。

lc(最少鏈接)

  最小連接調度(Least-Connection Scheduling)演算法是把新的連接請求分配到當前連接數最小的伺服器。最小連接調度是一種動態調度演算法,它通過伺服器當前所活躍的連接數來估計服務 器的負載情況。調度器需要記錄各個伺服器已建立連接的數目,當一個請求被調度到某台伺服器,其連接數加1;當連接中止或超時,其連接數減一。

wlc(加權最少鏈接)LVS的理想演算法

    加權最小連接調度(Weighted Least-Connection Scheduling)演算法是最小連接調度的超集,各個伺服器用相應的權值表示其處理性能。伺服器的預設權值為1,系統管理員可以動態地設置伺服器的權 值。加權最小連接調度在調度新連接時儘可能使伺服器的已建立連接數和其權值成比例。 

LBLC(基於局部性的最少連接)

  這個演算法主要用於Cache集群系統,因為Cache集群的中客戶請求報文的目標IP地址的變化,將相同的目標URL地址請求調度到同一臺伺服器,來提高伺服器的訪問的局部性和Cache命中率。從而調整整個集群的系統處理能力。但是,如果realserver的負載處於一半負載,就用最少鏈接演算法,將請求發送給活動鏈接少的主機。 

LBLCR(帶複製的基於局部性的最少鏈接)

  該演算法首先是基於最少鏈接的,當一個新請求收到後,一定會將請求發給最少連接的那台主機的。但這樣又破壞了cache命中率。但這個演算法中,集群服務是cache共用的,假設A的PHP跑了一遍,得到緩存。但其他realserver可以去A那裡拿緩存,這是種緩存複製機制。

 

四、管理工具ipvsadm使用

   ipvsadm是LVS的管理工具,ipvsadm工作在用戶空間,用戶通過ipvsadm命令編寫負載均衡規則。

安裝

yum install ipvsadm -y 
###文件說明
Unit 文件: ipvsadm.service
主程式:/usr/sbin/ipvsadm
規則保存工具:/usr/sbin/ipvsadm-save
規則重載工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config

用法以及參數

ipvsadm --help #查看使用方法及參數
命令:
-A, --add-service: #添加一個集群服務. 即為ipvs虛擬伺服器添加一個虛擬服務,也就是添加一個需要被負載均衡的虛擬地址。虛擬地址需要是ip地址,埠號,協議的形式。
-E, --edit-service: #修改一個虛擬服務。
-D, --delete-service: #刪除一個虛擬服務。即刪除指定的集群服務;
-C, --clear: #清除所有虛擬服務。
-R, --restore: #從標準輸入獲取ipvsadm命令。一般結合下邊的-S使用。
-S, --save: #從標準輸出輸出虛擬伺服器的規則。可以將虛擬伺服器的規則保存,在以後通過-R直接讀入,以實現自動化配置。
-a, --add-server: #為虛擬服務添加一個real server(RS)
-e, --edit-server: #修改RS
-d, --delete-server: #刪除
-L, -l, --list: #列出虛擬服務表中的所有虛擬服務。可以指定地址。添加-c顯示連接表。
-Z, --zero: #將所有數據相關的記錄清零。這些記錄一般用於調度策略。
--set tcp tcpfin udp: #修改協議的超時時間。
--start-daemon state: #設置虛擬伺服器的備伺服器,用來實現主備伺服器冗餘。(註:該功能只支持ipv4)
--stop-daemon: #停止備伺服器。

 
參數:
以下參數可以接在上邊的命令後邊。
-t, --tcp-service service-address: #指定虛擬服務為tcp服務。service-address要是host[:port]的形式。埠是0表示任意埠。如果需要將埠設置為0,還需要加上-p選項(持久連接)。
-u, --udp-service service-address: #使用udp服務,其他同上。
-f, --fwmark-service integer: #用firewall mark取代虛擬地址來指定要被負載均衡的數據包,可以通過這個命令實現把不同地址、埠的虛擬地址整合成一個虛擬服務,可以讓虛擬伺服器同時截獲處理去往多個不同地址的數據包。fwmark可以通過iptables命令指定。如果用在ipv6需要加上-6。
-s, --scheduler scheduling-method: #指定調度演算法,預設是wlc。調度演算法可以指定以下8種:rr(輪詢),wrr(權重),lc(最後連接),wlc(權重),lblc(本地最後連接),lblcr(帶複製的本地最後連接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延遲),nq(永不排隊)
-p, --persistent [timeout]: #設置持久連接,這個模式可以使來自客戶的多個請求被送到同一個真實伺服器,通常用於ftp或者ssl中。
-M, --netmask netmask: #指定客戶地址的子網掩碼。用於將同屬一個子網的客戶的請求轉發到相同伺服器。
-r, --real-server server-address: #為虛擬服務指定數據可以轉發到的真實伺服器的地址。可以添加埠號。如果沒有指定埠號,則等效於使用虛擬地址的埠號。
[packet-forwarding-method]: #此選項指定某個真實伺服器所使用的數據轉發模式。需要對每個真實伺服器分別指定模式。
-g, --gatewaying: #使用網關(即直接路由),此模式是預設模式。
-i, --ipip: #使用ipip隧道模式。
-m, --masquerading: #使用NAT模式。
-w, --weight weight:  #設置權重。權重是0~65535的整數。如果將某個真實伺服器的權重設置為0,那麼它不會收到新的連接,但是已有連接還會繼續維持(這點和直接把某個真實伺服器刪除時不同的)。
-x, --u-threshold uthreshold: #設置一個伺服器可以維持的連接上限。0~65535。設置為0表示沒有上限。
-y, --l-threshold lthreshold: #設置一個伺服器的連接下限。當伺服器的連接數低於此值的時候伺服器才可以重新接收連接。如果此值未設置,則當伺服器的連接數連續三次低於uthreshold時伺服器才可以接收到新的連接。
--mcast-interface interface: #指定使用備伺服器時候的廣播介面。
--syncid syncid:#指定syncid, 同樣用於主備伺服器的同步。
 
#以下選項用於list(-l)命令:
-c, --connection: #列出當前的IPVS連接。
--timeout: #列出超時
--stats: #狀態信息
--rate: #傳輸速率
--thresholds: #列出閾值
--persistent-conn: #持久連接
--sor: #把列表排序
--nosort: #不排序
-n, --numeric: #不對ip地址進行dns查詢
--exact: #單位
-6: 如#果fwmark用的是ipv6地址需要指定此選項。    
     
#如果使用IPv6地址,需要在地址兩端加上"[]"。例如:ipvsadm -A -t [2001:db8::80]:80 -s rr

LVS集群管理示例

####管理LVS集群中的RealServer舉例
1) 添加RS : -a
# ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
  
#舉例1: 往VIP資源為10.1.210.58的集群服務里添加1個realserver
ipvsadm -a -t 10.1.210.58 -r 10.1.210.52 –g -w 5

  
2) 修改RS : -e
# ipvsadm -e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
  
#舉例2: 修改10.1.210.58集群服務里10.1.210.52這個realserver的權重為3
ipvsadm -e -t 10.1.210.58:80 -r 10.1.210.52 –g -w 3
  
3) 刪除RS : -d
# ipvsadm -d -t|u|f service-address -r server-address
  
#舉例3: 刪除10.1.210.58集群服務里10.1.210.52這個realserver
ipvsadm -d -t 10.1.210.58:80 -r 10.1.210.52


4) 清除規則 (刪除所有集群服務), 該命令與iptables的-F功能類似,執行後會清除所有規則:
# ipvsadm -C
  
5) 保存及讀取規則:
# ipvsadm -S > /path/to/somefile
# ipvsadm-save > /path/to/somefile
# ipvsadm-restore < /path/to/somefile


####管理LVS集群服務的查看
# ipvsadm -L|l [options]
   options可以為:
   -n:數字格式顯示
   --stats 統計信息
   --rate:統計速率
   --timeout:顯示tcp、tcpinfo、udp的會話超時時長
   -c:連接客戶端數量
  
#查看lvs集群轉發情況
# ipvsadm -Ln

  
#查看lvs集群的連接狀態
# ipvsadm -l --stats

  
說明:
Conns    (connections scheduled)  已經轉發過的連接數
InPkts   (incoming packets)       入包個數
OutPkts  (outgoing packets)       出包個數
InBytes  (incoming bytes)         入流量(位元組)
OutBytes (outgoing bytes)         出流量(位元組)
  
#查看lvs集群的速率
ipvsadm -l --rate
  
說明:
CPS      (current connection rate)   每秒連接數
InPPS    (current in packet rate)    每秒的入包個數
OutPPS   (current out packet rate)   每秒的出包個數
InBPS    (current in byte rate)      每秒入流量(位元組)
OutBPS   (current out byte rate)      每秒入流量(位元組)

五、案例篇

環境

伺服器系統:centos7.4 調度伺服器DS:10.1.210.51 兩台真實服務RS:10.1.210.52、10.1.210.53 VIP:10.1.210.58 

LVS-DR模式案例

   centos7預設已經將ipvs編譯進內核模塊,名稱為ip_vs,使用時候需要先載入該內核模塊。

以下步驟需要在DS上進行:

1.載入ip_vs模塊

modprobe ip_vs #載入ip_vs模塊
cat /proc/net/ip_vs #查看是否載入成功
lsmod | grep ip_vs   #查看載入的模塊
yum install ipvsadm # 安裝管理工具

2.配置調度腳本dr.sh

#!/bin/bash

VIP=10.1.210.58  #虛擬IP
RIP1=10.1.210.52 #真實伺服器IP1
RIP2=10.1.210.53 #真實伺服器IP2
PORT=80 #
ifconfig ens192:1 $VIP broadcast $VIP netmask 255.255.255.255 up #添加VIP,註意網卡名稱
echo 1 > /proc/sys/net/ipv4/ip_forward    #開啟轉發
 route add -host $VIP dev ens192:1    #添加VIP路由
/sbin/ipvsadm -C      #清空ipvs中的規則
/sbin/ipvsadm -A -t $VIP:80 -s wrr  #添加調度器
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 #添加RS
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1 #添加RS
/sbin/ipvsadm -ln  #查看規則

3.執行腳本

[root@app51 ~]# sh dr.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.210.58:80 wrr
  -> 10.1.210.52:80               Route   1      0          0         
  -> 10.1.210.53:80               Route   1      0          0 

 

以下步驟需要在RS上執行:

1.真實服務RS配置腳本rs.sh

#!/bin/bash
VIP=10.1.210.58  #RS上VIP地址
#關閉內核arp響應,永久修改配置參數到/etc/sysctl.conf,目的是為了讓rs順利發送mac地址給客戶端
 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore     
 echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
 echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up  #綁定VIP到RS伺服器上
/sbin/route add -host $VIP dev lo:0  #添加VIP路由

2.執行腳本

sh rs.sh

3.配置測試web服務(以一臺為示例)

systemctl stop firewalld  #關閉防火牆
systemctl disable firewalld #禁止開機啟動
yum install httpd #安裝httpd


###RS1虛擬主機配置
vi /etc/httpd/conf/httpd.conf
ServerName 10.1.210.52:80
echo "RS 10.1.210.52" > /var/www/html/index.html

###RS2虛擬主機配置

vi /etc/httpd/conf/httpd.conf
ServerName 10.1.210.53:80
echo "RS 10.1.210.53" > /var/www/html/index.html

#啟動httpd服務
systemctl start httpd

測試 調度演算法是輪訓,所以結果是交替出現 。
[root@node1 ~]# for i in {1..10} ;do curl http://10.1.210.58 ;done
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52

LVS-NAT案例

  LVS-NAT模式和DR區別要做nat,並且請求和響應都要經過DS,所有需要將RS網關指向DS,由於之前測試過DR模式,在測試NAT模式時候需要將RS環境恢復,RS恢復步驟如下:

echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore     
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 down

調度服務DS配置

#!/bin/bash

VIP=10.1.210.58  #虛擬IP
RIP1=10.1.210.52 #真實伺服器IP1
RIP2=10.1.210.53 #真實伺服器IP2
PORT=80 #
ifconfig ens192:1 $VIP broadcast $VIP netmask 255.255.255.255 up #添加VIP
echo 1 > /proc/sys/net/ipv4/ip_forward    #開啟轉發
 route add -host $VIP dev ens192:1    #添加VIP路由
/sbin/ipvsadm -C      #清空ipvs中的規則
/sbin/ipvsadm -A -t $VIP:80 -s wlc  #添加調度器
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m -w 1 #添加RS
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m -w 1 #添加RS
/sbin/ipvsadm -ln  #查看規則

RS配置

  nat模式RS配置很簡單,只需要將RS路由指向DS

vi /etc/sysconfig/network-scripts/ifcfg-ens192 
GATEWAY=10.1.210.58 #修改網關至RS地址
systemctl restart network #重啟網路

測試

   由於這裡的環境DS和RS在同一個網段下,NAT模式下如果客戶端是同網段情況下,RS響應的時候直接響應給同網段的伺服器了並不經過DS,這樣就導致客戶端會丟棄該請求。如果想要同網段的想要訪問到DS則需要添加路由,這裡需要RS在響應同網段伺服器時候網關指向DS,這樣同網段就能訪問到DS了,示例:

route add -net 10.1.210.0/24 gw 10.1.210.58

測試結果:

[root@app36 ~]# for i in {1..10} ; do curl http://10.1.210.58 ;done
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52
RS 10.1.210.53
RS 10.1.210.52

六、持久連接

什麼是持久連接

  在LVS中,持久連接是為了用來保證當來自同一個用戶的請求時能夠定位到同一臺伺服器,目的是為了會話保持,而通常使用的會話保持技術手段就是cookie與session。

cookie與session簡述

   在Web服務通信中,HTTP本身是無狀態協議,不能標識用戶來源,當用戶在訪問A網頁,再從A網頁訪問其他資源跳轉到了B網頁,這對於伺服器來說又是一個新的請求,之前的登陸信息都沒有了,怎麼辦?為了記錄用戶的身份信息,開發者在瀏覽器和伺服器之間提供了cookie和session技術,簡單說來在你瀏覽網頁時候,伺服器建立session用於保存你的身份信息,並將與之對應的cookie信息發送給瀏覽器,瀏覽器保存cookie,當你再次瀏覽該網頁時候,伺服器檢查你的瀏覽器中的cookie並獲取與之對應的session數據,這樣一來你上次瀏覽網頁的數據依然存在。

4層均衡負載導致的問題

  由於cookie和session技術是基於應用層(七層),而LVS工作在4層,只能根據IP地址和埠進行轉發,不能根據應用層信息進行轉發,所以就存在了問題。比如LVS集群RS是三台,A用戶登陸後請求在由第一臺處理,而A用戶跳轉到了另一個頁面請求經過DS轉發到第二台伺服器,但是此時這台伺服器上並沒有session,用戶的信息就沒有了,顯然這是不能接受的。為了避免上述的問題,一般的解決方案有三種:
  1. 將來自於同一個用戶的請求發往同一個伺服器(例如nginx的ip_hash演算法);
  2. 將session信息在伺服器集群內共用,每個伺服器都保存整個集群的session信息;
  3. 建立一個session存,所有session信息都保存到存儲池中 ;

LVS會話保持實現方式就是通過將來自於同一個用戶的請求發往同一個伺服器,具體實現分為sh演算法和持久連接:

sh演算法:使用SH演算法,SH演算法在內核中會自動維護一個哈希表,此哈希表中用每一個請求的源IP地址經過哈希計算得出的值作為鍵,把請求所到達的RS的地址作為值。在後面的請求中,每一個請求會先經過此哈希表,如果請求在此哈希表中有鍵值,那麼直接定向至特定RS,如沒有,則會新生成一個鍵值,以便後續請求的定向。但是此種方法在時間的記錄上比較模糊(依據TCP的連接時長計算),而且其是演算法本身,所以無法與演算法分離,並不是特別理想的方法。     持久連接:此種方法實現了無論使用哪一種調度方法,持久連接功能都能保證在指定時間範圍之內,來自於同一個IP的請求將始終被定向至同一個RS,還可以把多種服務綁定後統一進行調度。    詳細一點說來:當用戶請求到達director時。無論使用什麼調度方法,都可以實現對同一個服務的請求在指定時間範圍內始終定向為同一個RS。在director內有一個LVS持久連接模板,模板中記錄了每一個請求的來源、調度至的RS、維護時長等等,所以,在新的請求進入時,首先在此模板中檢查是否有記錄(有內置的時間限制,比如限制是300秒,當在到達300秒時依然有用戶訪問,那麼持久連接模板就會將時間增加兩分鐘,再計數,依次類推,每次只延長2分鐘),如果該記錄未超時,則使用該記錄所指向的RS,如果是超時記錄或者是新請求,則會根據調度演算法先調度至特定RS,再將調度的記錄添加至此表中。這並不與SH演算法衝突,lvs持久連接會在新請求達到時,檢查後端RS的負載狀況,這就是比較精細的調度和會話保持方法。  

LVS的三種持久連接方式

PCC:每客戶端持久;將來自於同一個客戶端的所有請求統統定向至此前選定的RS;也就是只要IP相同,分配的伺服器始終相同。   PPC:每埠持久;將來自於同一個客戶端對同一個服務(埠)的請求,始終定向至此前選定的RS。例如:來自同一個IP的用戶第一次訪問集群的80埠分配到A伺服器,25號埠分配到B伺服器。當之後這個用戶繼續訪問80埠仍然分配到A伺服器,25號埠仍然分配到B伺服器。   PFMC:持久防火牆標記連接;將來自於同一客戶端對指定服務(埠)的請求,始終定向至此選定的RS;不過它可以將兩個毫不相干的埠定義為一個集群服務,例如:合併http的80埠和https的443埠定義為同一個集群服務,當用戶第一次訪問80埠分配到A伺服器,第二次訪問443埠時仍然分配到A伺服器。 

示例

  LVS的持久連接功能需要定義在集群服務上面,使用-p timeout選項。

PPC:

[root@localhost ~]# ipvsadm -At 10.1.210.58:80 -s rr -p 300
  #上面命令的意思是:添加一個集群服務為10.1.210.58:80,使用的調度演算法為rr,持久連接的保持時間是300秒。當超過300秒都沒有請求時,則清空LVS的持久連接模板。

PCC:

# ipvsadm -A -t 10.1.210.58:0 -s rr -p 600
# ipvsadm -a -t 10.1.210.58:0 -r 10.1.210.52 -g -w 2
# ipvsadm -a -t 10.1.210.58:0 -r 0.1.210.53 -g -w 1

PFMC:

######PNMPP是通過路由前給數據包打標記來實現的
# iptables -t mangle -A PREROUTING -d 10.1.210.58 -ens192 -p tcp --dport 80 -j MARK --set-mark 3
# iptables -t mangle -A PREROUTING -d 10.1.210.58 -ens192 -p tcp --dport 443 -j MARK --set-mark 3
# ipvsadm -A -f 3 -s rr -p 600
# ipvsadm -a -f 3 -r 10.1.210.52 -g -w 2
# ipvsadm -a -f 3 -r 10.1.210.52 -g -w 2

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前項目當中的接入的高德逆地理編碼功能偶爾會出現參數錯誤的bug,經過排查服務端異常log,發現請求的url中的location參數中的小數點變成了逗號。 代碼如下 其中 lng.ToString(), lat.ToString() 轉換string的時候,偶爾會把中間的點號轉成逗號,於是造成高德a ...
  • 最少連接演算法使用最少連接演算法可以使得nginx優先選擇連接最少的上游伺服器,需要用到upstream_least_conn模塊。如何跨worker進程生效因為nginx是多進程結構的,預設多個worker進程間無法共用數據。使用upstream_zone模塊可以實現這個需求。 ...
  • 前言: 原本計劃這次寫一下搭建eureka群集。但是發現上次寫的只是服務的註冊,忘了寫服務的發現,所以這次先把服務發現補上去。 需要using Pivotal.Discovery.Client; 這個時候發現名為order的有兩個服務。 然後再次啟動這三個.net core項目,並訪問http:// ...
  • AsnycLocal與ThreadLocal AsnyncLocal與ThreadLocal都是存儲線程上下文的變數,但是,在實際使用過程中兩者又有區別主要的表現在: AsyncLocal變數可以在父子線程中傳遞,創建子線程時父線程會將自己的AsyncLocal類型的上下文變數賦值到子線程中,但是, ...
  • 判斷節假日請求的Api:http://tool.bitefu.net/jiari/ /// <summary> /// 判斷是不是周末/節假日 /// </summary> /// <param name="date">日期</param> /// <returns>周末和節假日返回true,工作日 ...
  • 在學習Linux命令中,發現3個有關於文件內容操作的命令grep,sed和awk,在這裡簡單彙總這3個命令主要作用,在實際中找到最合適的情景應用,詳細用法可以參考其他文章。 1、grep命令 主要作用:用於搜索文件中特定字元串,並輸出整行內行 命令格式:grep [選項參數] "搜索內容" 文件(選 ...
  • Homebrew是mac上的軟體包管理工具,類似一些發行版Linux上的yum、apt get等。 安裝Homebrew 1、 安裝Xcode,到appstore搜索。 2、 打開終端,執行以下命令: 軟體安裝目錄 軟體都會安裝到 基本選項 安裝完成後,執行 ,就有提示 ...
  • 前提知識: Linux內核、Linux 進程和文件數據結構、vmcore解析、彙編語言 問題背景: 這個問題出自項目的一個安全模塊,主要功能是確定某進程是否有許可權訪問其正在訪問的文件。 實現功能時,需要在內核里通過掃描該進程打開的文件表,獲取文件的路徑,和安全模塊里配置的可訪問文件的進程白名單進行匹 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...