負載均衡續:萬億流量場景下的負載均衡實踐
本篇分別就淘寶雙 11、春運 12306、微信紅包和抖音春晚紅包等場景在負載均衡方面的運用進行一些介紹和討論。
阿里雙 11 流量下的負載均衡 [1]
雙十一流量特點請求量巨大,脈衝式的。是對阿里生態鏈路上所有服務的考驗對負載均衡器的要求:
-
性能優良:應對雙 11 當晚脈衝式的流量衝擊
-
服務穩定:可用性高,以應對設備和網絡的抖動
-
業務無感:順滑的自身升級和容災切換
實現原理
1)優良性能依賴 DPDK
阿里的新一代負載均衡器是基於 DPDK[2] 來實現的。其優勢總結如下 *[3]
2)應對 ECMP 重選導致的連接中斷
ECPM(Equal-CostMultipathRouting) 是一種最大限度利用最短路徑的等價多路徑路由算法。
如上圖,SLB 採用水平擴展的集羣部署,多臺服務器發佈相同路由,在交換機處形成 ECPM 路由。以達到高可用的目的。但,在連接沒有同步之前,遇到服務器硬件或網絡異常,會使該服務器不可用,ECPM 重選路由,會使連接到達其他服務器,導致已有連接中斷,造成用戶訪問異常。SLB 使用了會話同步的機制來解決了升級與容災場景下長連接中斷的問題。用組播技術解決會話同步機制中的機器上下線問題。詳細解釋參見文獻 [1]。
鐵路 12306 的負載均衡 [4]
12306 大名鼎鼎,無需多介紹。其中很多的場景和技術都可以給我們做一些很好的參考。但只找到了 16 年發表的論文,沒有能瞭解到最新的架構部署。
12306 的業務難點
-
動態庫存,餘票可以按站點拆分
-
事務強一致,下單交易性質
-
多維度數據一致性,線上線下售票渠道
-
流量洪峯,遇節假日有流量洪峯
這裏對前幾個問題就暫不討論,單說負載均衡在應對流量洪峯時的作用。
12306 架構的發展歷程如下:
由上圖可以看到,第一次優化之前,幾乎全鏈路服務都出現了性能瓶頸,因爲併發查詢導致查詢系統負載過高,用戶重試引發 AS 過載;AS 阻塞導致響應增加,引發 WEB 負載問題,線上壓力導致整個票務系統異常,進而影響了線下購票渠道正常運轉,直至鏈路雪崩。
第一次優化後,引入排隊系統,不同車次使用不同隊列,已達到請求分流;且排隊系統採用了動態流量控制,根據各鐵路局客票中心處理速度,進行控速請求下發;並進行了客票網服務拆分,根據不同規則,使流量負載均衡。此次優化讓 12306 順利度過了 13 年春運。但隨着互聯網的高速發展,網上訂票人數不斷增加,目前的架構已經達到了帶寬、性能、穩定性的瓶頸。因此第二次優化如下:
微信紅包背後的負載均衡 [5]
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 性能的同時達到數據訪問的負載均衡。
抖音春晚紅包背後的負載均衡 [6][7]
前幾部分分別從網絡層、架構層、內部設計等角度闡述了負載均衡的實際運用。而這裏會着重介紹下抖音架構中涉及到的下一代微服務技術 Service Mesh 在負載均衡上的優勢。
什麼是 Service Mesh[8]
爲了解決端到端的字節碼通信問題,TCP 協議誕生,讓多機通信變得簡單可靠;微服務時代,Service Mesh 誕生,屏蔽了分佈式系統的諸多複雜性,讓開發者可以迴歸業務。
Service Mesh 下 Istio 的負載均衡 [9]
Envoy 作爲代理,在網絡體系中扮演着中介的角色,可以爲網絡中的流量管理添加額外的功能,包括提供安全性、隱私保護或負載策略等。在服務間調用的場景中,代理可以爲客戶端隱藏服務後端的拓撲細節,簡化交互的複雜性,並保護後端服務不會過載。並能發現集羣中的所有成員,然後通過主動健康檢查來確定集羣成員的健康狀態,並根據健康狀態,通過負載均衡策略決定將請求路由到哪個集羣成員。
結束語
本篇從實踐的角度出發,挑選了四個最典型的案例,分別從網絡層、架構層、微服務發展等方面闡述了負載均衡的實際運用,希望能對大家的工作和學醫有所幫助~ 歡迎關注私信交流~
Reference
[1] 支撐雙十一的高性能負載均衡: http://www.aliyunhn.com/Home/Article/detail/id/1643.html
[2] 一文讀懂 DPDK: https://cloud.tencent.com/developer/article/1198333
[3] DPDK 技術簡介: https://www.jianshu.com/p/86af81a10195
[4] 12306 互聯網售票系統的架構優化及演進: 鐵路計算機應用期刊
[5] 百億級微信紅包系統設計方案: https://www.infoq.cn/article/2017hongbao-weixin
[6] 抖音春晚幕後: https://www.volcengine.cn/docs/6360/67383
[7] 抖音春晚紅包百億互動量級背後: https://www.163.com/dy/article/G5N0AFOF0511FQO9.html
[8] 什麼是 Service Mesh: https://zhuanlan.zhihu.com/p/61901608
[9] Service Mesh Istio 架構解析: https://developer.aliyun.com/article/759790
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/KM686VV1KJgmsRoaTNgJ6w