多服务器集群部署

DolphinDB
2021-05-14

多服务器集群部署与升级


DolphinDB 集群包括四种类型节点:控制节点(controller)、代理节点(agent)、数据节点(datanode)和计算节点(compute node)。

  • 控制节点:控制节点是 DolphinDB 集群的核心部分,负责收集代理节点和数据节点的心跳,监控每个节点的工作状态,管理分布式文件系统的元数据和事务日志。多服务器集群中只有一个控制节点。
  • 代理节点:代理节点负责执行控制节点发出的启动和关闭数据节点或计算节点的命令。在一个集群中,每台物理服务器有且仅有一个代理节点。
  • 数据节点:数据节点既可以存储数据,也可以用于数据的查询和计算。每台物理服务器可以配置多个数据节点。
  • 计算节点:计算节点承担数据节点查询和计算的相关职能,负责响应客户端的请求并返回结果,与数据节点共同实现存储资源和计算资源有效隔离。每台物理服务器可以配置零到多个计算节点。本教程用于在 Linux 操作系统上进行多服务器集群的部署、升级、过期 License 升级,并对常见问题做出解答,便于用户快速上手 DolphinDB 。包含以下主题:

部署 DolphinDB 多服务器集群


本教程示例集群的部署架构图如下:


三台部署服务器(P1, P2, P3)对应的内网 IP 地址为:

P1:10.0.0.80
P2:10.0.0.81
P3:10.0.0.82

部署本教程示例多服务器集群前的要求和准备:

  • 本教程示例集群超过了社区版试用授权许可节点数的限制,所以必须在DolphinDB官网申请企业版 License并按第一章第二步的方法进行更新。
  • 建议节点的 IP 地址使用内网 IP,网络使用万兆以太网。如果使用外网地址,则不能保证节点间网络传输性能。
  • DolphinDB 多机集群(非高可用集群)有且仅有一个控制节点。
  • 部署数据节点或者计算节点的服务器必须部署一个代理节点,用于启动和关闭该服务器上的数据节点或计算节点。

第一步:下载

在每台服务器上下载 DolphinDB 安装包并解压。

  • 官方下载地址:https://dolphindb.cn/product#downloads
  • 也可以通过 Shell 指令下载。下载方式如下:wget https://www.dolphindb.cn/downloads/DolphinDB_Linux64_V${release}.zip -O dolphindb.zip其中,${release} 代表版本。例如:下载 2.00.11.3 版本的 Linux64 server,使用以下指令:wget https://www.dolphindb.cn/downloads/DolphinDB_Linux64_V2.00.11.3.zip -O dolphindb.zip如需下载 ABI 或 JIT 版本 server,则需要在版本号后以下划线连接 ABI 或 JIT。例如:下载 2.00.11.3 版本的 Linux64 ABI server, 使用以下指令:wget https://www.dolphindb.cn/downloads/DolphinDB_Linux64_V2.00.11.3_ABI.zip -O dolphindb.zip下载 2.00.11.3 版本的 Linux64 JIT 版本 server,使用以下指令:wget https://www.dolphindb.cn/downloads/DolphinDB_Linux64_V2.00.11.3_JIT.zip -O dolphindb.zip以此类推。
  • 执行以下 Shell 指令解压安装包至指定路径(/path/to/directory):unzip dolphindb.zip -d </path/to/directory>注意:安装路径的目录名中不能含有空格字符或中文字符,否则启动数据节点时会失败。

第二步:更新软件授权许可

与社区版试用授权许可相比,企业版试用授权许可支持更多的节点、CPU 核数和内存。用户拿到企业版试用授权许可,只需用其替换如下文件即可。请注意:每台服务器上的授权许可文件都需要替换。

/DolphinDB/server/dolphindb.lic

本教程示例集群超过了社区版 License节点数的限制,可以前往DolphinDB官网申请企业版试用授权许可。


第三步:集群配置

(1)P1 需要配置的文件

登录 P1 服务器,进入 /DolphinDB/server/clusterDemo/config 目录

  • 配置控制节点参数文件执行以下 Shell 指令修改 controller.cfg 配置文件:vim ./controller.cfgmode=controller localSite=10.0.0.80:8900:controller8900 dfsReplicationFactor=1 dfsReplicaReliabilityLevel=2 dataSync=1 workerNum=4 maxConnections=512 maxMemSize=8 lanCluster=0在这里必须配置的是 localSite,指定控制节点的 IP 地址、端口号和别名。其余参数用户应结合自身服务器硬件配置进行合理参数调优。
  • 配置集群成员参数文件cluster.nodes 用于存放集群代理节点、数据节点和计算节点的信息。本教程配置 3 个代理节点,2 个数据节点和 1 个计算节点,用户可以根据实际要求配置节点个数。该配置文件分为两列,第一例存放节点 IP 地址、端口号和节点别名。这三个信息由冒号分隔;第二列是说明节点类型,比如代理节点类型为 agent,数据节点类型为 datanode,计算节点为 computenode。

注意:节点别名是大小写敏感的,而且在集群内必须是唯一的。

本例中集群的节点配置信息需要包含位于 P1P2P3 的代理节点、数据节点和计算节点信息。执行以下 Shell 指令修改 cluster.nodes 配置文件:

vim ./cluster.nodes
localSite,mode
10.0.0.80:8901:P1-agent,agent
10.0.0.80:8902:P1-datanode,datanode
10.0.0.81:8901:P2-agent,agent
10.0.0.81:8902:P2-datanode,datanode
10.0.0.82:8901:P3-agent,agent
10.0.0.82:8902:P3-computenode,computenode
  • 配置数据节点和计算节点参数文件执行以下 Shell 指令修改 cluster.cfg 配置文件:vim ./cluster.cfgmaxMemSize=32 maxConnections=512 workerNum=4 maxBatchJobWorker=4 chunkCacheEngineMemSize=2 TSDBCacheEngineSize=1 newValuePartitionPolicy=add maxPubConnections=64 subExecutors=4 lanCluster=0 enableChunkGranularityConfig=truecluster.cfg 的配置适用于集群中所有数据节点和计算节点, 用户应结合自身服务器硬件配置进行合理参数调优: maxMemSize推荐设置为min(服务器可用内存/节点数,license限制最大内存)*0.85, workerNum推荐设置为min(服务器逻辑核心数,license限制逻辑核心数), volumes推荐设置为ssd,且设置多块磁盘
  • 配置代理节点参数文件执行以下 Shell 指令修改 agent.cfg 配置文件:vim ./agent.cfgmode=agent localSite=10.0.0.80:8901:P1-agent controllerSite=10.0.0.80:8900:controller8900 workerNum=4 maxMemSize=4 lanCluster=0在这里, controllerSite 需要与 P1 的 controller.cfg 中的 localSite 保持一致,因为代理节点使用 agent.cfg 中的参数 controllerSite 来寻找集群中的控制节点 。若 controller.cfg 中的参数 localSite 有变化,即使只是节点别名有改变,所有代理节点的配置文件 agent.cfg 中的参数 controllerSite 都应当做相应的改变。此外,还必须配置的是 localSite,指定代理节点的 IP 地址、端口号和别名。其余参数用户可根据实际情况进行调整。agent.cfg 中的 sites 配置当前代理节点和集群控制节点的信息,需要依次填写当前代理节点和控制节点的 IP 地址、端口号和别名,例如 sites=10.0.0.80:8901:P1-agent:agent,10.0.0.80:8900:controller8900:controller。只有设置了配置项 sites,才允许在代理节点登录。

(2)P2 需要配置的文件

登录 P2 服务器,进入 /DolphinDB/server/clusterDemo/config 目录

  • 配置代理节点参数文件执行以下 Shell 指令修改 agent.cfg 配置文件:vim ./agent.cfgmode=agent localSite=10.0.0.81:8901:P2-agent controllerSite=10.0.0.80:8900:controller8900 workerNum=4 maxMemSize=4 lanCluster=0在这里, controllerSite 需要与 P1 的 controller.cfg 中的 localSite 保持一致,因为代理节点使用 agent.cfg 中的参数 controllerSite 来寻找集群中的控制节点。若 controller.cfg 中的参数 localSite 有变化,即使只是节点别名有改变,所有代理节点的配置文件 agent.cfg 中的参数 controllerSite 都应当做相应的改变。此外,还必须配置的是 localSite ,指定代理节点的 IP 地址、端口号和别名。其余参数用户可根据实际情况进行调整。agent.cfg 中的 sites 配置当前代理节点和集群控制节点的信息,需要依次填写当前代理节点和控制节点的 IP 地址、端口号和别名,例如 sites=10.0.0.81:8901:P2-agent:agent,10.0.0.80:8900:controller8900:controller。只有设置了配置项 sites,才允许在代理节点登录。

(3)P3 需要配置的文件

登录 P3 服务器,进入 /DolphinDB/server/clusterDemo/config 目录

  • 配置代理节点参数文件执行以下 Shell 指令修改 agent.cfg 配置文件:vim ./agent.cfgmode=agent localSite=10.0.0.82:8901:P3-agent controllerSite=10.0.0.80:8900:controller8900 workerNum=4 maxMemSize=4 lanCluster=0在这里, controllerSite 需要与 P1 的 controller.cfg 中的 localSite 保持一致,因为代理节点使用 agent.cfg 中的参数 controllerSite 来寻找集群中的控制节点。若 controller.cfg 中的参数 localSite 有变化,即使只是节点别名有改变,所有代理节点的配置文件 agent.cfg 中的参数 controllerSite 都应当做相应的改变。此外,还必须配置的是 localSite ,指定代理节点的 IP 地址、端口号和别名。其余参数用户可根据实际情况进行调整。agent.cfg 中的 sites 配置当前代理节点和集群控制节点的信息,需要依次填写当前代理节点和控制节点的 IP 地址、端口号和别名,例如 sites=10.0.0.82:8901:P3-agent:agent,10.0.0.80:8900:controller8900:controller。只有设置了配置项 sites,才允许在代理节点登录。

第四步:启动集群


登录服务器 P1, P2 和 P3,进入 /DolphinDB/server 目录,第一次启动时需要修改文件权限,执行以下 Shell 指令:

chmod +x dolphindb


第五步:连接数据节点创建数据库和分区表


数据节点既可以存储数据,也可以用于数据的查询和计算。接下来通过一个例子介绍如何在 DolphinDB 集群数据节点创建数据库并写入数据。首先,打开控制节点的 Web 管理界面,点击对应的数据节点打开其 Web 交互编程界面,如下图所示(以 P1-datanode 为例):

也可以在浏览器直接输入数据节点的 IP 地址和端口号进入数据节点的 Web 交互编程界面。

在数据节点的 Web 交互编程界面执行以下语句创建数据库和分区表:

// 创建存储的数据库和分区表
login("admin", "123456")
dbName = "dfs://testDB"
tbName = "testTB"
if(existsDatabase(dbName)){
        dropDatabase(dbName)
}
db = database(dbName, VALUE, 2021.01.01..2021.12.31)
colNames = `SecurityID`DateTime`PreClosePx`OpenPx`HighPx`LowPx`LastPx`Volume`Amount
colTypes = [SYMBOL, DATETIME, DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE, INT, DOUBLE]
schemaTable = table(1:0, colNames, colTypes)
db.createPartitionedTable(table=schemaTable, tableName=tbName, partitionColumns=`DateTime)

然后,执行以下语句创建 5000 个股票 1 分钟 K 线数据并写入上面创建的分区表:

// 模拟数据并写入分区表
n = 1210000
randPrice = round(10+rand(1.0, 100), 2)
randVolume = 100+rand(100, 100)
SecurityID = lpad(string(take(0..4999, 5000)), 6, `0)
DateTime = (2023.01.08T09:30:00 + take(0..120, 121)*60).join(2023.01.08T13:00:00 + take(0..120, 121)*60)
PreClosePx = rand(randPrice, n)
OpenPx = rand(randPrice, n)
HighPx = rand(randPrice, n)
LowPx = rand(randPrice, n)
LastPx = rand(randPrice, n)
Volume = int(rand(randVolume, n))
Amount = round(LastPx*Volume, 2)
tmp = cj(table(SecurityID), table(DateTime))
t = tmp.join!(table(PreClosePx, OpenPx, HighPx, LowPx, LastPx, Volume, Amount))
dbName = "dfs://testDB"
tbName = "testTB"
loadTable(dbName, tbName).append!(t)

语句执行成功后可在交互编程界面的左边,数据库一栏查看已创建的库表及字段信息。


也可在本地变量一栏查看已创建的变量和表,展示了变量名、变量类型、变量维度大小、占用内存大小等信息,并且可以直接点击变量名进行变量预览。


第六步:连接计算节点查询和计算

计算节点主要用于数据的查询和计算。接下来通过一个例子介绍如何在计算节点对数据库内的分区表执行查询和计算。首先,打开控制节点的 Web 管理界面,点击对应的计算节点打开其 Web 交互编程界面,如下图所示:

也可以在浏览器直接输入计算节点的 IP 地址和端口号进入计算节点的 Web 交互编程界面。

在计算节点的 Web 交互编程界面执行以下语句加载分区表对象,此时只加载了分区表的元数据,并未加载分区表全量数据,所以响应时间非常快:

// 加载分区表对象
pt = loadTable("dfs://testDB", "testTB")

然后,执行以下语句查询股票表中每天包含的数据条数:

// SQL 返回数据量少的时候,可以直接取回客户端展示
select count(*) from pt group by date(DateTime) as Date

语句执行成功后,查询结果会在 Web 界面下方展示:


执行以下语句计算每支股票每天的 OHLC 值:

// SQL 返回数据量较大时,可以赋值给变量,占用 server 端内存,客户端分页取回展示
result = select first(LastPx) as Open, max(LastPx) as High, min(LastPx) as Low, last(LastPx) as Close from pt group by date(DateTime) as Date, SecurityID

在这里,将计算结果赋值给了 result 变量,这样就不会直接在客户端界面直接展示,减少客户端内存占用,用户可以通过点击本地变量栏目下的 result 变量进行分页展示查看:



基于 Web 的集群管理

完成部署后,我们可以通过控制节点的 Web 管理界面更改集群配置。

控制节点参数配置

点击 Controller Config 按钮,可进行控制节点的参数配置。以下参数是在第一章中 controller.cfg 里配置的,用户可以根据实际应用在这里添加、删除、修改配置参数。这些配置信息都可以在这个界面上进行更改,修改的配置会在重启控制节点之后生效。

注意:如果改变了控制节点的 localSite 参数值,一定要对所有 agent.cfg 中的 controllerSite 参数做相应修改,否则集群将无法正常运行。



数据节点和计算节点参数配置

点击 Nodes Config 按钮,可进行数据节点和计算节点的参数配置。以下参数是在第一章中 cluster.cfg 里配置的,用户可以根据实际应用在这里添加、删除、修改配置参数。修改的配置会在重启数据节点和计算节点之后生效。

设置集群管理器通过外网访问

通常,集群所有节点同属一个内网时,将 site 信息设置为内网地址,使节点间的网络通信更加高效。若同时需要通过外网地址访问集群管理器,需要在 controller 上配置 publicName 选项,用来指定外网访问的地址。publicName 可以设置为域名或者 IP 地址,如果要启动 HTTPS,则必须是域名。举个例子,要设置服务器 P1, P2, P3 上所有节点的外网地址,需要在 cluster.cfg 中填入如下信息:

P1-%.publicName=19.56.128.21
P2-%.publicName=19.56.128.22
P3-%.publicName=19.56.128.23

% 是节点别名的通配符。另外 controller.cfg 也要加上相应的外网域名或 IP, 例如

publicName=19.56.128.21

云部署

DolphinDB集群可以部署在局域网内,也可以部署在私有云或公有云上。DolphinDB默认集群的所有节点在一个局域网内(lanCluster=1)并通过UDP广播来监测节点心跳。但是在云平台上,所有节点不一定在一个局域网内,也有可能不支持UDP。在云平台上,需要在controller.cfg和agent.cfg填入lanCluster=0的参数配置来实现非UDP模式的节点之间的通讯。否则,由于可能无法正常检测到节点的心跳,集群可能无法正常工作。详见  https://docs.dolphindb.cn/zh/tutorials/docker_single_deployment.html