圖數據庫設計實踐 | 存儲服務的負載均衡和數據遷移

image

在文章《Nebula 架構剖析系列(一)圖數據庫的存儲設計》中,咱們提過度布式圖存儲的管理由 Meta Service 來統一調度,它記錄了全部 partition 的分佈狀況,以及當前機器的狀態。當 DBA 增減機器時,只須要經過 console 輸入相應的指令,Meta Service 便可以生成整個 Balance 計劃並執行。而之因此沒有采用徹底自動 Balance 的方式,主要是爲了減小數據搬遷對於線上服務的影響,Balance 的時機由用戶本身控制。git

在本文中咱們將着重講解在存儲層如何實現數據和服務的負載平衡。github

簡單回顧一下,Nebula Graph 的服務可分爲 graph,storage,meta。本文主要描述對於存儲層(storage)的數據和服務的 balance。這些都是經過 Balance 命令來實現的:Balance 命令有兩種,一種須要遷移數據,命令爲 BALANCE DATA ;另外一種不須要遷移數據,只改變 partition 的 raft-leader 分佈(負載均衡),命令爲 BALANCE LEADER 。shell

本文目錄

  • Balance 機制淺析
  • 集羣數據遷移數據庫

    • Step 1:準備工做segmentfault

      • Step 1.1 查看現有集羣狀態
      • Step 1.2 建立圖空間
    • Step 2 加入新實例
    • Step 3 遷移數據
    • Step 4 假如要中途中止 balance data
    • Step 5 查看數據遷移結果
    • Step 6 Balance leader
  • 批量縮容
  • 示例數據遷移

Balance 機制淺析

在圖數據庫 Nebula Graph 中, Balance 主要用來 balance leader 和 partition,只涉及 leader 和 partition 在機器之間轉移,不會增長或者減小 leader 和 partition 的數量bash

上線新機器並啓動相應的 Nebula 服務後,storage 會自動向 meta 註冊。Meta 會計算出一個新的 partition 分佈,而後經過 remove partitionadd partition 逐步將數據從老機器搬遷到新的機器上。這個過程所對應的命令是 BALANCE DATA ,一般數據搬遷是個比較漫長的過程。架構

但 BALANCE DATA 僅改變了數據和副本在機器之間的均衡分佈,leader(和對應的負載) 是不會改變的,所以還須要經過命令BALANCE LEADER來實現負載的均衡。這個過程也是經過 meta 實現的。負載均衡

集羣數據遷移

如下舉例說明 BALANCE DATA 的使用方式。本例將從 3 個實例(進程)擴展到 8 個實例(進程):分佈式

Step 1:準備工做

部署一個 3 副本的集羣,1個 graphd,1個 metad,3 個 storaged(具體部署方式請參考集羣部署文:https://zhuanlan.zhihu.com/p/80335605),經過 SHOW HOSTS 命令能夠看到集羣的狀態信息:url

Step 1.1 查看現有集羣狀態

按照集羣部署文檔部署好 3 副本集羣以後,用 SHOW HOSTS 命令查看下如今集羣狀況:

nebula> SHOW HOSTS
================================================================================================
| Ip            | Port  | Status | Leader count | Leader distribution | Partition distribution |
================================================================================================
| 192.168.8.210 | 34600 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34700 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34500 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------
Got 3 rows (Time spent: 5886/6835 us)

SHOW HOSTS 返回結果解釋:

  • IP_,_Port 表示當前的 storage 實例。這個集羣啓動了 3 個 storaged 服務,而且尚未任何數據。(192.168.8.210:34600,192.168.8.210:34700,192.168.8.210:34500)
  • Status 表示當前實例的狀態,目前有 online/offline 兩種。當機器下線之後(metad 在一段間隔內收不到其心跳),將把其更改成 offline。 這個時間間隔能夠在啓動 metad 的時候經過設置 expired_threshold_sec 來修改,當前默認值是 10 分鐘。
  • _Leader count_:表示當前實例 Raft leader 數目。
  • _Leader distribution_:表示當前 leader 在每一個 space 上的分佈,目前還沒有建立任何 space。( space 能夠理解爲一個獨立的數據空間,相似 MySQL 的 Database)
  • _Partition distribution_:不一樣 space 中 partition 的數目。

image

能夠看到  _Leader distribution_ 和 _Partition distribution_ 暫時都沒有數據。

Step 1.2 建立圖空間

建立一個名爲 test 的圖空間,包含 100 個 partition,每一個 partition 有 3 個副本。

nebula> CREATE SPACE test (PARTITION_NUM=100, REPLICA_FACTOR=3)

片刻後,使用 SHOW HOSTS 命令顯示集羣的分佈。

nebula> SHOW HOSTS
================================================================================================
| Ip            | Port  | Status | Leader count | Leader distribution | Partition distribution |
================================================================================================
| 192.168.8.210 | 34600 | online | 0            | test: 0             | test: 100              |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34700 | online | 52           | test: 52            | test: 100              |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34500 | online | 48           | test: 48            | test: 100              |
------------------------------------------------------------------------------------------------

image

如上,建立包含 100 個 partitio_n 和 3 個 _replica 圖空間以後,3 個實例的_Leader distribution_ 和 _Partition distribution _有了對應的數值,對應的 _Partition distribution_都爲 100。固然,這樣的 learder 分佈還不均勻。

Step 2 加入新實例

啓動 5 個新 storaged 實例進行擴容。啓動完畢後,使用 SHOW HOSTS 命令查看新的狀態:

nebula> SHOW HOSTS
================================================================================================
| Ip            | Port  | Status | Leader count | Leader distribution | Partition distribution |
================================================================================================
| 192.168.8.210 | 34600 | online | 0            | test: 0             | test: 100              |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34900 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 35940 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34920 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 44920 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34700 | online | 52           | test: 52            | test: 100              |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34500 | online | 48           | test: 48            | test: 100              |
------------------------------------------------------------------------------------------------
| 192.168.8.210 | 34800 | online | 0            | No valid partition  | No valid partition     |
------------------------------------------------------------------------------------------------

image

上新實例以後,集羣由原來 3 個實例變成了 8 個實例。上圖數據庫 icon 爲藍色的圖示爲新增的 5 個實例,此時因爲僅僅加入了集羣,新實例的狀態爲 Online,但此時_Leader distribution_ 和 Partition distribution 並無數值,說明還不會參與服務。

Step 3 遷移數據

運行 BALANCE DATA 命令。

nebula> BALANCE DATA
==============
| ID         |
==============
| 1570761786 |
--------------

若是當前集羣有新機器加入,則會生成一個新的計劃 ID。對於已經平衡的集羣,重複運行 BALANCE DATA 不會有任何新操做。若是當前有正在執行的計劃,那會顯示當前計劃的 ID。

也可經過 BALANCE DATA $id 查看這個 balance 的具體執行進度。

nebula> BALANCE DATA 1570761786
===============================================================================
| balanceId, spaceId:partId, src->dst                           | status      |
===============================================================================
| [1570761786, 1:1, 192.168.8.210:34600->192.168.8.210:44920]   | succeeded   |
-------------------------------------------------------------------------------
| [1570761786, 1:1, 192.168.8.210:34700->192.168.8.210:34920]   | succeeded   |
-------------------------------------------------------------------------------
| [1570761786, 1:1, 192.168.8.210:34500->192.168.8.210:34800]   | succeeded   |
-------------------------------------------------------------------------------
...//這裏省略一些。如下一行爲例
-------------------------------------------------------------------------------
| [1570761786, 1:88, 192.168.8.210:34700->192.168.8.210:35940]  | succeeded   |
-------------------------------------------------------------------------------
| Total:189, Succeeded:170, Failed:0, In Progress:19, Invalid:0 | 89.947090%  |
-------------------------------------------------------------------------------
Got 190 rows (Time spent: 5454/11095 us)

BALANCE DATA $id 返回結果說明:

  • 第一列 balanceId,spaceId:partId,src->dst 表示一個具體的 balance task。

1570761786, 1:88, 192.168.8.210:34700->192.168.8.210:35940 爲例:

    • 1570761786 爲 balance ID
    • 1:88,1 表示當前的 spaceId(也就是 space test 的 ID),88 表示遷移的 partitionId
    • 192.168.8.210:34700->192.168.8.210:35940,表示數據從 192.168.8.210:34700 搬遷至_192.168.8.210:35940_。而原先 192.168.8.210:34700 中的數據將會在遷移完成後再 GC 刪除
    • 第二列表示當前 task 的運行狀態,有 4 種狀態

      • Succeeded:運行成功
      • Failed:運行失敗
      • In progress:運行中
      • Invalid:無效的 task

    最後對全部 task 運行狀態的統計,部分 partition 還沒有完成遷移。

    Step 4 假如要中途中止 balance data

    BALANCE DATA STOP 命令用於中止已經開始執行的 balance data 計劃。若是沒有正在運行的 balance 計劃,則會返回錯誤提示。若是有正在運行的 balance 計劃,則會返回計劃對應的 ID。

    因爲每一個 balance 計劃對應若干個 balance task, BALANCE DATA STOP 不會中止已經開始執行的 balance task,只會取消後續的 task,已經開始的 task 將繼續執行直至完成。

    用戶能夠在 BALANCE DATA STOP 以後輸入 BALANCE DATA $id 來查看已經中止的 balance 計劃狀態。

    全部已經開始執行的 task 完成後,能夠再次執行 BALANCE DATA,從新開始 balance。若是以前中止的計劃中有失敗的 task,則會繼續執行以前的計劃,若是以前中止的計劃中全部 task 都成功了,則會新建一個 balance 計劃並開始執行。

    Step 5 查看數據遷移結果

    大多數狀況下,搬遷數據是個比較漫長的過程。可是搬遷過程不會影響已有服務。如今能夠經過 SHOW HOSTS 查看運行後的 partition 分佈。

    nebula> SHOW HOSTS
    ================================================================================================
    | Ip            | Port  | Status | Leader count | Leader distribution | Partition distribution |
    ================================================================================================
    | 192.168.8.210 | 34600 | online | 3            | test: 3             | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34900 | online | 0            | test: 0             | test: 38               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 35940 | online | 0            | test: 0             | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34920 | online | 0            | test: 0             | test: 38               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 44920 | online | 0            | test: 0             | test: 38               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34700 | online | 35           | test: 35            | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34500 | online | 24           | test: 24            | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34800 | online | 38           | test: 38            | test: 38               |
    ------------------------------------------------------------------------------------------------
    Got 8 rows (Time spent: 5074/6488 us)

    image

    _Partition distribution _相近,partition 總數 300 不變且 partition 已均衡的分佈至各個實例。

    若是有運行失敗的 task,可再次運行 BALANCE DATA 命令進行修復。若是屢次運行仍沒法修復,請與社區聯繫 GitHub

    Step 6 Balance leader

    BALANCE DATA 僅能 balance partition,可是 leader 分佈仍然不均衡,這意味着舊實例的服務較重,而新實例的服務能力未獲得充分使用。運行 BALANCE LEADER 從新分佈 Raft leader:

    nebula> BALANCE LEADER

    片刻後,使用 SHOW HOSTS 命令查看,此時 Raft leader 已均勻分佈至全部的實例。

    nebula> SHOW HOSTS
    ================================================================================================
    | Ip            | Port  | Status | Leader count | Leader distribution | Partition distribution |
    ================================================================================================
    | 192.168.8.210 | 34600 | online | 13           | test: 13            | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34900 | online | 12           | test: 12            | test: 38               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 35940 | online | 12           | test: 12            | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34920 | online | 12           | test: 12            | test: 38               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 44920 | online | 13           | test: 13            | test: 38               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34700 | online | 12           | test: 12            | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34500 | online | 13           | test: 13            | test: 37               |
    ------------------------------------------------------------------------------------------------
    | 192.168.8.210 | 34800 | online | 13           | test: 13            | test: 38               |
    ------------------------------------------------------------------------------------------------
    Got 8 rows (Time spent: 5039/6346 us)

    image

    如上, BALANCE LEADER 成功執行後,新增的實例和原來的實例(對應上圖 icon 藍色和黑色圖示)的 _Leader distribution_相近, 全部實例已均衡,此外,也能夠看到 Balance 命令只涉及 leader 和 partition 在物理機器上的轉移,並無增長或者減小 leader 和 partition。

    批量縮容

    Nebula Graph 支持指定須要下線的機器進行批量縮容。語法爲 BALANCE DATA REMOVE $host_list,例如:BALANCE DATA REMOVE 192.168.0.1:50000,192.168.0.2:50000,將指定移除 192.168.0.1:50000,192.168.0.2:50000 兩臺機器。

    若是移除指定機器後,不知足副本數要求(例如剩餘機器數小於副本數),Nebula Graph 將拒絕本次 balance 請求,並返回相關錯誤碼。

    示例數據遷移

    上面講了如何從 3 個實例變成 8個實例的集羣,若是你對上文有疑問,記得在本文的評論區留言哈。咱們如今看看上面遷移的過程,_192.168.8.210:34600_ 這個實例的狀態變化。

    image

    說明:有顏色爲紅色說明對應的數值發生變化,若是數值不變,則爲黑色。

    附錄

    最後是 Nebula 的 GitHub 地址,歡迎你們試用,有什麼問題能夠向咱們提 issue。GitHub 地址:https://github.com/vesoft-inc/nebula

    相關文章
    相關標籤/搜索