Metasrv
Metasrv 包含什么
- 存储元数据(Catalog, Schema, Table, Region 等)
- 请求路由器。它告诉前端在哪里写入和读取数据。
- 数据节点的负载均衡,决定谁应该处理新的表创建请求,更准确地说,它做出资源分配决策。
- 选举与高可用性,GreptimeDB 设计为 Leader-Follower 架构,只有 leader 节点可以写入,而 follower 节点可以读取,follower 节点的数量通常 >= 1,当 leader 不可用时,follower 节点需要能够快速切换为 leader。
- 统计数据收集(通过每个节点上的心跳报告),如 CPU、负载、节点上的表数量、平均/峰值数据读写大小等,可用作分布式调度的基础。
前端如何与 Metasrv 交互
首先,请求路由器中的路由表结构如下(注意这只是逻辑结构,实际存储结构可能不同,例如端点可能有字典压缩)。
table_A
table_name
table_schema // 用于物理计划
regions
region_1
mutate_endpoint
select_endpoint_1, select_endpoint_2
region_2
mutate_endpoint
select_endpoint_1, select_endpoint_2, select_endpoint_3
region_xxx
table_B
...
创建表
- 前端发送
CREATE TABLE
请求到 Metasrv。 - 根据请求中包含的分区规则规划 Region 数量。
- 检查数据节点可用资源的全局视图(通过心跳收集)并为每个 Region 分配一个节点。
- 前端创建表并在成功创建后将
Schema
存储到 Metasrv。
Insert
- 前端从 Metasrv 获取指定表的路由。注意,最小的路由单元是表的路由(多个 Region),即包含该表所有 Region 的地址。
- 最佳实践是前端首先从本地缓存中获取路由并将请求转发到数据节点。如果路由不再有效,则数据节点有义务返回
Invalid Route
错误,前端重新从 Metasrv 获取最新数据并更新其缓存。路由信息不经常变化,因此,前端使用惰性策略维护缓存是足够的。 - 前端处理可能包含多个表和多个 Region 的一批写入,因此前端需要根据“路由表”拆分用户请求。
Select
- 与
Insert
类似,前端首先从本地缓存中获取路由表。 - 与
Insert
不同,对于Select
,前端需要从路由表中提取只读节点(follower),然后根据优先级将请求分发到 leader 或 follower 节点。 - 前端的分布式查询引擎根据路由信息分发多个子查询任务并聚合查询结果。