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。
创建表
- Frontend 向 Metasrv leader 提交 DDL 请求。
- Metasrv 根据分区规则确定 Region,并为每个 Region 选择 Datanode。
- 持久化的 Procedure 创建 Region,并写入表元数据和路由。发生 leader 切换后,Procedure 可以从已保存的状态继续执行。
- 元数据提交后,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。