随着业务的扩大,数据量一直积攒,数据库系统的数据容量和计算能力会逐步不堪重负,因而优良的数据库系统必须具备良好的扩展性。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,mode172.18.0.11:8701:agent1,agent172.18.0.12:8701:agent2,agent172.18.0.13:8701:agent3,agent172.18.0.11:8801:node1,datanode172.18.0.12:8802:node2,datanode172.18.0.13:8803:node3,datanode
数据节点1所在物理服务器上的agent.cfg
localSite=172.18.0.11:8701:agent1controllerSite=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:ctl8990mode=agent
(2)批改集群成员配置
到管制节点所在的物理服务器,批改config/cluster.nodes,新增集群成员信息。批改后的文件内容为:
localSite,mode172.18.0.11:8701:agent1,agent172.18.0.12:8701:agent2,agent172.18.0.13:8701:agent3,agent172.18.0.14:8701:agent4,agent172.18.0.11:8801:node1,datanode172.18.0.12:8802:node2,datanode172.18.0.13:8803:node3,datanode172.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机制和管制节点的以下配置参数无关:
#集群内每个数据正本数,默认2dfsReplicationFactor=2#正本安全策略,0 多个正本容许存在一个节点 1 多个正本必须分存到不同节点,默认0dfsReplicaReliabilityLevel=1#节点心跳进行多久开启Recovery,默认不启用,单位msdfsRecoveryWaitTime=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能反对的数据规模没有明确的下限,齐全取决于投入资源的多少。