在文章《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
集羣數據遷移數據庫
Step 1:準備工做segmentfault
在圖數據庫 Nebula Graph 中, Balance 主要用來 balance leader 和 partition,只涉及 leader 和 partition 在機器之間轉移,不會增長或者減小 leader 和 partition 的數量。bash
上線新機器並啓動相應的 Nebula 服務後,storage 會自動向 meta 註冊。Meta 會計算出一個新的 partition 分佈,而後經過 remove partition和 add partition 逐步將數據從老機器搬遷到新的機器上。這個過程所對應的命令是 BALANCE DATA
,一般數據搬遷是個比較漫長的過程。架構
但 BALANCE DATA 僅改變了數據和副本在機器之間的均衡分佈,leader(和對應的負載) 是不會改變的,所以還須要經過命令BALANCE LEADER
來實現負載的均衡。這個過程也是經過 meta 實現的。負載均衡
如下舉例說明 BALANCE DATA
的使用方式。本例將從 3 個實例(進程)擴展到 8 個實例(進程):分佈式
部署一個 3 副本的集羣,1個 graphd,1個 metad,3 個 storaged(具體部署方式請參考集羣部署文:https://zhuanlan.zhihu.com/p/80335605),經過 SHOW HOSTS
命令能夠看到集羣的狀態信息:url
按照集羣部署文檔部署好 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
返回結果解釋:
expired_threshold_sec
來修改,當前默認值是 10 分鐘。能夠看到 _Leader distribution_ 和 _Partition distribution_ 暫時都沒有數據。
建立一個名爲 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 | ------------------------------------------------------------------------------------------------
如上,建立包含 100 個 partitio_n 和 3 個 _replica 圖空間以後,3 個實例的_Leader distribution_ 和 _Partition distribution _有了對應的數值,對應的 _Partition distribution_都爲 100。固然,這樣的 learder 分佈還不均勻。
啓動 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 | ------------------------------------------------------------------------------------------------
上新實例以後,集羣由原來 3 個實例變成了 8 個實例。上圖數據庫 icon 爲藍色的圖示爲新增的 5 個實例,此時因爲僅僅加入了集羣,新實例的狀態爲 Online,但此時_Leader distribution_ 和 Partition distribution 並無數值,說明還不會參與服務。
運行 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
返回結果說明:
以 1570761786, 1:88, 192.168.8.210:34700->192.168.8.210:35940
爲例:
第二列表示當前 task 的運行狀態,有 4 種狀態
最後對全部 task 運行狀態的統計,部分 partition 還沒有完成遷移。
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 計劃並開始執行。
大多數狀況下,搬遷數據是個比較漫長的過程。可是搬遷過程不會影響已有服務。如今能夠經過 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)
_Partition distribution _相近,partition 總數 300 不變且 partition 已均衡的分佈至各個實例。
若是有運行失敗的 task,可再次運行 BALANCE DATA
命令進行修復。若是屢次運行仍沒法修復,請與社區聯繫 GitHub。
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)
如上, 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_ 這個實例的狀態變化。
說明:有顏色爲紅色說明對應的數值發生變化,若是數值不變,則爲黑色。
最後是 Nebula 的 GitHub 地址,歡迎你們試用,有什麼問題能夠向咱們提 issue。GitHub 地址:https://github.com/vesoft-inc/nebula