ZNBase 分佈式存儲的負載均衡

ZNBase 是浪潮開源的 NewSQL 分佈式數據庫,擁有強一致、高可用的分佈式架構。在高負載的情況下,分佈式數據庫能夠將負載壓力平衡到不同的物理機節點上,充分利用不同節點的資源。本文將介紹 ZNBase 在面對高負載存儲過程中採用的負載均衡策略。

負載均衡

作爲分佈式數據庫,爲了更有效利用不同物理機節點的資源, 避免服務器性能的浪費,在數據庫高負載的情況下需要儘量將壓力平衡到各個物理機節點上。這也是分佈式數據庫的研究重點之一。

云溪數據庫 ZNBase 在存儲上採用三副本策略,即每份數據默認同時存在三個節點中,每個副本爲一個 Replica。數據庫在進行讀寫時,其中一份副本會獲得一定時間內的租約,成爲 lease,該 lease 的節點即爲該 range 的 leaseholder。系統的讀寫都是通過 leaseholder 進行的,leaseholder 會將對該副本的讀寫同步到其他的 Replica。

ZNBase 在啓動時會創建 StoreReblancer,用於自適應的對副本進行均衡。ZNBase 通過對 Replica 以及 lease 進行遷移以平衡數據庫的壓力負載。StoreReblancer 會以 10 秒的週期反覆執行,如果存儲的壓力超過閾值,則會循環對每個 range 分兩個部分進行平衡,包括租約平衡和副本平衡。

圖 1-1 負載均衡基本流程圖

租約平衡

ZNBase 會維護當前節點存儲的副本,其中的 lease 會維護該副本的 QPS(每秒查詢率),並按照 QPS 降序進行排序。壓力不夠閾值的 range,不進行平衡。StoreReblancer 會循環遍歷一個 range 的多個副本,排除本地的,排除壓力不符合閾值的,排除不正常的,排除 zone 限制的副本,選擇剩下的副本轉移租約。租期的選舉和遷移不涉及到 replica 的複製和傳輸。 

對於需要遷移的 range 來說,StoreReblancer 對其租約遷移的副本選取規則如下:

  1. 非本地副本。

  2. 當前 store 擁有的租期是合法的。

  3. 判斷租期轉移後本地 range 的 QPS 可以轉到閾值以內。

  4. 待遷移的 replica 的 raftStatus 領先於候選的 replica 的 raftStatus

  5. 滿足 zone(分區信息)的約束條件 。一些表可能會帶有租期的限制條件,規定了該數據表的副本所在的結點,以及租期所在的結點。對於固定了租期的數據表,StoreReblancer 不會遷移其 range 的租期。

Lease 選取的基本流程如圖 1-2 所示:

圖 1-2 待選取 lease 流程

如果當它的 QPS 大於當前的閾值範圍,數據庫會將其租約轉移到該存儲該副本的其他節點上。因爲數據庫是直接對 leaseholder 進行讀寫,並由 leaseholder 同步到其他副本,故當節點負載過大時,只要將較大讀寫負載的副本租約轉換到其他節點,就可以把該部分的壓力均衡出去。

副本平衡

如果保存某副本的三臺節點壓力負載都不符合 lease 的遷出條件時,數據庫會選擇將該副本同步到三副本以外的節點,然後將 lease 遷出,以動態平衡壓力。系統會對需要平衡的 range 進行篩選,對於壓力沒有達到閾值的 range 或遷移後對該 store 的 QPS 影響較小時,則不會進行平衡操作。 

系統首先設定目標 store 數量,通常等於 range 的副本數。循環一個 range 的多個副本,排除本地副本後,如果副本所在的 store 壓力符合閾值,或者不存在,將該 store 放入目標數組。 

如果目標數組的目標數量不足,則繼續從其他所有 store 中選擇,直到符合目標數量。選擇 Store 目標數組的過程需要符合 zone(分區)限制,容量限制,壓力閾值限制,並排序。如果還是不足,則放棄平衡。同時,副本的遷移應該滿足多樣性的限制,多樣性指副本所在的多級分區的分散程度,副本所在的多級分區越分散,多樣性分值越高。在選擇目標 store 時,需要將新的多樣性分值同原來的多樣性分值進行比較,如果不如以前,則放棄平衡。 

ZNBase 會循環目標數組,計算新的租約和壓力值,然後選擇目標數組進行副本遷移。遷移過程首先用 batch 命令,副本收到命令,併發送快照。

熱數據分裂

如果同時對某副本的數據進行大量的讀寫,壓力負載是由於該副本引起時,單純的遷移 lease 或者 replica 都無法較好的調節該情況。該部分功能由 splitQueue 進行管理。ZNBase 會選擇對熱點數據的 range 進行分裂,從而把壓力從單個 range 上分開,該步驟會導致創建新的 replica,從而分散了壓力和流量。創建新的 replica 之後的均衡仍由 store-reblancer 進行。數據庫會在 range 分裂後再進行 reblance。當壓力降低後,系統會自動進行 range 的合併。

總結

以上就是 ZNBase 在處理高負載存儲時採用的負載均衡策略,通過租約平衡、副本平衡與熱數據分裂三種不同維度的均衡策略,避免了單個節點在高負載情況下出現性能瓶頸,提升了數據庫系統的讀寫性能。 

關於 ZNBase 的更多詳情可以查看:

官方代碼倉庫:https://gitee.com/ZNBase/zn-kvs

ZNBase 官網:http://www.znbase.com/ 

對相關技術或產品有任何問題歡迎提 issue 或在社區中留言討論。同時歡迎廣大對分佈式數據庫感興趣的開發者共同參與 ZNBase 項目的建設。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/HngBtZY_Oj21liFR6p8uYw