多集群管理
在公司内部,各个业务部门往往会独立搭建数据存储和计算集群,以满足各自的需求。然而,这种独立性导致了资源的分散和利用效率的低下。为充分利用各个集群资源,DolphiDB 提供了多集群管理工具,实现了对所有集群的统一管理和监控。其支持跨集群的数据查询,使得各部门能够更好地共享和利用资源,从而提高整体数据处理效率和决策能力。
架构设计
DolphinDB 多集群管理采用中心化的架构,通过一个中心节点或集群作为多集群的管理者(MoM,Master of Master)来统一管理和维护多个成员集群。其中,MoM 只能是非高可用集群,而成员集群可以是高可用或非高可用集群。架构图如下:

在 DolphinDB 多集群架构中,MoM 负责维护多个集群的拓扑结构、数据库和表等信息。成员集群的 Master 节点(高可用时为 Leader,非高可用时为 Controller)和 MoM 节点定时向 MoM 汇报心跳信息,这些信息包含集群的状态和其他相关信息。当 MoM 收到来自成员集群的 Master 节点和自身的心跳信息时,将心跳信息作为参数调用预设的回调函数。该回调函数负责将心跳信息写入分布式分区表,以存储各个集群的监控信息。
多集群管理配置
要使用多集群管理功能,需要在 MoM 和成员集群的 Master 中进行相关配置:
- 在 MoM 上:
- 配置当前集群是 MoM 集群,配置项 isMasterOfMaster。
- MoM 集群的名称,配置项 clusterName。
- 回调函数的函数视图名称,配置项 momHeartbeatHandler。
- 要通过多集群管理工具监控各集群的状态,还需要完成以下配置:
- momHeartbeatDb:配置存放收集到的集群信息的数据库地址,格式为 dfs://xxx。
- momHeartbeatTable:配置存放收集到的集群信息的的数据表名。
- momDatanode:配置存放数据库表的数据节点名称。
- 在成员集群 Master 上:
- 配置 MoM 的 controller 的地址,配置项 masterOfMasterSite。
- 当前集群(成员集群)的名称,配置项 clusterName。
示例:
希望对集群 1,集群 2 和集群 3 进行多集群管理。其中,集群 1 的 controller 将作为 MoM,假设其地址为192.168.1.193:8848(用户需根据实际情况修改地址)。
- 在集群 1 的 controller.cfg
配置文件中添加:
isMasterOfMaster=true clusterName=Hangzhou_cluster1 momHeartbeatHandler=writeClusterLogToMoM momHeartbeatDb=dfs://clusterLogs momHeartbeatTable=logs momDatanode=dnode1
- 在集群 2 的 controller.cfg
配置文件中添加:
clusterName=ShangHai_cluster1 masterOfMasterSite=192.168.1.193:8848
- 在集群 3 的 controller.cfg
配置文件中添加:
clusterName=cluster2 masterOfMasterSite=192.168.1.193:8848
完成配置后,在由 momDatanode 指定的节点上进行如下操作,完成数据库表的创建:
// 填写 controller 的别名。如果是单机节点,则直接调用 getClusterPerf()
t = rpc("controller8900" ,getClusterPerf)
t.addColumn(["clusterName", "timeStamp"], [STRING, TIMESTAMP])
// 数据库名和配置文件中的配置保持一致
db = database("dfs://clusterLogs", VALUE, ["a", "b"])
// 表名和配置文件中的配置保持一致
tb = createPartitionedTable(db, t, `logs, `clusterName)
def writeClusterLogToMoM(table) {
writeLog("new heart table")
// 和配置文件中的配置保持一致
tbHandle = loadTable("dfs://clusterLogs", `logs)
append!(tbHandle, table)
}
// 函数名和配置文件中的 momHeartbeatHandler 保持一致
addFunctionView(writeClusterLogToMoM)
至此,完成多集群管理工具需要的所有配置。启动所有集群后,便可通过该工具监控所有集群状态。
基本功能
基于 DolphinDB 多集群架构,DolphinDB 实现了以下功能:对多个集群的状态进行监控、在不同的集群间进行数据访问操作,同时提供对数据访问的权限控制。
集群管理
通过 MoM 集群的多集群管理页面进行集群管理。多集群管理功能包括:
- 监控集群状态
- 查看集群详细信息
- 管理集群中的数据库和表

上图中的数据库地址为 MoM 集群控制节点的 IP 和端口(例如:192.168.1.193:8848);请使用 MoM 集群控制节点的用户名和密码进行登录。输入完成后,点击“登录”即可进入集群管理的状态监控页面。
- 监控状态
通过该页面实时查看集群的详细状态,包括使用负载、启用节点数、CPU 使用率、磁盘容量及剩余容量、节点写入读取速率等。监控页面如下图:

- 查看集群信息
在集群信息页面,选择特定的集群,可以查看该集群详细的状态监控、节点状态及作业信息。
“状态监控”界面展示了集群的 CPU、内存、磁盘、网络等资源的主管那天。可以根据需要选择时间范围和刷新的频率:

点击“节点总览”,查看该集群下的节点信息。可以选择显示全部节点或指定类型的节点:

点击“作业管理”,查看该集群下的作业状态:

- 数据管理
数据管理仅支持管理通过 catalog 组织的 database 和 table 等对象。在该页面,您可以查看所有集群 catalog,schema 以及数据库表。点击任一具体对象,可以查看其详细信息:

跨集群数据访问
DolphinDB 在其 catalog 机制的基础上,引入“集群标识符”的概念,从而实现了多集群管理模式下的跨集群数据访问功能。用户必须在集群中使用 catalog 来定义数据库和数据表。否则,将无法进行跨集群的数据访问,只能监控集群的状态。
使用 catalog 来定义数据库和数据表的语法如下:
<catalog>.<schema>.<table>[@<cluster_identifier>]
其中,@ 之前的内容表示数据目录的存储结构,而 @ 之后的内容则是集群标识符,用于指示当前目录下的集群名称。在进行跨集群访问时,需要通过 cluster_identifier 指定要访问的集群。例如,在集群 cluster1 中存在表 trading.stock.quote。如果想在集群 cluster2 中查询 cluster1 中的这张表,可以使用以下语句:
select * from trading.stock.quote@cluster1
注意:
- 目前仅支持对跨集群库表进行查询,不支持写入、更新等修改操作,也不支持表连接。
- 不支持在一个查询语句中同时访问来自多个不同集群的数据。
在进行跨集群数据访问时,成员集群需要先通过 MoM 获取其他集群的信息并进行身份验证,验证成功后便可以访问其他集群的数据。下一节将展开讨论访问权限管理。
访问权限管理
多集群管理中的权限管理与用户所在集群的权限管理相互独立,互不影响。在多集群管理中,所有跨集群的权限设置必须在 MoM 节点上执行,相关权限信息也会保存在 MoM 节点上。在未授权之前,成员集群的用户仅能访问本集群的库表。只有在 MoM 节点授予其对某个集群的访问权限后,才能访问该集群的库表。在 MoM 上进行跨集群权限管理时:
- 需要在用户(user)后面需要加上 @<cluster_identifier>,以指示该用户属于哪个集群。
- 在应用对象/约束规则(objs)后面也需要加上 @<cluster_identifier>,以指示进行权限管理的对象属于哪个集群。
例如:如果集群 cluster2 上的用户 user1 想要读取集群 cluster1 上的表 trading.stock.quote,则需要在 MoM 上执行以下脚本以授予相应权限:
grant("user1@cluster2", TABLE_READ, "trading.stock.quote@cluster1")
需要注意,目前仅支持设置以下权限类型:TABLE_READ, SCHEMA_READ, CATALOG_READ。
未来规划
DolphinDB 将继续优化多集群管理,规划在未来版本中实现以下功能:
- 支持在一个查询语句中同时访问来自多个不同集群的数据。
- 支持写入、更新等修改操作,不支持表连接。
- 支持更全面的权限控制。
- 支持更多维度管理,包括资源监控、数据访问和权限控制等功能。