1. 程式人生 > >Web負載均衡的幾種實現方式

Web負載均衡的幾種實現方式

摘要:

負載均衡(Load Balance)是叢集技術(Cluster)的一種應用。負載均衡可以將工作任務分攤到多個處理單元,從而提高併發處理能力。目前最常見的負載均衡應用是Web負載均衡。根據實現的原理不同,常見的web負載均衡技術包括:DNS輪詢、IP負載均衡和CDN。其中IP負載均衡可以使用硬體裝置或軟體方式來實現。

什麼是web負載均衡

伺服器叢集(Cluster)使得多個伺服器節點能夠協同工作,根據目的的不同,伺服器叢集可以分為:

  • 高效能叢集:將單個重負載的請求分散到多個節點進行處理,最後再將處理結果進行彙總
  • 高可用叢集:提高冗餘單元,避免單點故障
  • 負載均衡叢集:將大量的併發請求分擔到多個處理節點。由於單個處理節點的故障不影響整個服務,負載均衡叢集同時也實現了高可用性。

一般提到的負載均衡(Load Balance),是指實現負載均衡叢集。負載均衡實現了橫向擴充套件(Scale Out),避免縱向的升級(Scale Up)換代。

本文中的web負載均衡,特指能夠分擔web請求(http,https等)的負載均衡技術。

基本原理

任何的負載均衡技術都要想辦法建立某種一對多的對映機制:一個請求的入口對映到多個處理請求的節點,從而實現分而治之(Divide and Conquer)。

這種對映機制使得多個物理存在對外體現為一個虛擬的整體,對服務的請求者遮蔽了內部的結構。

採用不同的機制建立對映關係,可以形成不同的負載均衡技術,常見的包括:

  • DNS輪詢
  • CDN
  • IP負載均衡

DNS

DNS輪詢是最簡單的負載均衡方式。以域名作為訪問入口,通過配置多條DNS A記錄使得請求可以分配到不同的伺服器。

DNS輪詢沒有快速的健康檢查機制,而且只支援WRR的排程策略導致負載很難“均衡”,通常用於要求不高的場景。並且DNS輪詢方式直接將伺服器的真實地址暴露給使用者,不利於伺服器安全。

CDN

CDN(Content Delivery Network,內容分發網路)。通過釋出機制將內容同步到大量的快取節點,並在DNS伺服器上進行擴充套件,找到裡使用者最近的快取節點作為服務提供節點。

因為很難自建大量的快取節點,所以通常使用CDN運營商的服務。目前國內的服務商很少,而且按流量計費,價格也比較昂貴。

IP負載均衡

IP負載均衡是基於特定的TCP/IP技術實現的負載均衡。比如NAT、DR、Turning等。是最經常使用的方式。關於其原理,可以參考下面另一篇文章:lvs中的負載均衡方式

IP負載均衡可以使用硬體裝置,也可以使用軟體實現。硬體裝置的主要產品是F5-BIG-IP-GTM(簡稱F5),軟體產品主要有LVS、HAProxy、NginX。其中LVS、HAProxy可以工作在4-7層,NginX工作在7層。關於三者的簡單對比,可以參考這裡

硬體負載均衡裝置可以將核心部分做成晶片,效能和穩定性更好,而且商用產品的可管理性、文件和服務都比較好。唯一的問題就是價格。

軟體負載均衡通常是開源軟體。自由度較高,但學習成本和管理成本會比較大。

F5

F5的全稱是F5-BIG-IP-GTM,是最流行的硬體負載均衡裝置,其併發能力達到百萬級。F5的主要特性包括:

  1. 多鏈路的負載均衡和冗餘

    可以接入多條ISP鏈路,在鏈路之間實現負載均衡和高可用。

  2. 防火牆負載均衡

    F5具有異構防火牆的負載均衡與故障自動排除能力。

  3. 伺服器負載均衡

    這是F5最主要的功能,F5可以配置針對所有的對外提供服務的伺服器配置Virtual Server實現負載均衡、健康檢查、回話保持等。

  4. 高可用

    F5裝置自身的冗餘設計能夠保證99.999%的正常執行時間,雙機F5的故障切換時間為毫秒級。

    使用F5可以配置整個叢集的鏈路冗餘和伺服器冗餘,提高可靠的健康檢查機制,以保證高可用。

  5. 安全性

    與防火牆類似,F5採用預設拒絕策略,可以為任何站點增加額外的安全保護,防禦普通網路攻擊,包括DDoS、IP欺騙、SYN攻擊、teartop和land攻擊、ICMP攻擊等。

  6. 易於管理

    F5提供HTTPS、SSH、Telnet、SNMP等多種管理方式,包含詳盡的實時報告和歷史紀錄報告。同時還提供二次開發包(i-Control)。

  7. 其他

    F5還提供了SSL加速、軟體升級、IP地址過濾、頻寬控制等輔助功能。

LVS

LVS(Linux Virtual Server, Linux虛擬伺服器),是章文嵩博士開發的開放軟體,目前已經整合到Linux核心中。

基於不同的網路技術,LVS支援多種負載均衡機制。包括:VS/NAT(基於網路地址轉換技術)、VS/TUN(基於IP隧道技術)和VS/DR(基於直接路由技術)。

此外,為了適應不同的需要,淘寶開發了VS/FULLNAT,從本質上來說也是基於網路地址轉換技術。最近還有一個基於VS/FULLNAT的DNAT模組。

不管使用哪種機制,LVS都不直接處理請求,而是將請求轉發到後面真正的伺服器(Real Server)。不同的機制,決定了響應包如何返回到客戶端。

VS/NAT

NAT能夠將私有(保留)地址轉化為合法IP地址,通常用於一個公共IP地址和多個內部私有IP地址直接的對映,廣泛應用於各種型別Internet接入方式和各種型別的網路中。

通過使用NAT將目的地址轉換到多個伺服器的方式,可以實現負載均衡,同時能夠隱藏並保護內部伺服器,避免來自網路外部的攻擊。商用負載均衡裝置如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector都是基於NAT方法。

VS/NAT(Virtual Server via Network Address Translation)是基於NAT技術實現負載均衡的方法。其架構如下圖所示:


  1. 客戶通過Virtual IP Address(虛擬服務的IP地址)訪問網路服務時,請求報文到達排程器
  2. 排程器根據連線排程演算法從一組真實伺服器中選出一臺伺服器,將報文的目標地址Virtual IP Address改寫成選定伺服器的地址,報文的目標埠改寫成選定伺服器的相應埠,最後將修改後的報文傳送給選出的伺服器。

  3. 真實的伺服器處理請求,並將響應報文發到排程器。

  4. 排程器將報文的源地址和源埠改為Virtual IP Address和相應的埠
  5. 排程器將修改過的報文發給使用者

在VS/NAT的集群系統中,請求和響應的資料報文都需要通過負載排程器,當真實伺服器的數目在10臺和20臺之間時,負載排程器將成為整個集群系統的新瓶頸。大多數Internet服務都有這樣的特點:請求報文較短而響應報文往往包含大量的資料。如果能將請求和響應分開處理,即在負載排程器中只負責排程請求而響應直接返回給客戶,將極大地提高整個集群系統的吞吐量。比如IP隧道技術。

VS/TUN

IP Tunneling(IP隧道)技術,又稱為IP封裝技術(IP encapsulation),是一種在網路之間傳遞資料的方式。可以將一個IP報文封裝到另一個IP報文(可能是不同的協議)中,並轉發到另一個IP地址。IP隧道主要用於移動主機和虛擬私有網路(Virtual Private Network),在其中隧道都是靜態建立的,隧道一端有一個IP地址,另一端也有唯一的IP地址。

VS/TUN(Virtual Server via IP Tunneling)是基於隧道技術實現負載均衡的方法。其架構如下圖所示:


VS/TUN與VS/NAT的工作機制大體上相同,區別在於:

  1. 排程器轉發報文的時候進行了協議的二次封裝,真實的伺服器接收到請求後先進行解包。過程如下圖所示:


  2. 響應報文從後端伺服器直接返回給客戶,不需要經過排程器。

VS/DR

DR(Direct Routing, 直接路由), 路由器學習路由的方法之一。路由器對於自己的網路介面所直連的網路之間的通訊,可以自動維護路由表,而且不需要進行路由計算。

直接路由通常用在一個三層交換機連線幾個VLAN的情況,只要設定直接路由VLAN之間就可以通訊,不需要設定其他的路由方式。

VS/DR(Virtual Server via Direct Routing)是基於直接路由實現負載均衡的方法。其架構如下圖所示:


跟VS/TUN方法相同,VS/DR利用大多數Internet服務的非對稱特點,負載排程器中只負責排程請求,而伺服器直接將響應返回給客戶,可以極大地提高整個集群系統的吞吐量。

VS/DR要求排程器和伺服器組都必須在物理上有一個網絡卡通過不分段的區域網相連,即通過交換機或者高速的HUB相連,中間沒有隔有路由器。VIP地址為排程器和伺服器組共享,排程器配置的VIP地址是對外可見的,用於接收虛擬服務的請求報文;所有的伺服器把VIP地址配置在各自的Non-ARP網路裝置上,它對外面是不可見的,只是用於處理目標地址為VIP的網路請求。

VS/DR的整個過程與VS/TUN非常類似,不同之處在於排程器不對請求包進行二次封裝,只是將目標MAC地址更改為經過排程演算法選出的目標伺服器的MAC地址。如下圖:


三種方法的優缺點比較

VS/NAT

  • 優點

    • 對後端伺服器的作業系統無要求
    • 只需要一個IP地址配置在排程器上,伺服器組可以用私有的IP地址。
    • 支援埠對映
  • 缺點

    • 請求和響應報文都需要通過排程器,伸縮能力有限(10+)
    • 要求伺服器和排程器在同一個VLAN
    • 需要將伺服器的預設閘道器指向排程器
    • 對於那些將IP地址或者埠號在報文資料中傳送的網路服務,需要編寫相應的應用模組來轉換報文資料中的IP地址或者埠號

VS/TUN

  • 優點

    • 不需要排程應答報文,效能高
    • 伺服器和排程器可以不在同一個VLAN
    • 支援廣域負載均衡
  • 缺點

    • 所有的伺服器必須支援“IP Tunneling”協議,要安裝核心模組(比如IPIP等),配置複雜
    • 有建立IP隧道的開銷
    • 伺服器上直接繫結虛擬IP(Virtaul IP),風險很大
    • 伺服器需要聯通外網
    • 不支援埠對映

VS/DR

  • 優點

    • 與VS/TUN相比,沒有IP隧道的開銷,效能最好
  • 缺點

    • 要求排程器與伺服器都有一塊網絡卡連在同一物理網段(同一個VLAN)上
    • 要求伺服器網路裝置(或者裝置別名)不作ARP響應,或者能將報文重定向(Redirect)到本地的Socket埠上
    • 伺服器上直接繫結虛擬IP(Virtaul IP),風險很大
    • 不支援埠對映

VS/FULLNAT

如上節所述,前面三種傳統的負載均衡機制各自存在一些不足。

VS/FULLNAT是為了解決這些不足而新開發的一種轉發模式。VS/FULLNAT的特點是:

  1. 排程器和伺服器可以跨VLAN通訊,不需要配置在同一個網段
  2. 請求和應答報文都經過排程器,伺服器不需要繫結虛擬IP

VS/FULLNAT這兩個特點可以簡化網路拓撲,降低運維成本和風險。

如何選擇

  1. 如果人少錢多,不在乎效能的損耗願意多買伺服器,同時希望最大程度較少運維的工作量,可以選擇FULLNAT
  2. 很大眾的方式是用DR,沒有太多的優點但也沒有太多的缺點
  3. 如果要搞廣域網負載均衡,那就用TUN吧
  4. 個人感覺NAT不是為了網際網路用的。小併發的實驗性應用或者用在非web場合,比如mysql叢集等。當然,如果需要埠對映,必須使用NAT方式

本文轉自:

相關推薦

Web負載均衡實現方式

摘要: 負載均衡(Load Balance)是叢集技術(Cluster)的一種應用。負載均衡可以將工作任務分攤到多個處理單元,從而提高併發處理能力。目前最常見的負載均衡應用是Web負載均衡。根據實現的原理不同,常見的web負載均衡技術包括:DNS輪詢、IP負載均衡和CD

單例模式的實現方式

str 類加載 代碼 創建對象 stat 懶漢 導致 方法 不支持 1、懶漢式,線程不安全 是否 Lazy 初始化:是 是否多線程安全:否 實現難度:易 描述:這種方式是最基本的實現方式,這種實現最大的問題就是不支持多線程。因為沒有加鎖 synchronized,所以嚴格意

分布式session的實現方式

服務器 單點 redis 容易 穩定性 常用 str 廣播 cati 1.基於數據庫的session共享 2.基於NFS共享文件系統 3.基於memcached 的session,怎麽保證session的高可用 4.基於resin/tomcat web容器本身的sessio

單例模式實現方式

size ron jdk null singleton bsp 還要 一個 fin 1、餓漢式:靜態常量 特點:單例的實例被聲明成static和final變量了,在第一次加載類到內存中時就會初始化,所以會創建實例本身是線程安全的 public class Sin

Java單例模式實現方式

開始 名稱 常量 就是 多線程開發 靜態代碼塊 浪費 ack 多線程同步 在平時的工作、學員的學習以及面試過程中,單例模式作為一種常用的設計模式,會經常被面試官問到,甚至筆試會要求學員現場默寫,下面將會就單例模式的實現思路和幾種常見的實現方式進行簡單的分享。

分布式鎖的實現方式

article nod process 過程 快速 details 一段時間 detail 領域 一、為什麽要使用分布式鎖 為了保證一個方法或屬性在高並發情況下的同一時間只能被同一個線程執行,在傳統單體應用單機部署的情況下,可以使用Java並發處理相關的API(如Reent

帶輸入查詢功能匹配下拉框的實現方式

sae idt hwnd 就會 bfd bmgr 使用方法 oaf adt 在Web開發中我們經常需要用戶進行輸入操作,輸入框內我們輸入幾個字,輸入框就會出現下拉提示你可能要輸入的完整信息。下面我總結了幾種常見的方案: 一:EasyUi combobox 組合框 具體使用方

Java 定時任務的實現方式

java作業調度 tails 監聽器 ever 觸發 posit exist ttr 輕量級 JAVA實現定時任務的幾種方式 @(JAVA)[spring|quartz|定時器]   近期項目開發中需要動態的添加定時任務,比如在某個活動結束時,自動生成獲獎名單,導出exce

【小家java】Session和Cookie的區別和聯絡、分散式session的實現方式

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

最近在研究多線程,淺談JAVA中多線程的實現方式

進行 數據 使用 導致 效率問題 多線程 方法 sta img 多線程的實現方式:   個人認為,要說多線程的實現方式,萬變不離其宗,最基本的就是兩種1.繼承Thread類;2.實現runnable接口,本質上來說就是用來啟動線程執行任務的過程,具體來說的話,通過這

垂直水平居中的實現方式

一.使用彈性盒模型 display: flex      1. 在你不知道當前元素的寬高的情況下 你可以為父元素設定 display: flex;樣式 並設定 align-items: center; justify-content: center  

字串反轉的實現方式?陣列反轉

1. strrev(); 只對英文友好 2. function getRev($str,$encoding='utf-8'){ $result = ''; $len = mb_strlen($str); for($i=$len-1; $i>=0; $

Python的實現方式

Python自身作為一門程式語言,它有多種實現。這裡的實現指的是符合Python語言規範的Python解釋程式以及標準庫等。這些實現雖然實現的是同一種語言,但是彼此之間,特別是與CPython之間還是有些差別的。 下面分別列出幾個主要的實現。 1.CPython:這是Python

VUE 全域性變數的實現方式

1、全域性變數專用模組 意思是說,用一個模組(js or vue)管理這套全域性變數,模組裡的變數用export (最好匯出的格式為物件,方便在其他地方呼叫)暴露出去,當其它地方需要使用時,用import 匯入該模組 全域性變數專用模組Global.vue const colorLi

佇列的實現方式

佇列簡介: 佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。 佇列是一種最常用的資料結構,也是最重要的一種資

分散式鎖的實現方式

目前幾乎很多大型網站及應用都是分散式部署的,分散式場景中的資料一致性問題一直是一個比較重要的話題。分散式的CAP理論告訴我們“任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分割槽容錯性(Partition toleran

URL重寫的實現方式的總結

                URL重寫,其實就是把帶一大堆引數的url,變成一個看上去很規矩的url,主要目的是為了搜尋引擎。舉例/viewthread.jsp?id=1234/viewthread.jsp?id=1235/viewthread.jsp?id=1236重寫後,可以用/viewthread/

分散式鎖的實現方式~

目前幾乎很多大型網站及應用都是分散式部署的,分散式場景中的資料一致性問題一直是一個比較重要的話題。分散式的CAP理論告訴我們“任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分割槽容錯性(Partition toleran

Java框架之Spring AOP 面向切面程式設計 有哪實現方式?如何選擇適合的AOP實現方式

文章目錄 1. 實現方式 2. JDK動態代理如何實現? 2.1 主要的實現過程 3. 如何選擇? 1. 實現方式 JDK 動態代理實現和 cglib 實現 2. JDK

小程式頁面之間的資料傳遞 實現方式

1  元件傳遞內容給頁面     給元件設定myevent事件,通過this.triggerEvent('myevent', myEventDetail) 觸發該myevent事件並傳遞內容,在頁面用onMyEventshi事件監聽傳遞過來的資料。