1. 程式人生 > >轉載--LVS之原理篇--深入全面理解LVS工作原理

轉載--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。下面將詳細介紹這四種機制的工作模型。

二、工作原理

    這裡所談的工作原理主要是介紹ipvs的工作機制,以及使用者管理。

    LVS分為兩個部件:ipvs和ipvsadm

        ipvs : 工作於核心空間,主要用於使使用者定義的策略生效;

        ipvsadm : 工作於使用者空間,主要用於使用者定義和管理叢集服務的工具;

   wKiom1PGPUiDeSykAADpqGSMdEA174.jpg

    上圖所示,ipvs工作於核心空間的INPUT鏈上,當收到使用者請求某叢集服務時,經過PREROUTING鏈,經檢查本機路由表,送往INPUT鏈;在進入netfilter的INPUT鏈時,ipvs強行將請求報文通過ipvsadm定義的叢集服務策略的路徑改為FORWORD鏈,將報文轉發至後端真實提供服務的主機。

    而我們一直說LVS是一個4層負載均衡軟體,那它是如何做到的呢,下面我們就來介紹一下ipvs的叢集管理和排程演算法;

三、叢集管理與排程演算法

    對LVS的管理與netfilter極為相似,所以這裡也是很好理解的;

    1、ipvsadm 語法詳解:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r RS-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r RS-address
ipvsadm -L|l [options]
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檢視不同狀態資訊;
        -n: 數字格式顯示IP地址;
        -c: 顯示連線數相關資訊;
        --stats: 顯示統計資料;
        --rate: 速率;
        --exact:顯示統計資料的精確值;

Director在接收到來自客戶機的請求時,會基於schedule(排程演算法)從RealServer中選擇一個響應客戶機的請求,下面將介紹10種排程演算法;

    2、常用排程演算法

    1)RR   輪詢

        Round Robin :新的連線請求被輪流分配至各RealServer,優點是該演算法無需記錄當前所有連線的狀態,效率高;但缺點是在RealServer當中如果有效能不均等的情況下,效能差的主機將負載比較大。該演算法容易倒致伺服器之間負載不均衡;

    2)WRR  加權輪詢

        Weighted RR :優點與RR一樣,無需記錄所有連線狀態;通過設定一定的權重值來分配連線請求;
    3)SH   源地址雜湊

        Source Hashing :通過一個雜湊函式將去往同一個目的IP的請求對映到一臺伺服器或鏈路上。   

    4)DH   目標地址雜湊

        Destination Hashing : 通過一個雜湊函式將來自同一個源IP的請求對映到一臺伺服器或鏈路上

    5)LC   最少連線數

        Least Connection :根據當前各伺服器的連線數來估計伺服器的負載情況,把新的連線分配給連線數最小的伺服器;負載率=active*256+inactive,值小的優先分配請求;
    6)WLC   加權最少連線數

        Weighted LC :與LC類似,根據當前各伺服器的連線數來估計伺服器的負載情況,把新的連線分配給連線數最小的伺服器;負載率=(active*256+inactive)/weight,值小的優先分配請求;   

    7)SED   最短期望延遲

        Shortest Expect Delay : 這個演算法主要是優化LC的,在服務均在請求少的時候避免負載到一臺伺服器上做的優化;負載率=(active+1)*256/weight,值小的優先分配請求;
    8)NQ   永不排隊

        Nerver Queue :在負載低時,請求直接分配到空閒伺服器上,不會產生請求等待;當伺服器都很忙時,將輪詢;

    9)LBLC   基於本地最少連線

        Locality-Based Least Connection :根據請求的目標IP地址找出該目標IP地址最近使用的RealServer,若該Real Server是可用的且沒有超載,將請求傳送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處於一半的工作負載,則用“最少連結”的原則選出一個可用的伺服器,將請求傳送到該伺服器。

    10)LBLCR   帶複製的基於本地最少連線

        Replicated and Locality-Based Least Connection :該演算法根據請求的目標IP地址找出該目標IP地址對應的伺服器組,按“最小連線”原則從伺服器組中選出一臺伺服器,若伺服器沒有超載,將請求傳送到該伺服器;若伺服器超載,則按“最小連線”原則從這個叢集中選出一臺伺服器,將該伺服器加入到伺服器組中,將請求傳送到該伺服器。

四、工作模型

    前面己介紹了LVS,我們知道ipvs安裝在DR上面,在DR上虛擬一個對外訪問的IP(VIP),使用者訪問VIP,到達DR,然後DR根據排程演算法選擇一個RS,處理完成後返回給客戶端資料。但RS如何返回給客戶端資料呢?ipvs有以下幾種工作模式:

1、LVS-NAT

wKioL1PGc9TTuZhEAABTJbvCy2Q192.jpg

    此模型中,DR只需要將VIP配置到DR上,它的工作機制是,將收到的叢集服務請求報文目標地址轉換成經排程演算法計算得出的後端主機IP地址,然後端主機將響應報文傳送至DR,再由DR將源地址轉換成VIP的地址;此機制與iptables中我們學習的DNAT類似;

NAT的特性:
  1> RS應該使用私有地址;
  2> RS的閘道器的必須指向DIP;
  3> RIP和DIP必須在同一網段內;
  4> 請求和響應的報文都得經過Director;在高負載場景中,Director很可能成為系統性能瓶頸;
  5> 支援埠對映;
  6> RS可以使用任意支援叢集服務的OS;

2、LVS-DR

    此處列舉出DR模型中兩種常見的網路模型:關注資料幀格式的變化;

    1)client向目標vip發出請求,Director接收.此時IP包頭及資料幀頭資訊如(1),(2);

    2)LVS根據負載均衡演算法選擇一臺active的RS,將此RIP所在網絡卡的mac地址作為目標mac地址,傳送到局域網裡.此時IP包頭及資料幀頭資訊如(3);

    3)RS在區域網中收到這個幀,拆開後發現目標IP(VIP)與本地匹配,於是處理這個報文.隨後重新封裝報文,傳送到區域網.此時IP包頭及資料幀頭資訊如(4);

wKiom1PHKI3joh1EAAD-vgMXdkM121.jpg

說明:在現實的環境中,我們的網路前端都有路由器,無論你的路由是運商提供還是區域網內部;此網路模型下CIP,DIP,RIP,VIP均為公網IP地址。

wKiom1PHKMOzIRKcAAEvlETaed0574.jpg

說明:同樣,前端還是會有路由器,當我們沒有足夠多的公網IP時,可以採用此網路模型;該模型下DIP,RIP均為私有IP,而VIP為公網IP;此時需將其閘道器地址指向另一下路由器內網IP,這樣才能保證資料正常傳送出去。

    當我們分析上面兩個網路模型的資料報時會發現一些問題:

        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的廣播地址為它自己即可;

   下面我們繼續來介紹linux核心引數arp_announce與arp_ignore:

arp_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;
 0 - (default) Use any local address, configured on any interface.
 1 - Try to avoid local addresses that are not in the target‘s subnet for this interface.
 2 - Always use the best local address for this target.
 
arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.
 0 - (default): reply for any local target IP address, configured on any interface.
 1 - reply only if the target IP address is local address configured on the incoming interface.
 2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender‘s IP address are part from same subnet on this interface.
 3 - do not reply for local address configured with scope host, only resolutions for golbal and link addresses are replied.
 4-7 - reserved
 8 - do not reply for all local addresses

3、LVS-TUN

    在資料包必須傳遞到另一個網路或因特網上時,可以使用ip隧道,ip隧道能夠將資料包從一個子網或虛擬區域網(VLAN)轉發到另一個子網或虛擬區域網(VLAN),建立ip隧道是Linux核心功能的一部分,LVS-TUN轉發方法允許你將叢集節點放在與Director不同的網路上。

wKiom1PHUB-hMKfKAAErFLpoOdo937.jpg

    請留意DR將資料包轉發給RS時的IP資料報文;由於DR,RS都不在同一區域網內,而DR要將client請求報文轉發給RS時,DR是直接在資料包中直接新增IP首部(源IP:DR和目標IP:RS),這樣就是隧道技術了。

    同樣,該模型下RS都將配置VIP地址,且不能被外界所獲知VIP存在於RS上;

4、LVS-FullNat

    LVS當前應用主要採用DR和NAT模式,但這2種模式要求RS和DR在同一個vlan中,導致部署成本過高;TUN模式雖然可以跨vlan,但RS上需要部署ipip模組等,網路拓撲上需要連通外網,較複雜,不易運維。為了解決上述問題,我們在DR上添加了一種新的轉發模式:FullNat,該模式和NAT模式的區別是:Packet IN時,除了做DNAT,還做SNAT(使用者ip->內網ip),從而實現DR-RS間可以跨vlan通訊,RS只需要連線到內網;

wKiom1PHT-qiq_nGAAEJ7XqVIUQ769.jpg

五、總結   

    此處只分析了一下各模型的工作原理,水平有限,儘量做到見圖知義;如果你看完整後還相信他人所說LVS只工作於4層,那就大錯特錯了!

4種模型概要總結:

    1、LVS NAT的特性:
        1)RS應該使用私有地址;
        2)RS的閘道器的必須指向DIP;
        3)RIP和DIP必須在同一網段內;
        4)請求和響應的報文都得經過Director;在高負載場景中,Director很可能成為系統性能瓶頸;
        5)支援埠對映;
        6)RS可以使用任意支援叢集服務的OS;

    2、LVS DR型別的特性:
        1)RS可以使用私有地址;但也可以使用公網地址,此時可以直接通過網際網路連入RS以實現配置、監控等;
        2)RS的閘道器一定不能指向DIP;
        3)RS跟DR要在同一物理網路內(不能由路由器分隔);
        4)請求報文經過DR,但響應報文一定不經過DR
        5)不支援埠對映;
        6)RS可以使用大多數的作業系統;

    3、LVS TUN型別:IP隧道
        1)RIP、DIP、VIP都得是公網地址;
        2)RS的閘道器不會指向也不可能指向DIP;
        3)請求報文經過DR,但響應報文一定不經過DR;
        4)不支援埠對映;
        5)RS的OS必須得支援隧道功能;

    4、LVS FullNat:

        1)DR,RS可以不在同一網路內,但它與TUN不同,所有IP報文頭部資訊變更都在DR上進行,所以效能方面比LVS_NAT更差一些;

        2)需要注意配置路由,保證能正常通訊;

相關推薦

轉載--LVS原理--深入全面理解LVS工作原理

一、介紹     LVS是Linux Virtual Server的簡寫,即Linux虛擬伺服器,是一個虛擬的伺服器集群系統。該專案由章文嵩博士成立,是中國國內最早出現的自由軟體專案之一。     使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux作業

深入理解Mock工作原理

Mock的作用不同於Spy,Fake。Mock主要用於測被測體與外部的互動邏輯。一般是指在不同的場景下多次的與外部互動。當外部依賴是硬體,或者外部程式不ready的情況下,Mock就能幫助完成單元測試。 以下圖為例,FlashDriver與IO系統有多次的互動,互動函式是r

深入理解瀏覽器工作原理

前面的話   瀏覽器(browser application)是專門用來訪問和瀏覽全球資訊網頁面的客戶端軟體,也是現代計算機系統中應用最為廣泛的軟體之一,其重要性不言而喻。前端工程師作為負責程式頁面顯示的工程師,需要直接與瀏覽器打交道。本文將詳細介紹瀏覽器的工作原理 組成   瀏覽器的組成如下圖所示

深入理解Mysql 工作原理

剛開始接觸一個新的事物的時候,我覺得很有必要從其工作原理入手,弄清楚這個東西的來龍去脈,為接下來的繼續深入學習做好鋪墊,掌握好其原理有助於我們從整體上來把握這個東西,並且幫助我們在排錯過程中理清思路。接下來,還是從mysql的工作原理開始入手,下面先來一張經典的圖:

死磕SpringIoC - 深入瞭解Spring IoC(面試題)

> 該系列文章是本人在學習 Spring 的過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 [Spring 原始碼分析 GitHub 地址](https://github.com/liu844869663/spring-framework) 進行閱讀 > > Spring 版

死磕SpringIoC - @Autowired 等註解的實現原理

> 該系列文章是本人在學習 Spring 的過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 [Spring 原始碼分析 GitHub 地址](https://github.com/liu844869663/spring-framework) 進行閱讀 > > Spring 版

死磕SpringIoC - @Bean 等註解的實現原理

> 該系列文章是本人在學習 Spring 的過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 [Spring 原始碼分析 GitHub 地址](https://github.com/liu844869663/spring-framework) 進行閱讀 > > Spring 版

Linux運維計算機硬件組成與基本工作原理+服務器簡單介紹

linux 服務器 運維 第1章 計算硬件組成與基本工作原理1.1 計算機組成 1.顯示器2.機箱(主機) | |-----CPU |-----硬盤 |-----內存 |-----電源

很棒的開源監控系統原理系列文章:UAV MOF工作原理Agent注入機制原理

原文連結:https://mp.weixin.qq.com/s/eA6nuYPVvgoCWO4E3yP4BQ 也可關注公眾號:UAVStack智慧運維 大家好,UAVStack推送時間到~ 上月我們為大家介紹了UAVStack中的呼叫鏈技術,助力大家進行問題診斷和系統性能提升,希望大家有

Android Kotlin 學習總結(一) 《KAE 優缺點並且深入位元組碼分析工作原理

本章會分為以下內容: 1.Kotlin KAE介紹,使用和原始Android findViewById對比優缺點 2.Kotlin KAE所存在的問題 3.通過位元組碼分析他的實現原理 閱讀本章內容大概需要您5分鐘的時間 一、Kotlin KAE介紹,使用和原始

深刻理解HDFS工作原理

概述 HDFS(Hadoop Distributed File System )Hadoop分散式檔案系統的簡稱。HDFS被設計成適合執行在通用硬體(commodity hardware)上的分散式檔案系統。DFS是一個高度容錯性的系統,適合部署在廉價的機器上

通過一個小故事,理解 HTTPS 工作原理

本文摘錄參考: HTTP 協議由於是明文傳送,所以存在三大風險: 1、被竊聽的風險:第三方可以截獲並檢視你的內容 2、被篡改的危險:第三方可以截獲並修改你的內容 3、被冒充的風險:第三方可以偽裝成通訊方與你通訊 HTTP 因為存在以上三大安全風險,所以才有了 HTTPS 的出現。 HTTPS 涉及到了很

簡述memcache的理解工作原理

Memcached:是快取在記憶體中,也就是說伺服器重啟之後就會消失。 Memcached是高效能的分散式記憶體物件快取系統,用於web應用以減輕資料庫的負載,它通過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提供動態、資料庫驅動網站的速度。 Memcached基於

理解GRUB2工作原理及配置選項與方法

GRUB2是借鑑GRUB改寫到更加安全強大到多系統載入程式,現在大部分較新的Linux發行版都是使用GRUB2作為載入程式的。 GRUB2採用了模組化設計,使得GRUB2核心更加精煉,使用更加靈活,同時也就不需要像 GRUB那樣分為stage1,stage1_5,stage2這樣三個階段了。 GRUB2和G

11.深入k8s:kubelet工作原理及其初始化原始碼分析

![62953793_p0](https://img.luozhiyun.com/20200920121011.jpg) > 轉載請宣告出處哦~,本篇文章釋出於luozhiyun的部落格:https://www.luozhiyun.com > > 原始碼版本是[1.19](https://github.co

JVM 的 工作原理,層次結構 以及 GC工作原理

JVM Java 虛擬機器 Java 虛擬機器(Java virtual machine,JVM)是執行 Java 程式必不可少的機制。JVM實現了Java語言最重要的特徵:即平臺無關性。原理:編譯後的 Java 程式指令並不直接在硬體系統的 CPU 上執行,而是由 J

深入理解Tomcat系列六 Servlet工作原理

                     前言Servlet是Web開發中的核心技術,作為一名合格的開發人員,就必須清楚Servlet的工作原理。本章沒有對Servlet技術本身進行詳細的說明,只是針對開發過程中一次Servlet的請求的處理過程進行分析的。Servlet實際上就是一個java類,只不過可以和

深入理解Java記憶體模型系列

確保對記憶體的讀-改-寫操作原子執行。在Pentium及Pentium之前的處理器中,帶有lock字首的指令在執行期間會鎖住匯流排,使得其他處理器暫時無法通過匯流排訪問記憶體。很顯然,這會帶來昂貴的開銷。從Pentium 4,Intel Xeon及P6處理器開始,intel在原有匯流排鎖的基礎上做了一個很有意

深入Java虛擬機器】十一全面理解Java記憶體模型(JMM)及volatile關鍵字

轉自:https://blog.csdn.net/javazejian/article/details/72772461 關聯文章: 深入理解Java型別資訊(Class物件)與反射機制 深入理解Java列舉型別(enum) 深入理解Java註解型別(@Annotation)

深入理解C語言中的指標與陣列指標

前言          其實很早就想要寫一篇關於指標和陣列的文章,畢竟可以認為這是C語言的根本所在。相信,任意一家公司如果想要考察一個人對C語言的理解,指標和陣列絕對是必考的一部分。          但是之前一方面之前一直在忙各種事情,一直沒有時間靜下心來寫這些東西,畢竟