一個集羣若是出現了負載不均衡問題,那麼負載最大的機器每每將成爲影響系統總體表現的瓶頸和短板。爲了不這種狀況的發生,須要動態負載均衡機制,以達到實時的最大化資源利用率,從而提高系統總體的吞吐。算法
OceanBase是一個具備自治功能的分佈式存儲系統,由中心節點RootServer、靜態數據節點ChunkServer、動態數據節點UpdateServer以及數據合併節點MergeServer四個Server構成,以下圖所示。架構
在一個集羣中,Tablet的多個副本分別存儲在不一樣的ChunkServer,每一個ChunkServer負責一部分Tablet分片數據,MergeServer和ChunkServer通常會一塊兒部署。負載均衡
圖1.Tablet在三臺ChunkServer上的分佈分佈式
圖2.加入一臺機器Tablet遷移後的分佈.net
客戶端鏈接到OceanBase以後一次讀請求的讀流程以下圖所示:設計
分析以上的流程可知,在第2步客戶端選擇MergeServer時若是調度不均衡會致使某臺MergeServer機器過載;在第4步MergeServer把子請求發送到數據所在的ChunkServer時,因爲每一個tablet會有多個副本,選擇副本的策略若是不均衡也會形成ChunkServer機器過載[下面爲按照此處存在負載不均衡分析]。因爲集羣部署會在同一臺機器會同時啓動ChunkServer和MergeServer,沒法簡單區分過載的模塊。接口
若是把熱點ChunkServer上非熱點Tablet的訪問調度到其餘Server,是能夠緩解流量不均問題的,所以咱們設計了新的負載均衡算法爲:以實時統計的ChunkServer上全部tablet的訪問次數爲Ticket,每次對Tablet的讀請求會選擇副本中得票率最低的ChunkServer。內存
同時考慮到流量不均衡的第二個緣由是請求的差別較大問題,ChunkServer對外提供的接口分爲Get和Scan兩種,Scan是掃描一個範圍的全部行數據,Get是獲取指定一行數據,所以兩種訪問方式的次數須要劃分賦予不一樣的權重(α,β)參與最終Ticket的運算:資源
除此以外,簡單的區分兩種訪問模式仍是遠遠不夠的,不一樣的Scan佔用的資源也是存在較大差別的,引入平均響應時間(avg_time)這個重要因素也是十分必要的:部署
負載均衡算法要求具備自適應性和強的實時性,一方面新的訪問要實時累積參與下次的負載均衡的調度,另外一方面歷史權重數據則須要根據統計週期進行非線性的衰減(y 衰減因子),減小對實時性的影響:
本文摘自: