多集群管理
在公司内部,各个业务部门往往会独立搭建数据存储和计算集群,以满足各自的需求。然而,这种独立性导致了资源的分散和利用效率的低下。为充分利用各个集群资源,DolphiDB 提供了多集群管理工具,实现了对所有集群的统一管理和监控。其支持跨集群的数据查询,使得各部门能够更好地共享和利用资源,从而提高整体数据处理效率和决策能力。
1 架构设计
DolphinDB 多集群管理采用中心化的架构,通过一个中心节点或集群作为多集群的管理者(MoM,Master of Master)来统一管理和维护多个成员集群。其中,MoM 只能是非高可用集群,而成员集群可以是高可用或非高可用集群。架构图如下:
在 DolphinDB 多集群架构中,MoM 负责维护多个集群的拓扑结构、数据库和表等信息。成员集群的 Master 节点(高可用时为 Leader,非高可用时为 Controller)和 MoM 节点定时向 MoM 汇报心跳信息,这些信息包含集群的状态和其他相关信息。当 MoM 收到来自成员集群的 Master 节点和自身的心跳信息时,将心跳信息作为参数调用预设的回调函数。该回调函数负责将心跳信息写入分布式分区表,以存储各个集群的监控信息。
2 基本功能
基于以上架构,DolphinDB 实现了以下功能:对多个集群的状态进行监控、在不同的集群间进行数据访问操作,同时提供对数据访问的权限控制。
2.1 集群管理
通过多集群管理工具(近期发布)进行集群管理,包括对集群状态进行监控、查看集群详细信息、对集群中的数据库、表进行管理等。
-
监控状态
通过该页面实时查看集群的详细状态,包括使用负载、启用节点数、CPU 使用率、磁盘容量及剩余容量、节点写入读取速率等。监控页面如下图:
-
查看集群信息
在集群信息页面,选择特定的集群,可以查看该集群详细的状态监控、节点及作业信息。也可以指定要查看的时间范围和刷新的频率:
点击”节点总览”,查看该集群下的节点信息:
点击”作业管理”,查看该集群下的作业状态:
-
数据管理
通过数据管理也能,可以查看所有集群拥有的 Catalog, Schema 以及数据库表。通过点击具体对象查看它们的详细信息:
2.2 跨集群数据访问
DolphinDB 在其 catalog 机制的基础上,引入”集群标识符“的概念,从而实现了多集群管理模式下的跨集群数据访问功能。用户必须在集群中使用 catalog 来定义数据库和数据表。否则,将无法进行跨集群的数据访问,只能监控集群的状态。
使用 catalog 来定义数据库和数据表的语法如下:
<catalog>.<schema>.<table>[@<cluster_identifier>]
其中,@ 之前的内容表示数据目录的存储结构,而 @ 之后的内容则是集群标识符,用于指示当前目录下的集群名称。在进行跨集群访问时,需要通过 cluster_identifier 指定要访问的集群。例如,在集群 cluster1 中存在表 trading.stock.quote。如果想在集群 cluster2 中查询 cluster1 中的这张表,可以使用以下语句:
select * from trading.stock.quote@cluster1
注意:
-
目前仅支持对跨集群库表进行查询,不支持写入、更新等修改操作,也不支持表连接。
-
不支持在一个查询语句中同时访问来自多个不同集群的数据。
在进行跨集群数据访问时,成员集群需要先通过 MoM 获取其他集群的信息并进行身份验证,验证成功后便可以访问其他集群的数据。下一节将展开讨论访问权限管理。
2.3 访问权限管理
多集群管理中的权限管理与用户所在集群的权限管理相互独立,互不影响。在多集群管理中,所有跨集群的权限设置必须在 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。
3 多集群管理配置
要使用多集群管理功能,需要在 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.1: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.1:8848
-
在集群 3 的 controller.cfg 配置文件中添加:
clusterName=cluster2 masterOfMasterSite=192.168.1.1:8848
// 填写 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)
至此,完成多集群管理工具需要的所有配置。启动所有集群后,便可通过该工具监控所有集群状态。
4 未来规划
DolphinDB 将继续优化多集群管理,规划在未来版本中实现以下功能:
-
持在一个查询语句中同时访问来自多个不同集群的数据。
-
支持写入、更新等修改操作,不支持表连接。
-
支持更全面的权限控制。
-
提供支持更多维度的多集群管理工具,包括资源监控、数据访问和权限控制等功能。