網絡負載均衡和代理技術2

本文原作者爲Matt Klein,爲envoy的工程師。發表於2017年12月。因原文英文寫作和其它原因,本人覺得有必要分享。但翻譯後期發現該文已於2018年1月被人翻譯。思考再三,決定發佈自己的翻譯版本。原文較長,我分爲三個部分便於大家閱讀。此爲第二篇

L4負載均衡當前技術

L4負載均衡器是否仍然重要?

前文提到,L7負載均衡器對於現代協議的重要性,隨後會進一步詳細介紹L7負載均衡器功能。這是否意味着L4負載均衡器無需關注?自然不是!雖然在我看來L7負載平衡器最終將完全取代L4負載平衡器以進行服務到服務通信,但L4負載均衡器在邊界部署仍然非常重要,因爲幾乎所有現代大型分佈式架構都使用雙層L4 / L7負載均衡架構用於互聯網流量管理。在邊界部署中L7負載均衡器的前端部署L4負載均衡器的好處是:

  • L7負載均衡器對應用程序流量執行更復雜的分析、轉換和路由,它們能夠處理原始數據流負載(以每秒分組和每秒字節爲單位測量)要比優化後L4負載均衡器要少。如此看來,L4負載平衡器能夠更好地處理某些類型的DoS×××。(例如,SYN泛洪,通用數據包泛洪×××等)
  • L7負載均衡器由於敏捷開發,持續部署,比L4負載均衡器更容易產生BUG。在L7前端部署L4負載均衡器,可以在L7負載均衡器部署期間進行健康檢查和流量接管。這比現代L4負載均衡器使用的部署機制要容易得多。現代L4負載均衡器通常使用BGP和ECMP(下面將詳細介紹)
  • 最後,因爲L7負載平衡器更容易出現錯誤,純粹是由於其功能的複雜性。而L4負載均衡器可以規避這些故障和異常可以使整個系統更加穩定。
    在下面的部分中,我將介紹中/邊界代理L4負載平衡器的幾種不同設計。以下設計通常不適用於客戶端庫和挎斗車代理拓撲。

TCP / UDP終端負載均衡器

網絡負載均衡和代理技術2
圖8:L4終端負載均衡器

    如圖8所示。這與我們在上面的L4負載均衡介紹中看到的負載均衡器相同。在這種類型的負載均衡器中,使用兩個離散的TCP連接:一個在客戶端和負載均衡器之間,另一個在負載均衡器和後端之間。即C<->LB LB<->B

L4終端負載均衡器仍然使用有兩個原因:

  • 它們實施起來相對簡單。
  • 與客戶端更近的(低延遲)終端連接(譯註:可能爲中斷重連)具有顯著的性能影響。如果終端負載均衡器可以儘量靠近使用有損網絡(例如,蜂窩網絡)的客戶端放置(譯註:理解爲客戶端-負載間網絡質量非常差)則在數據被傳輸到可靠光纖傳輸到其最終位置之前(譯註:假設負載-後端網絡質量較好),重傳可能更快發生。換句話說,這種類型的負載均衡器可以用於原始TCP連接終端的入網點(Point of Presence,POP)場景中使用。

    TCP / UDP直連負載均衡器

    網絡負載均衡和代理技術2
    圖9:L4直通負載均衡器

    如圖9所示。在這種類型的負載均衡器中,負載均衡器不會(譯註:至少爲不會主動終止)終止TCP連接。相反,在發生連接跟蹤和網絡地址轉換(NAT)之後,每個連接的數據包將轉發到選定的後端。首先,解釋一下連接跟蹤和NAT:

    1. 連接檢測:跟蹤所有活動TCP連接狀態的過程。這包括諸如握手是否已完成,是否已收到FIN,連接已空閒多長時間,已爲連接選擇了哪個後端等信息。
    2. NAT:NAT是在數據包通過負載均衡器時,使用連接跟蹤獲取的數據來改變IP或端口信息的過程。
      使用連接跟蹤和NAT,負載均衡器讓大多數從客戶端發起的原始TCP流量直接進入後端。例如,假設客戶端正在與之通信(負載目標地址:端口爲1.2.3.4:80)並且所選擇的後端(地址:端口爲10.0.0.2:9000)。客戶端TCP數據包首先達到達負載均衡器1.2.3.4:80。然後,負載均衡器將NAT數據包的目標IP和端口修改爲10.0.0.2:9000。負載均衡將交換原始數據包的源IP和端口和負載均衡器的IP和端口。因此,當後端響應TCP連接時,數據包將返回到負載均衡器,在負載均衡器中進行連接檢測,NAT可以在相反方向再次發生。
      爲什麼會使用這種類型的負載均衡器來代替上一節中描述的終端負載均衡器,因爲它更復雜?原因如下:
  • 性能和資源使用情況:由於直連負載均衡器不會終止TCP連接,因此它們不需要緩衝任何TCP連接窗口。存儲每個連接狀態的數據量非常小,通過有效的哈希表查找來訪問。因此,直連負載均衡器通常可以處理比終端負載均衡器大得多的活躍連接數和每秒數據包數(packets per second,PPS)。(譯註:高併發處理能力
  • 允許後端執行自定義擁塞控制:TCP擁塞控制是Internet上主機限制發送數據,以便不會阻塞可用帶寬和緩衝區的機制。由於直連接負載均衡器不會終止TCP連接,因此它不參與擁塞控制。這將允許後端根據其應用實例使用不同的擁塞控制算法。它還允許更容易地對擁塞控制變化進行調整(例如,優化型擁塞算法BBR。譯註:科學上網的童鞋應該瞭解)。
  • 形成直接服務器返回(DSR)和集羣L4負載均衡的基線:更高級的L4負載均衡技術(例如DSR和具有分佈式一致性哈希的集羣)需要直連負載平衡(在以下部分中討論)。

    直接服務器返回(DSR)

    網絡負載均衡和代理技術2
    圖10:L4直接服務器返回(DSR)
    直接服務器返回(DSR)負載均衡器如圖10所示。DSR( Direct Server Return)構建在上一節中描述的直連負載均衡器上。DSR是一種優化,其中只有入口/請求數據包通過負載均衡器。出口/響應數據包未經過負載均衡器由後端直接返回客戶端。使用DSR的主要原因是:在許多工作負載中,響應流量遠遠大於請求流量(例如,典型的HTTP請求/響應模式)。假設10%的流量來自請求流量,那麼90%的流量則是響應流量,DSR使用1/10的負載均衡器流量可以滿足系統的需要。鑑於硬件負載均衡器非常昂貴(如F5系列產品),因此這種類型的優化會對系統成本和可靠性產生重大影響。DSR負載均衡器擴展了直連負載均衡器的理念,具體如下:

  • 負載均衡器通常仍執行部分連接檢測。由於響應數據包不會經過負載均衡器,因此負載均衡器將不會知道完整的TCP連接狀態。但是,負載均衡器可以通過查看客戶端數據包和使用各種類型的空閒超時來推斷狀態。
  • 負載均衡器通常使用通用路由封裝(Generic Routing Encapsulation GRE)來封裝從負載均衡器發送到後端的IP數據包,而不是NAT 。因此,當後端接收到封裝的數據包時,它可以對其進行解包並知道客戶端的原始IP地址和TCP端口。這允許後端直接響應客戶端,而響應數據包不再經過負載均衡器。
  • DSR負載均衡器的一個重要概念是由後端參與負載均衡。後端需要具有正確配置的GRE隧道,並且根據網絡設置的底層細節可能需要其自己的完成連接檢測,NAT等。

基於高可用性對的容錯技術

網絡負載均衡和代理技術2
圖11:通過HA對和連接跟蹤的L4容錯

之前,我們一直在考慮單獨設計L4負載平衡器。passthrough(直通)和DSR負載均衡器都需要在負載均衡器本身中進行一定量的連接檢測和狀態檢查。如果負載均衡器本身宕機怎麼辦?如果負載均衡器的單實例宕機,負載均衡器的所有連接將會中斷。就應用來講,這可能會對應用程序性能產生重大影響。
歷史上,L4負載均衡器是從傳統供應商(Cisco,Juniper,F5等)購買的硬件設備。這些設備非常昂貴並且處理大量流量。爲了避免單個負載均衡器故障切斷所有連接並導致嚴重的業務中斷,負載均衡器需要部署在高可用性(HA)模式中,如圖11所示。典型的HA負載均衡器設置具有如下設計:

  • 一對HA邊界路由器服務於一定數量的虛擬IP(virtual IP VIP)。這些邊界路由器使用邊界網關協議(BGP)發佈VIP 。主邊界路由器的BGP權重高於備份,因此在穩定狀態下,它爲所有流量提供服務。(BGP是一個極其複雜的協議;出於本文的目的,只考慮BGP是一種機制,通過該機制,網絡設備宣佈它們可用於從其他網絡設備獲取流量,並且每個鏈路具有優先級鏈路流量權重)。
  • 類似地,主L4負載均衡器比備份負載均衡器擁有更高BGP權重,向邊界主路由器發佈自己,因此在穩定狀態下它正在爲所有流量服務。
  • 主負載均衡器交叉連接到備用負載均衡器,並共享其所有連接檢測狀態。因此,一旦主負載無響應,則備用可以立刻接管並處理所有活動連接。
  • 兩個邊界路由器和兩個負載均衡器都是交叉連接的。這意味着如果其中一個邊界路由器或其中一個負載均衡器宕機,或者由於某些其他原因而降低BGP權重,則備份可以接管所有流量。
    許多高流量的互聯網應用如今也是按照上面的設置運行的。但是,上述方法存在很大的缺點:
  • 考慮到資源使用率,必須在HA負載均衡器對(主備)之間正確共享VIP。如果單個VIP增長超出單個高可用對的處理能力,則VIP需要分割成多個VIP。
  • 系統的資源利用率很低。50%的資源處於閒置狀態。因HA爲主備模式,鑑於硬件負載均衡器非常昂貴,造成資源浪費。
  • 現代分佈式系統設計比主動/備份提供更好的容錯能力。例如,理想業務架構中,系統應該能夠遭受多個同時發生的故障並繼續運行。如果主和備份負載均衡器同時宕機,則HA負載均衡器發生完全故障。
  • 供應商提供的硬件設備非常昂貴,導致用戶被供應商綁定。異構產品不兼容(產品更新換代遷移困難)設備可替換變差。用戶通常希望使用商業通用計算服務器(譯註:商業通用服務器應該是大家常見的PC SERVER)構建的水平擴展軟件解決方案來替換這些硬件設備。

    通過分佈式一性哈希集羣實現冗餘和擴展

網絡負載均衡和代理技術2
圖12:通過集羣負載均衡器和一致性散列的L4容錯和擴展(縮放)

大型互聯網基礎設施開始設計和部署新的大規模並行L4負載平衡系統,如圖12所示。這些系統的目標是:

  • 減輕上一節中描述的HA設計的所有缺點。
  • 從供貨商的專有硬件負載均衡器轉向使用標準計算服務器和NIC構建的商業軟件解決方案。(降成本)
    此L4負載均衡器設計稱爲通過羣集和分佈式一致性哈希的冗餘和擴展。它的工作原理如下:
  • N個邊界路由器以相同的BGP權重宣佈所有任播(Anycast) VIP。等價多路徑路由(Equal-cost multi-path routing ECMP)用於確保通常來自單個流的所有分組到達相同的邊界路由器。流通常是源IP /端口和目標IP /端口的4元組。(簡而言之,ECMP是一種使用一致哈希在一組相同加權的網絡鏈路上分發數據包的方法)。儘管邊界路由器本身並不特別關心哪些分組到達哪裏,但是通常優選的是來自流的所有分組都經過同一組鏈路,以便避免成爲性能降低的無序分組。
  • N個L4負載均衡器以與邊界路由器以相同的BGP權重通告所有VIP。再次使用ECMP,邊界路由器通常會爲數據流選擇相同的負載均衡器。
  • 每個L4負載均衡器通常會執行部分連接檢測,然後使用一致性哈希來選擇數據流的後端。GRE用於封裝從負載均衡器發送到後端的數據包。
  • 然後,DSR用於通過邊界路由器將數據包直接從後端發送到客戶端。
  • L4負載均衡器使用的實際一致性哈希算法是一個熱門的研究領域。這些算法在平衡負載、最小化延遲、最小化後端變更時造成中斷的時間以及最小化內存開銷等方面進行了一些權衡。對此主題的完整討論超出了本文的範圍。
    讓我們看看上述設計如何減輕HA對方法的所有缺點:
  • 可以根據需要添加新的邊界路由器和負載均衡器。每次添加新的機器時,在每一層使用一致的哈希來儘可能減少受影響的流的數量。
  • 系統的資源使用可以根據需要運行,同時保持足夠的突發情況導致的資源不足和冗餘。
  • 邊界路由器和負載均衡器現在都可以使用商用硬件(譯註:商業通用服務器)構建,而成本只是傳統硬件負載平衡器價格的一半都不到。(下面將詳細介紹)。
    通常被問到這個設計的一個問題是“邊界路由器爲什麼不通過ECMP直接與後端通信?爲什麼我們需要負載均衡器?“其原因主要是圍繞緩解DoS×××和後端性能壓力。如果沒有負載均衡器,每個後端都必須參與BGP,並且執行滾動部署的難度要大得多。
    所有現代L4負載均衡系統都在朝着這種設計(或其某些變體)發展。最著名的兩個例子是Google的Maglev和亞馬遜的網絡負載均衡器(NLB Network Load Balancer)。目前沒有任何OSS負載均衡器可以實現這種設計,但是,我知道有一家公司計劃在2018年發佈一款使用這種設計的面向OSS的負載均衡器。我對這個產品非常期待。因爲現代L4負載均衡器是OSS在網絡領域非常重要的一塊缺失。

未完,待續

網絡負載均衡和代理技術2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章