随着业务的扩展,数据量不断积累,数据库系统的数据容量和计算能力会逐渐不堪重负,所以优秀的数据库系统必须具有良好的扩展性。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能支持的数据规模没有明确的上限,彻底取决于投入资源的多少。