跳到主要内容
版本:1.0

Metasrv

Metasrv 包含什么

Metasrv 是 GreptimeDB 分布式集群中的元数据和协调服务,不参与数据读写链路。它主要负责:

  • 存储 Catalog、Schema、Table、Region、路由和节点元数据;
  • 为新 Region 选择 Datanode,并维护表路由;
  • 选举一个 Metasrv leader 负责协调元数据变更;
  • 通过可恢复的 Procedure 执行 DDL、Region 迁移、故障转移和重分区;
  • 通过心跳维护节点租约和 Region 统计信息;
  • 元数据变更时向 Frontend、Datanode 和 Flownode 广播缓存失效;
  • 向 Datanode 下发 Region 生命周期指令。

前端如何与 Metasrv 交互

Frontend 从 Metasrv 获取表元数据和 Region 路由,并缓存在本地。修改元数据的语句会发送给 Metasrv leader;普通读写则使用缓存的路由直接访问 Datanode。

控制链路和数据链路相互分离:

Frontend
|-- 元数据查询和 DDL -------------------> Metasrv leader
`-- Region 读写 ------------------------> Datanode

Metasrv leader
|-- Region 生命周期指令 ----------------> Datanode
`-- 缓存失效 --------------------------> Frontend / Datanode / Flownode

Datanode
`-- 心跳、租约续期和 Region 统计信息 ----> Metasrv leader

在稳定状态下,表路由为每个 Region 记录一个 leader peer 和零个或多个 follower peer。Leader 是写入目标;支持只读副本的部署可以把读取路由到 follower:

Table route
|-- Region 0
| |-- leader -> Datanode A
| `-- followers -> Datanode B, Datanode C
`-- Region 1
`-- leader -> Datanode D

Region 迁移或故障转移会改变 peer 角色,并可能使 Region 暂时没有 leader。Frontend 刷新缓存路由后,再把后续读写发送给当前 peer。

创建表

  1. Frontend 向 Metasrv leader 提交 DDL 请求。
  2. Metasrv 根据分区规则确定 Region,并为每个 Region 选择 Datanode
  3. 持久化的 Procedure 创建 Region,并写入表元数据和路由。发生 leader 切换后,Procedure 可以从已保存的状态继续执行。
  4. 元数据提交后,Metasrv 通知 Frontend 刷新相关缓存。

Insert

Frontend 解析表路由,按照分区规则拆分数据行,再把各 Region 的写入发送到对应 Datanode。路由发生变化时,相关缓存会失效,Frontend 随后从 Metasrv 重新获取元数据。

Select

Frontend 在查询规划期间使用表和 Region 元数据。分区列上的谓词用于裁剪 Region,分布式查询引擎再把任务发送给持有这些 Region 的 Datanode。参见分布式查询

Metasrv 架构

主要协调路径如下:

Leader election
|
v
Metasrv leader
├─ DDL manager -> Procedure manager
├─ Selector -> 新 Region 的放置
├─ Heartbeat handler chain -> 租约和 Region 统计信息
├─ Region supervisor -> Region 迁移 Procedure
├─ Mailbox -> 缓存失效和 Region 指令
└─ Metadata managers -> KV backend

这些机制共享元数据,但故障边界不同。进程重启可以丢弃缓存和 leader 本地状态;恢复所需的元数据和 Procedure 状态必须持久化。

分布式共识

Metasrv 将 leader 选举与元数据存储分开。只有选出的 Metasrv leader 执行协调和元数据变更操作,其他 Metasrv 节点会把 client 引导到当前 leader。

Key-value backend 保存表元数据、路由、Procedure 状态以及其他必须跨 leader 切换保留的信息。Metasrv 不使用这套选举为 Datanode Region 创建读写副本;Region 可用性由心跳、Region 故障检测和故障转移 Procedure 管理。

心跳管理

Datanode 与 Metasrv leader 保持心跳流。心跳请求报告节点身份、租约、Region 统计信息以及放置和监控所需的其他状态;响应则携带 Region 生命周期指令、缓存失效等控制消息。

心跳驱动两套相互独立的机制,调整心跳周期会同时影响两者:

  • 节点租约:keep-lease handler 为发送心跳的 Datanode 续期。Selector 和 /node-lease 端点据此判断 Datanode 是否仍然存活。
  • Region 故障检测:Region supervisor 为每个 Region 维护一个基于心跳到达间隔的 Phi Accrual 检测器,其判定与租约是否过期无关。

只有开启 Region 故障转移时,故障判定才会提交故障转移迁移。该功能默认关闭,并且要求使用 remote WAL,除非显式允许在本地 WAL 上执行。维护模式同样会抑制故障转移。前置条件和开启方式参见 Region Failover