隨着業務的擴展,數據量不斷積累,數據庫系統的數據容量和計算能力會逐漸不堪重負,所以優秀的數據庫系統必須具有良好的擴展性。DolphinDB集羣中的數據節點是集計算和存儲於一體的,因此要提升計算能力和數據容量,只需針對數據節點便可。DolphinDB既支持水平擴展,即增長節點,也支持垂直擴展,即增長節點的存儲。node
在擴展集羣前,須要對DolphinDB集羣有基本的概念。DolphinDB集羣由3個角色組成:控制節點(Controller)、代理節點(Agent)和數據節點(Data Node)。每一個角色任務分配以下:git
與集羣相關的配置文件,通常位於config目錄下:github
controller.cfg:位於控制節點所在的服務器,負責定義控制節點的相關配置,如IP、端口號、控制節點鏈接數上限等。數據庫
cluster.cfg:位於控制節點所在的服務器,負責定義集羣內每個節點的個性化配置,如存儲路徑、鏈接數、內存限制等。瀏覽器
cluster.nodes:位於控制節點所在的服務器,集羣的成員配置文件,包含節點的IP、端口、節點別名和角色。安全
agent.cfg:包含代理節點的IP、端口和控制節點的IP和端口。每一個物理服務器必須有一個代理節點。服務器
若是是水平擴展集羣,須要修改集羣的成員配置文件(cluster.nodes),若是數據節點位於新的物理服務器上,那麼還須要部署一個新的代理節點(agent.cfg)來負責新物理機上節點的啓停,而後重啓控制節點來加載新的數據節點。當新的數據節點啓動後,節點的計算能力會即時歸入集羣的計算資源統籌,可是已經存儲在集羣中的數據不會調整到新的數據節點,系統會將後續新進入的數據按策略分配到各個數據節點。app
若是是垂直擴展集羣,只須要修改數據節點的配置文件(cluster.cfg),爲指定節點的volumes參數增長路徑。運維
下面將詳細介紹擴展集羣的步驟。分佈式
集羣部署能夠參考教程多物理服務器集羣部署。
示例集羣有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觀察數據的分佈狀況:
擴展集羣后,咱們能夠經過追加新的數據來觀察新的節點或存儲是否啓用。
因爲業務數據量增大,集羣的存儲和計算能力不能知足要求,現新增一臺服務器,並把它加入原來的集羣做爲一個新的節點。新增的服務器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,即多個副本位於不一樣的服務器上。
假設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能支持的數據規模沒有明確的上限,徹底取決於投入資源的多少。