1. 程式人生 > >LVS叢集之十種排程演算法及負載均衡——理論

LVS叢集之十種排程演算法及負載均衡——理論

編者按:在CSDN雲端計算頻道日前所做的文章《響應高達6秒 使用者揭露Heroku私自修改路由造成高支出》中,網友們認為這是“因隨機排程+Rails的單執行緒處理導致延遲增加的負載均衡失敗的案例”。但在負載均衡測試時就能發現問題並妥善解決的成功經驗有沒有?在隨後的微博中,支付寶的@Leverly評論:“去年雙11前的壓測OB就發現了存在嚴重的隨機訪問導致負載不均問題,還好通過加權演算法很好的解決了。” 引發了我們的關注,於是有了本文。重點是淘寶在“雙十一”背後,OceanBase分散式系統負載均衡的經驗分享。

以下為正文:

雲端計算所具備的低成本、高效能、高可用性、高可擴充套件性等特點與網際網路應用日益面臨的挑戰不謀而合,成為近年來網際網路領域的熱門話題。作為一名技術人員不難理解在雲端計算的底層架構中,分散式儲存是不可或缺的重要組成部分。國外知名的網際網路公司如Google、Amazon、Facebook、Microsoft、Yahoo

等都推出了各自的分散式儲存系統,在國內OceanBase是淘寶自主研發的一個支援海量資料的高效能分散式資料庫系統,實現了數千億條記錄、數百TB資料上的跨行跨表事務[1]。

在分散式系統中存在著著名的“短板理論”[2],一個叢集如果出現了負載不均衡問題,那麼負載最大的機器往往將成為影響系統整體表現的瓶頸和短板。為了避免這種情況的發生,需要動態負載均衡機制,以達到實時的最大化資源利用率,從而提升系統整體的吞吐

本文將結合OceanBase的實際應用和大家分享一個去年淘寶雙十一前期的準備工作中遇到負載均衡相關案例,拋磚引玉,期望對大家的工作有所啟發。

OceanBase架構介紹

OceanBase是一個具有自治功能

的分散式儲存系統,由中心節點RootServer、靜態資料節點ChunkServer、動態資料節點UpdateServer以及資料合併節點MergeServer四個Server構成[1],如圖1所示。

圖1 OceanBase 架構圖

  • Tablet:分片資料,最基本的儲存單元,一般會儲存多份,一個Table由多個tablet構成;
  • RootServer:負責叢集機器的管理、Tablet定位、資料負載均衡、Schema等元資料管理等。
  • UpdateServer:負責儲存動態更新資料,儲存介質為記憶體和SSD,對外提供寫服務;
  • ChunkServer:負責儲存靜態Tablet資料,儲存介質為普通磁碟或者SSD。
  • MergeServer:負責對查詢中涉及多個Tablet資料進行合併,對外提供讀服務;

在一個叢集中,Tablet的多個副本分別儲存在不同的ChunkServer,每個ChunkServer負責一部分Tablet分片資料,MergeServer和ChunkServer一般會一起部署。

雙十一前期準備

對於淘寶的大部分應用而言,“雙十一”就是一年一度的一次線上壓測。伴隨流量不斷重新整理著歷史新高,對每個系統的可擴充套件性提出了很大的挑戰。為了迎戰雙十一各產品線對有可能成為瓶頸部分的流量進行預估和擴容成為刻不容緩的任務。在本文要分享的案例中,應用方根據歷史資料預估讀請求的訪問峰值為7w QPS,約為平時的5-6倍,合計每天支援56億次的讀請求。當時OceanBase叢集部署規模是36臺伺服器,儲存總資料量為200億行記錄,每天支援24億次的讀請求。

當前叢集的讀取效能遠不能滿足需求,我們首先進行了一次擴容,上線了10臺Chunkserver/Mergeserver伺服器。由於OceanBase本身具有比較強的可擴充套件性,為叢集加機器是一件非常簡單的操作。中心節點Rootserver在新機器註冊上線後,會啟動Rebalance功能以Tablet為單位對靜態資料進行資料遷移,見下圖的示意,最終達到所有ChunkServer上資料分片的均衡分佈。

表 1. 某Table的Tablet列表

圖2.1 Tablet在三臺ChunkServer上的分佈

圖2.2加入一臺機器Tablet遷移後的分佈

擴容完成後引入線上流量回放機制進行壓力測試,以驗證當前叢集的效能是否可以滿足應用的雙十一需求。我們使用了10臺伺服器共2000-4000個執行緒併發回放線上讀流量對叢集進行壓測,很快發現叢集整體的QPS在達到4萬左右後,壓測客戶端出現大量超時現象,平均響應延遲已經超過閾值100ms,即使不斷調整壓力,系統的整體QPS也沒有任何增大。此時觀察整個叢集機器的負載狀態發現只有極個別伺服器的負載超高,是其他機器的4倍左右,其他機器基本處於空閒狀態,CPU、網路、磁碟IO都凸現了嚴重的不均衡問題

負載不均衡導致了整體的吞吐取決於負載最高的那臺Server,這正是前文提到的典型 “短板理論”問題。

負載不均問題跟蹤

客戶端連線到OceanBase之後一次讀請求的讀流程如下圖所示:

圖3 客戶端到OceanBase的讀流程圖

  1. Client 從RootServer獲取到MergeServer 列表;
  2. Client將請求傳送到某一臺MergeServer;
  3. MergeServer從RootServer獲取請求對應的ChunkServer位置資訊;
  4. MergeServer將請求按照Tablet拆分成多個子請求傳送到對應的ChunkServer;
  5. ChunkServer向UpdateServer請求最新的動態資料,與靜態資料進行合併;
  6. MergeServer合併所有子請求的資料,返回給Client;

OceanBase的讀請求流程看起來如此複雜,實際上第1步和第3步中Client與RootServer以及MergeServer與RootServer的兩次互動會利用快取機制來避免,即提高了效率,同時也極大降低了RootServer的負載。

分析以上的流程可知,在第2步客戶端選擇MergeServer時如果排程不均衡會導致某臺MergeServer機器過載;在第4步MergeServer把子請求傳送到資料所在的ChunkServer時,由於每個tablet會有多個副本,選擇副本的策略如果不均衡也會造成ChunkServer機器過載。由於叢集部署會在同一臺機器會同時啟動ChunkServer和MergeServer,無法簡單區分過載的模組。通過檢視OceanBase內部各模組的提供的監控資訊比如QPS、Cache命中率、磁碟IO數量等,發現負載不均問題是由第二個排程問題引發,即MergeServer對ChunkServer的訪問出現了不均衡導致了部分ChunkServer的過載。

ChunkServer是儲存靜態Tablet分片資料的節點,分析其負載不均的原因包含如下可能:

  1. 資料不均衡: ChunkServer上資料大小的分佈是不均衡的,比如某些節點因為儲存Tablet分片資料量多少的差異性而造成的不均衡;
  2. 流量不均衡:資料即使是基本均衡的情況下,仍然會因為某些節點存在資料熱點等原因而造成流量是不均衡的。

通過對RootServer管理的所有tablet資料分片所在位置資訊Metadata進行統計,我們發現各個ChunkServer上的tablet資料量差異不大,這同時也說明擴容加入新的Server之後,叢集的Rebalance是有效的(後來我們在其他應用的叢集也發現了存在資料不均衡問題,本文暫不解釋)。

儘管排除了資料不均衡問題,流量不均衡又存在如下的幾種可能性:

  1. 存在訪問熱點:比如熱銷的商品,這些熱點資料會導致ChunkServer成為訪問熱點,造成了負載不均;
  2. 請求差異性較大:系統負載和處理請求所耗費的CPU\Memory\磁碟IO資源成正比,而資源的耗費一般又和處理的資料量是成正比的,即可能是因為存在某些大使用者而導致沒有資料訪問熱點的情況下,負載仍然是不均衡的。

經過如上的分析至少已經確定ChunkServer流量不均衡問題和步驟4緊密相關的,而目前所採用的tablet副本選擇的策略是隨機法。一般而言隨機化的負載均衡策略簡單、高效、無狀態,結合業務場景的特點進行分析,熱點資料所佔的比例並不會太高,把ChunkServer上的Tablet按照訪問次數進行統計也發現並沒有超乎想象的“大熱點”,基本服從正太分佈

可見熱點Tablet雖訪問頻率稍高對負載的貢獻率相對較大,但是熱點tablet的佔比很低,相反所有非熱點tablet對負載的貢獻率總和還是很高的,這種情況就好比“長尾效應”[3]。

負載均衡演算法設計

如果把熱點ChunkServer上非熱點Tablet的訪問排程到其他Server,是可以緩解流量不均問題的,因此我們設計了新的負載均衡演算法為以實時統計的ChunkServer上所有tablet的訪問次數為Ticket,每次對Tablet的讀請求會選擇副本中得票率最低的ChunkServer。

同時考慮到流量不均衡的第二個原因是請求的差異較大問題,ChunkServer對外提供的介面分為Get和Scan兩種,Scan是掃描一個範圍的所有行資料,Get是獲取指定一行資料,因此兩種訪問方式的次數需要劃分賦予不同的權重(α,β)參與最終Ticket的運算:

除此之外,簡單的區分兩種訪問模式還是遠遠不夠的,不同的Scan佔用的資源也是存在較大差異的,引入平均響應時間(avg_time)這個重要因素也是十分必要的:

負載均衡演算法要求具有自適應性和強的實時性,一方面新的訪問要實時累積參與下次的負載均衡的排程,另一方面歷史權重資料則需要根據統計週期進行非線性的衰減(y 衰減因子),減少對實時性的影響:

採用新的演算法後,很好的緩解了負載不均衡的問題,整體負載提升了1倍,整體QPS吞吐提升到了8w。

小結

負載均衡問題是老生常談的問題,解決不好就會出現“短板效應”,更甚至引發分散式系統中的連鎖反應即“雪崩”,從而演化成系統的災難。負載均衡的演算法也層出不窮,有的出於成本最優,有的是為了最小延遲,有的則是最大化系統吞吐,目的不同演算法自然各異,不存在包治百病的良方,並不是越複雜的演算法越有效[4],要綜合考慮演算法所需資料獲取的Overhead,更多的是遵循“簡單實用”的法則,根據業務場景進行分析和嘗試。

正是這種靈活性的策略,對我們的系統設計提出了新的需求,要有一定的機制來監控和驗證問題:比如可以實時獲取系統執行的各種內部狀態和資料,允許選擇不同負載均衡演算法進行試驗等。

Update1:看到樓下網友專業方面的提問,@Leverly 已經進行了回覆。有更多交流,不妨直接討論。共享:)!

3月2日Update2:圖2.2已更換(原圖右邊顯示不完全,應為“A,E,G,H,I")。

參考文獻

4.http://www.cs.usask.ca/faculty/eager/loadsharing.pdf

歡迎 @CSDN雲端計算微博參與討論,瞭解更多雲資訊。

相關推薦

LVS叢集排程演算法負載均衡——理論

編者按:在CSDN雲端計算頻道日前所做的文章《響應高達6秒 使用者揭露Heroku私自修改路由造成高支出》中,網友們認為這是“因隨機排程+Rails的單執行緒處理導致延遲增加的負載均衡失敗的案例”。但在負載均衡測試時就能發現問題並妥善解決的成功經驗有沒有?在隨後的微博中,支付寶的@Leverly評論:

LVS集群調度算法負載均衡-理論

不同 是把 標記 iptables 針對 能夠 hash 比例 ssi 一、LVS概念 LVS(Linux Virtual Server):linux 虛擬服務器 LVS是個負載均衡設備,它不提供任何服務,用戶請求到這裏的時候,它是將客戶需求轉發至後端真正提供服

nginx超詳細講解location,rewrite,反向代理負載均衡

一、location 的語法 locltion可以把不同方式的請求,定位到不同的處理方式上(個人感覺有點像java中的filter) 1.1location分類及用法 location大致分為三

Linux學習一-Linux字符集亂碼處理

gin tails 讀取 文件 latin1 style ESS 自身 win Linux字符集及亂碼處理 1、字符(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集(Character set)是多個字符的集合,字符集種類較多

資料探勘大經典演算法

國際權威的學術組織the IEEE International Conference on Data Mining (ICDM) 2006年12月評選出了資料探勘領域的十大經典演算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, k

演算法圖解-----常用演算法

10種演算法 1、二叉查詢樹 節點:左子節點的值都比它小,而右子節點的值都比它大 插入後無需排序, 2、反向索引 搜尋引擎的工作原理,建立一個散列表,鍵為“搜尋詞”,值為“包含搜尋詞的介面”; 3、傅立葉變換 “給它一杯冰沙,它能告訴你其中包含哪些成分”,例如:給定一首歌曲,傅立葉變

程式設計美---電梯排程演算法

在看linux 0.11版本的塊裝置驅動部分,裡面提到了電梯演算法,總結下幾種尋道的方式。         第一種:最為原始的先到先服務(first come first served)的演算法。假設此時我們正在第11道讀取資料,然後陸陸續續有其他程序來要求我們提供磁碟內容

機器學習筆記()EM演算法實踐(以混合高斯模型(GMM)為例來次完整的EM)

今天要來討論的是EM演算法。第一眼看到EM我就想到了我大楓哥,EM Master,千里馬,RUA!!!不知道看這個部落格的人有沒有懂這個梗的。好的,言歸正傳,今天要講的EM演算法,全稱是Expectation maximization,期望最大化。怎麼個意思呢,就是給你一

unity標準Shader貼圖型別

                                                           十種貼圖型別 介紹:標準 Shader 貼圖 標準 Shader 使用的是 PBR 渲染,基於現實物理效果的渲染表現形式。 一個模型能不能使用標準 Shad

Python的常見演算法

十種排序演算法 1. 常見演算法分類 十種常見排序演算法一般分為以下幾種: (1)非線性時間比較類排序: ​ a. 交換類排序(快速排序、氣泡排序) ​ b. 插入類排序(簡單插入排序、希爾排序) ​ c. 選擇類排序(簡單選擇排序、堆排序) ​ d. 歸併排序(二路歸併排序、多路歸併排序)

資料結構排序演算法(動圖演示)

0,演算法概述 0.1演算法分類 十種常見排序演算法可以分為兩大類: 非線性時間比較類排序:通過比較來決定元素間的相對次序,由於其時間複雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。 線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基於比較排

機器學習筆記二——SVM原理推導

svm(support vector machine)是一種二分類演算法,它的目標在於尋找一個能將兩種點分離的直線或平面或超平面。 如圖(來自wiki): 圖中的紅線將兩邊資料點分開,這條線就是分割直線,同樣的,在三維座標軸中,將兩邊資料點分開的平面,稱為分割平面;更高維的空間座標軸,

linux 修改磁碟排程演算法

IO排程器的總體目標是希望讓磁頭能夠總是往一個方向移動,移動到底了再往反方向走,這恰恰就是現實生活中的電梯模型,所以IO排程器也被叫做電梯. (elevator)而相應的演算法也就被叫做電梯演算法.而Linux中IO排程的電梯演算法有好幾種,一個叫做as(Anticipato

c語言實現fcfs,rr_1,spn,srt4排程演算法(無資料結構)

在網上找的程式碼都很複雜,所以我寫了一個簡單的程式,不涉及任何資料結構,純演算法實現 先科普一下四種演算法的含義(個人理解): FCFS:非剝奪式,意思很明顯,先到達就先執行 RR_1:輪轉排程演算法,時間片為1,在當前時間點或之前到達的,按照順序一個程式執行一次 SPN

淺談常見的七加密演算法實現(附程式碼)

1. 前言 數字簽名、資訊加密 是前後端開發都經常需要使用到的技術,應用場景包括了使用者登入、交易、資訊通訊、oauth 等等,不同的應用場景也會需要使用到不同的簽名加密演算法,或者需要搭配不一樣的 簽名加密演算法來達到業務目標。這裡簡單的給大家介紹幾種常見的簽

C/C++的八排序演算法實現

  最近看排序演算法的書籍,記錄下自己的心得和總結。關於幾種常見排序的原理和實現。(快速排序借了別人的步驟描述,可以很清晰的理解每一趟怎麼跑的) 首先說下穩定排序和非穩定排序,簡單地說就是所有相等的數

排序演算法

1.常見演算法分類 十種常見排序演算法一般分為以下幾種:  (1)非線性時間比較類排序:交換類排序(快速排序和氣泡排序)、插入類排序(簡單插入排序和希爾排序)、選擇類排序(簡單選擇排序和堆排序)、歸併排序(二路歸併排序和多路歸併排序); (2)線性時間非比較類排序

資源排程機制原始碼分析(schedule方法,兩排程演算法

sparkContext初始化後會註冊Application,然後會呼叫schedule方法,如何為Application在worker上啟動Executor,Executor啟動後,DAGScheduler和TaskScheduler才能分配task給Executor來進行

必須知道的基礎演算法

演算法一:快速排序演算法 快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部迴圈(in

機器學習大經典演算法(八) PageRank演算法

PageRank演算法        (一)  PageRank演算法簡介:        Google的創始人之一LarryPage於1998年提出了PageRank,並應用在Google搜尋引擎的檢索結果排序上,該技術也是Google早期的核心技術之一。        L