表分片
GreptimeDB 将一张表分为多个 Region。分区表达式定义每行数据属于哪个 Region,Region 路由则定义当前由哪个 Datanode 持有该 Region。
分区
分区是由一个或多个列上的表达式描述的逻辑行集合。分区布局需要覆盖表的输入域,使每一行都能找到唯一的目标 Region。SQL 语法和支持的表达式参见表分片。
Region
每个分区对应一个 Region。Region ID 是 Frontend、Datanode 和 Metasrv 用于存储和路由的标识。同一张表的多个 Region 可以放在同一个 Datanode 上。
分区和 Region 的关系参见下图:
┌───────┐
│ │
│ Table │
│ │
└───┬───┘
│
Range [Start, end) │ Horizontally Split Data
┌──────────────────┼──────────────────┐
│ │ │
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ │ │ │ │ │
│ Partition │ │ Partition │ │ Partition │
│ │ │ │ │ │
│ P0 │ │ P1 │ │ Px │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
│ │ │
┌───────┼──────────────────┼───────┐ │ Partition 和 Region 是一一对应的
│ │ │ │ │
│ ┌─────▼─────┐ ┌─────▼─────┐ │ ┌─────▼─────┐
│ │ │ │ │ │ │ │
│ │ Region │ │ Region │ │ │ Region │
│ │ │ │ │ │ │ │
│ │ R0 │ │ R1 │ │ │ Ry │
│ └───────────┘ └───────────┘ │ └───────────┘
│ │
└──────────────────────────────────┘
可以放在同一个 Datanode 之中
路由与剪枝
写入时,Frontend 对每行数据计算分区规则,按 Region 分组,再根据路由表把 Region 请求发送到当前 leader。
查询时,分布式 planner 将查询谓词与分区表达式比较,只扫描可能满足谓词的 Region。如果分区元数据缺失或无法安全解释,planner 会退化为扫描所有 Region,避免漏掉数据。
调整分区布局
Repartition 通过显式的 split 或 merge 调整已有布局。Metasrv 以持久化 procedure 执行变更,更新 Region 路由和分区表达式,并使旧的表路由缓存失效。Frontend 刷新到新元数据后,后续请求使用新的布局。