天天看點

深入剖析萬億流量場景下的負載均衡實踐

作者:JAVA後端架構
深入剖析萬億流量場景下的負載均衡實踐

性能為王。可用性和水準擴充,都要建立在性能優良的基礎上才會去考慮。

性能是高并發的基礎,而且涉及面極廣,也是需要我們投入更多的精力去對待;同時,大部分優化點也是我們一線研發日常可以直接接觸的子產品。也是大廠面試的時候會經常涉及到的子產品。

是以第一部分大概十幾篇可能都會在垂直性能優化上。第一篇,垂直性能優化之細說叢集部署和負載均衡。

從阿裡架構演變來看負載均衡

我們将淘寶網的架構演進(即時通訊網)整理到一個滑動圖裡,如下圖所示:

深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐

當然,比如中台建設、上雲等更進階演進就在此忽略了;

可以更清晰的看到,在叢集部署和負載均衡,幾乎分布在了整個演進鍊路上最關鍵的節點上:

  • 當解決了本地存儲的性能瓶頸,新的瓶頸出現在了web容器的單體性能上。是以,使用nginx反向代理來實作多個web容器負載均衡
  • 當資料庫和tomcat都達到水準擴容,可支撐的并發大幅提升時,單體nginx代理的性能成了新的瓶頸。是以,使用F5或LVS來實作多個nginx反向代理伺服器負載均衡
  • 當業務進一步發展,達到多地多機房部署,垮地域通路延遲成了新的瓶頸。是以,使用DNS來實作地域機房間的負載均衡。

細說負載均衡方案

常見的實作方案,其實從上面的演進鍊路中也已經可以基本了解到各個方案适用的發展階段和應對常見,這裡再系統的總結下:

  • 基于DNS的負載
  • 基于硬體的負載,如F5
  • 基于軟體的負載,如Nginx/Squid

DNS負載

深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐

上面兩副圖,可以看到DNS的解析過程和負載均衡的原理。天然的優勢就是配置簡單,實作成本非常低,無需額外的開發和維護工作。

而缺點也比較明顯:

  • 目前的DNS是多級解析的,每一級都可能緩存。是以生效不及時。
  • 不能按伺服器的處理能力來配置設定負載。DNS負載均衡采用的是簡單的輪詢算法,不能區分伺服器之間的差異和運作狀态,不靈活
  • 額外的網絡問題。為了使本DNS伺服器和其他DNS伺服器及時互動,保證資料及時更新,一般都要将重新整理時間設定的較小,可能造成流量增大。

基于硬體的負載均衡

「F5 Network Big-IP」 是一個網絡裝置,可以簡單的認為是一個網絡交換機一類的東西,性能非常好,百萬級TPS。

性能優良、功能強大,多種均衡算法都可以支援,還有防火牆等安全功能。但,非常貴,一般小公司可用不起。

基于軟體的負載均衡

軟體負載均衡都是以TCP/IP協定的OSI模型的運用:(即時通訊網[4])

深入剖析萬億流量場景下的負載均衡實踐

根據OSI模型可将負載均衡分為:

  • 二層負載均衡(一般是用虛拟mac位址方式,外部對虛拟MAC位址請求,負載均衡接收後配置設定後端實際的MAC位址響應);
  • 三層負載均衡(一般采用虛拟IP位址方式,外部對虛拟的ip位址請求,負載均衡接收後配置設定後端實際的IP位址響應);
  • 四層負載均衡(在三次負載均衡的基礎上,用 ip+port 接收請求,再轉發到對應的機器);
  • 七層負載均衡(根據虛拟的url或是IP,主機名接收請求,再轉向相應的處理伺服器)。

常見的其實隻有4層和7層負載。

四層和七層的橫向對比

深入剖析萬億流量場景下的負載均衡實踐

常見的負載均衡算法

深入剖析萬億流量場景下的負載均衡實踐

廣義的負載均衡

上述内容基本都是基于服務級别來叙述的負載均衡的概念。其實,負載被運用的場景還很多,比如,服務端rpc選址、以及一些中間件的投遞和請求分發,再有一些彈性架構下的彈性路由,單元化下的單元路由,其實也是更高層面的負載均衡。相應的,也有很多特定的負載算法,比如rpc中的本地優先負載等等。

下面分别就淘寶雙11、春運12306、微信紅包和抖音春晚紅包等場景在負載均衡方面的運用進行一些介紹和讨論。

阿裡雙11流量下的負載均衡

雙十一流量特點請求量巨大,脈沖式的。是對阿裡生态鍊路上所有服務的考驗對負載均衡器的要求:

  • 性能優良:應對雙11當晚脈沖式的流量沖擊
  • 服務穩定:可用性高,以應對裝置和網絡的抖動
  • 業務無感:順滑的自身更新和容災切換

實作原理

1)優良性能依賴DPDK

阿裡的新一代負載均衡器是基于DPDK[2]來實作的。其優勢總結如下

深入剖析萬億流量場景下的負載均衡實踐

正是由于這些專門針對資料包的高性能支援,才得以實作性能優良的負載均衡器來支撐多年雙11場景下的脈沖流量的壓力。

2)應對ECMP重選導緻的連接配接中斷

ECPM(Equal-CostMultipathRouting) 是一種最大限度利用最短路徑的等價多路徑路由算法。

深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐

如上圖,SLB采用水準擴充的叢集部署,多台伺服器釋出相同路由,在交換機處形成ECPM路由。以達到高可用的目的。但,在連接配接沒有同步之前,遇到伺服器硬體或網絡異常,會使該伺服器不可用,ECPM重選路由,會使連接配接到達其他伺服器,導緻已有連接配接中斷,造成使用者通路異常。SLB使用了會話同步的機制來解決了更新與容災場景下長連接配接中斷的問題。用多點傳播技術解決會話同步機制中的機器上下線問題。詳細解釋參見文獻[1]。

鐵路12306的負載均衡[4]

12306大名鼎鼎,無需多介紹。其中很多的場景和技術都可以給我們做一些很好的參考。但隻找到了16年發表的論文,沒有能了解到最新的架構部署。

12306的業務難點

  • 動态庫存,餘票可以按站點拆分
  • 事務強一緻,下單交易性質
  • 多元度資料一緻性,線上線下售票管道
  • 流量洪峰,遇節假日有流量洪峰

這裡對前幾個問題就暫不讨論,單說負載均衡在應對流量洪峰時的作用。

12306架構的發展曆程如下:

深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐

由上圖可以看到,第一次優化之前,幾乎全鍊路服務都出現了性能瓶頸,因為并發查詢導緻查詢系統負載過高,使用者重試引發AS過載;AS阻塞導緻響應增加,引發WEB負載問題,線上壓力導緻整個票務系統異常,進而影響了線下購票管道正常運轉,直至鍊路雪崩。

第一次優化後,引入排隊系統,不同車次使用不同隊列,已達到請求分流;且排隊系統采用了動态流量控制,根據各鐵路局客票中心處理速度,進行控速請求下發;并進行了客票網服務拆分,根據不同規則,使流量負載均衡。此次優化讓12306順利度過了13年春運。但随着網際網路的高速發展,網上訂票人數不斷增加,目前的架構已經達到了帶寬、性能、穩定性的瓶頸。是以第二次優化如下:

深入剖析萬億流量場景下的負載均衡實踐

本篇重點還是看負載均衡在業務場景下的實際作用,是以,其他優化點就不做讨論了。正是因為多元度,多層次的負載均衡,才使得12306能夠承載更高的流量沖擊(如果哪些同學有12306最新的部署架構,希望能私信交流學習~)

微信紅包背後的負載均衡

2017年正月,微信公布使用者在除夕當天收發微信紅包的數量——142億個,收發峰值已達到76萬每秒。

百億紅包業務特點:

  • 不同于普通電商場景,一個群紅包就相當于一個秒殺活動,并發要求更高
  • 金融屬性,不允許資料出現一緻性,安全級别要求更高。

那麼微信的紅包方案是怎麼設計的

垂直SET化,分而治之

如果采用普通的服務拆分和部署方式,由于需要鎖庫存來防止超發,海量的鎖競争将對DB造成不可估量的壓力。及時是使用外部存儲的分布式鎖進行前置壓力緩解,隻是對壓力的轉移,而無法減少。

采用SET化部署的好處,就是同一個紅包隻會被路由到同一個的SET内,相當于對龐大的洪流,進行了reduce似的細小拆分,不同的SET之間互不影響,極大的減少了不同SET之間的資源壓力。(其實和阿裡的RGCzone單元化部署原理差不多)

深入剖析萬億流量場景下的負載均衡實踐

server層請求排隊

産生并發搶鎖的原因,是因為到達DB的請求可能是并發,如果可以保證到達DB的請求穿行,那就不存在并發了。

深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐

首先,通過IDhash確定同一紅包的請求被配置設定到同一台Server,然後再進行單機紅包排隊,這樣,就可以保證同一紅包的請求順序的達到DB,進而減少DB搶鎖并發。

雙次元庫表設計

因為紅包數量巨大,單表資料達到一定程度就會出現性能問題;是以除了按紅包ID分庫分表,還按天進行冷熱資料拆分,在保障資料可以優雅遷移的前提下,保證了當天的DB性能。而在查詢時,通過資料庫中間件,進行庫表路由。

總結

從負載均衡的角度看紅包的架構設計,可以看到,整個架構設計可以了解為使用了三層負載均衡,首先是入口層,将流量進行set拆分,達到整體SET叢集的負載均衡;然後是server層,對紅包ID進行業務邏輯Hash ,ID穿行的同時,達到server叢集内部的負載均衡;再有是DB層,通過雙次元庫表設計,在保障DB性能的同時達到資料通路的負載均衡。

抖音春晚紅包背後的負載均衡

前幾部分分别從網絡層、架構層、内部設計等角度闡述了負載均衡的實際運用。而這裡會着重介紹下抖音架構中涉及到的下一代微服務技術Service Mesh在負載均衡上的優勢。

什麼是Service Mesh

為了解決端到端的位元組碼通信問題,TCP協定誕生,讓多機通信變得簡單可靠;微服務時代,Service Mesh誕生,屏蔽了分布式系統的諸多複雜性,讓開發者可以回歸業務。

深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐
深入剖析萬億流量場景下的負載均衡實踐

Service Mesh下Istio的負載均衡[9]

深入剖析萬億流量場景下的負載均衡實踐

Istio 服務網格在邏輯上分為控制平面和資料平面兩部分。其中,資料平面由一組以Sidecar方式部署的智能代理(Envoy)組成,這些代理可以調節和控制微服務及Mixer之間所有的網絡通信。

深入剖析萬億流量場景下的負載均衡實踐

Envoy 代理可以發出很多名額和遙測資料,這些遙測資料發送到何處,取決于 Envoy 的配置.

Envoy作為代理,在網絡體系中扮演着中介的角色,可以為網絡中的流量管理添加額外的功能,包括提供安全性、隐私保護或負載政策等。在服務間調用的場景中,代理可以為用戶端隐藏服務後端的拓撲細節,簡化互動的複雜性,并保護後端服務不會過載。并能發現叢集中的所有成員,然後通過主動健康檢查來确定叢集成員的健康狀态,并根據健康狀态,通過負載均衡政策決定将請求路由到哪個叢集成員。

結束語

本篇從實踐的角度出發,挑選了四個最典型的案例,分别從網絡層、架構層、微服務發展等方面闡述了負載均衡的實際運用,希望能對大家的工作和學習有所幫助~

為幫助開發者們提升面試技能、有機會入職BATJ等大廠公司,特别制作了這個專輯——這一次整體放出。

大緻内容包括了: Java 集合、JVM、多線程、并發程式設計、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大廠面試題等、等技術棧!

深入剖析萬億流量場景下的負載均衡實踐

歡迎大家關注公衆号【Java爛豬皮】,回複【666】,擷取以上最新Java後端架構VIP學習資料以及視訊學習教程,然後一起學習,一文在手,面試我有。

每一個專欄都是大家非常關心,和非常有價值的話題,如果我的文章對你有所幫助,還請幫忙點贊、好評、轉發一下,你的支援會激勵我輸出更高品質的文章,非常感謝!

深入剖析萬億流量場景下的負載均衡實踐

繼續閱讀