乾貨丨如何水平擴展和垂直擴展DolphinDB集羣?

隨着業務的擴展,數據量不斷積累,數據庫系統的數據容量和計算能力會逐漸不堪重負,因此優秀的數據庫系統必須具備良好的擴展性。DolphinDB集羣中的數據節點是集計算和存儲於一體的,所以要提高計算能力和數據容量,只需針對數據節點即可。DolphinDB既支持水平擴展,即增加節點,也支持垂直擴展,即增加節點的存儲。

在擴展集羣前,需要對DolphinDB集羣有基本的概念。DolphinDB集羣由3個角色組成:控制節點(Controller)、代理節點(Agent)和數據節點(Data Node)。每個角色任務分配如下:

  • 控制節點負責管理元數據,提供Web集羣管理工具。
  • 代理節點負責節點的啓動和停止,每臺服務器上必須有一個代理節點。
  • 數據節點負責計算和存儲。

與集羣相關的配置文件,一般位於config目錄下:

controller.cfg:位於控制節點所在的服務器,負責定義控制節點的相關配置,如IP、端口號、控制節點連接數上限等。

cluster.cfg:位於控制節點所在的服務器,負責定義集羣內每一個節點的個性化配置,如存儲路徑、連接數、內存限制等。

cluster.nodes:位於控制節點所在的服務器,集羣的成員配置文件,包含節點的IP、端口、節點別名和角色。

agent.cfg:包含代理節點的IP、端口和控制節點的IP和端口。每個物理服務器必須有一個代理節點。

如果是水平擴展集羣,需要修改集羣的成員配置文件(cluster.nodes),如果數據節點位於新的物理服務器上,那麼還需要部署一個新的代理節點(agent.cfg)來負責新物理機上節點的啓停,然後重啓控制節點來加載新的數據節點。當新的數據節點啓動後,節點的計算能力會即時納入集羣的計算資源統籌,但是已經存儲在集羣中的數據不會調整到新的數據節點,系統會將後續新進入的數據按策略分配到各個數據節點。

如果是垂直擴展集羣,只需要修改數據節點的配置文件(cluster.cfg),爲指定節點的volumes參數增加路徑。

下面將詳細介紹擴展集羣的步驟。

1. 集羣配置說明

集羣部署可以參考教程多物理服務器集羣部署

示例集羣有3個數據節點,每個數據節點位於一臺物理服務器上,控制節點位於另外一臺物理服務器上:

控制節點:172.18.0.10

數據節點1:172.18.0.11

數據節點2:172.18.0.12

數據節點3:172.18.0.13

各個配置文件的信息如下:

controller.cfg

localSite=172.18.0.10:8990:ctl8990

cluster.nodes

localSite,mode
172.18.0.11:8701:agent1,agent
172.18.0.12:8701:agent2,agent
172.18.0.13:8701:agent3,agent
172.18.0.11:8801:node1,datanode
172.18.0.12:8802:node2,datanode
172.18.0.13:8803:node3,datanode

數據節點1所在物理服務器上的agent.cfg

localSite=172.18.0.11:8701:agent1
controllerSite=172.18.0.10:ctl8900

爲了體現擴展後的效果,我們首先在集

05b9e257c0827cc0f420561ba71156ec.png

羣中創建一個分佈式數據庫,並寫入數據:

data = table(1..1000 as id,rand(`A`B`C,1000) as name)
//分區時預留了1000的餘量,預備後續寫入測試用
db = database("dfs://scaleout_test_db",RANGE,cutPoints(1..2000,10))
tb = db.createPartitionedTable(data,"scaleoutTB",`id)
tb.append!(data)

執行完後通過Web的DFS Explorer觀察數據的分佈情況:


擴展集羣后,我們可以通過追加新的數據來觀察新的節點或存儲是否啓用。

2. 水平擴展

由於業務數據量增大,集羣的存儲和計算能力不能滿足要求,現新增一臺服務器,並把它加入原來的集羣作爲一個新的節點。新增的服務器IP地址爲172.18.0.14,採用8804端口號,別名爲node4。新增服務器需要部署代理節點,採用8701端口,別名爲agent4.

步驟如下:

(1)部署新的代理節點

把DolphinDB的安裝包拷貝至新的服務器,並解壓。在server文件夾下新增config文件夾,並創建agent.cfg,增加以下內容:

#指定Agent本身的ip和端口
localSite=172.18.0.14:8701:agent4
#告訴Agent本集羣的controller位置
controllerSite=172.18.0.10:8990:ctl8990
mode=agent

(2)修改集羣成員配置

到控制節點所在的物理服務器,修改config/cluster.nodes,新增集羣成員信息。修改後的文件內容爲:

localSite,mode
172.18.0.11:8701:agent1,agent
172.18.0.12:8701:agent2,agent
172.18.0.13:8701:agent3,agent
172.18.0.14:8701:agent4,agent
172.18.0.11:8801:node1,datanode
172.18.0.12:8802:node2,datanode
172.18.0.13:8803:node3,datanode
172.18.0.14:8804:node4,datanode

(3)重啓集羣

Linux環境下,使用命令pkill dolphindb,關閉集羣。等待端口資源釋放後,重新啓動controller和各個agent,命令如下:

啓動controller:

nohup ./dolphindb -console 0 -mode controller -script dolphindb.dos -config config/controller.cfg -logFile log/controller.log -nodesFile config/cluster.nodes &

啓動agent:

./dolphindb -mode agent -home data -script dolphindb.dos -config config/agent.cfg -logFile log/agent.log

在瀏覽器地址欄中輸入控制節點的IP和端口號,如172.18.0.10:8990,來訪問Web,我們可以看到新增加的代理節點agent4已經啓動,數據節點node4處於關停狀態。

a621ba6fae168c52a8eab43928ada08a.png

啓動各個節點,集羣即可正常使用。

下面我們往集羣上的數據庫dfs://scaleout_test_db寫入一些數據,驗證新的數據節點是否已經啓用。

tb = database("dfs://scaleout_test_db").loadTable("scaleoutTB")
tb.append!(table(1001..1500 as id,rand(`A`B`C,500) as name))

觀察DFS Explorer,可以看到有數據分佈到新的節點node4上。

46fb3c3bca996c39d5396e6034c2c342.png

有時候我們會發現,某些數據會遷移到其他節點。這與DolphinDB的recovery機制有關。DolphinDB集羣支持數據自動recovery。當系統檢測到集羣部分節點長時間沒有心跳時,判定爲宕機,將從其他副本中自動恢復數據並且保持整個集羣的副本數穩定。這是當某個節點長時間未啓動,數據會發生遷移的原因。DolphinDB的recovery機制和控制節點的以下配置參數有關:

#集羣內每個數據副本數,默認2
dfsReplicationFactor=2
#副本安全策略,0 多個副本允許存在一個節點 1 多個副本必須分存到不同節點,默認0
dfsReplicaReliabilityLevel=1
#節點心跳停止多久開啓Recovery,默認不啓用,單位ms
dfsRecoveryWaitTime=30000

dfsRecoveryWaitTime控制recovery的啓動,如果沒有設置該參數,則關閉recovery功能,默認是關閉狀態。等待時間的設置主要是爲了避免一些計劃內的停機維護導致不必要的recovery,需要用戶根據運維的實際情況來設置。

從穩定性上來講,副本數越多數據越不容易因意外丟失,但是副本數過多也會導致系統保存數據時性能低下,所以dfsReplicationFactor的值不建議低於2,但是具體設置多高需要用戶根據整體集羣的節點數、數據穩定性需求、系統寫入性能需求來綜合考慮。

dfsReplicaReliabilityLevel在生產環境下建議設置爲1,即多個副本位於不同的服務器上。

3. 垂直擴展

假設node3所在的服務器本身的磁盤空間不足,現增加了一塊磁盤,路徑爲/dev/disk2,需要把它納入node3的存儲。數據節點的存儲路徑是由配置文件中的volumes參數指定,如果初始集羣沒有指定volumes參數,那麼默認的存儲路徑爲[HomeDir]/DataNodeAlias]/storage,即node3的默認存儲路徑爲data/node3/storage。

在控制節點的cluster.cfg文件中加上以下內容:

node3.volumes=data/node3/storage,/dev/disk2/node3

注意,如果需要在默認路徑後面添加存儲路徑,需要顯式設置默認路徑,否則會造成默認路徑下的元數據丟失。

修改配置後,只需要重啓數據節點,無需重啓控制節點。

下面往集羣寫入新的數據,查看數據是否被寫入新的磁盤。

tb = database("dfs://scaleout_test_db").loadTable("scaleoutTB")
tb.append!(table(1501..2000 as id,rand(`A`B`C,500) as name))

到磁盤上觀察數據是否被寫入:

9110702674ee8fc237f63dab026b1a33.png


DolphinDB能支持的數據規模沒有明確的上限,完全取決於投入資源的多少。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章