隨著業務的擴充套件,資料量不斷積累,資料庫系統的資料容量和計算能力會逐漸不堪重負,因此優秀的資料庫系統必須具備良好的擴充套件性。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
為了體現擴充套件後的效果,我們首先在集
群中建立一個分散式資料庫,並寫入資料:
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處於關停狀態。
啟動各個節點,叢集即可正常使用。
下面我們往叢集上的資料庫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上。
有時候我們會發現,某些資料會遷移到其他節點。這與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))
到磁碟上觀察資料是否被寫入:
DolphinDB能支援的資料規模沒有明確的上限,完全取決於投入資源的多少。