Auto Repartition
Auto Repartition 是 Autopilot 的一个调度策略,用于自动将大 Region 拆分为多个小 Region。当某个表中存在可能成为性能瓶颈的大 Region 时,Auto Repartition 会基于采样结果生成新的分区边界,并提交 Repartition 操作。
拆分后的 Region 可以被调度到不同 Datanode 上,从而打散潜在的负载瓶颈。Auto Repartition 可以减少手动发现大 Region 和手动执行重分区的运维成本。关于手动重分区的说明,请参考重分区。
前置条件
对象存储用于保存 Region 文件,GC 负责在引用释放后再回收旧文件,避免重分区过程中误删仍在使用的数据。
什么时候使用 Auto Repartition
Auto Repartition 适合以下场景:
- 某些大 Region 可能成为性能瓶颈;
- 表的原有分区规则已经不能匹配当前数据分布;
- 希望将大 Region 拆分为多个小 Region,并通过后续调度打散潜在的负载瓶颈;
- 希望减少手动分析大 Region 和手动执行 Repartition 的运维成本。
未分区表的 Auto Repartition
当指定了重分区列 hint 时,Auto Repartition 也可以作用于未分区表。对于未分区表,GreptimeDB Enterprise 不会自动推断分区列。你可以在创建表时指定后续 Auto Repartition 使用的候选列:
CREATE TABLE sensor_readings (
host STRING,
cpu DOUBLE,
ts TIMESTAMP TIME INDEX,
PRIMARY KEY(host)
)
WITH ('repartition.column.hint'='host');
你也可以后续通过 ALTER TABLE 设置或更新该 hint:
ALTER TABLE sensor_readings SET 'repartition.column.hint'='host';
取消该 hint:
ALTER TABLE sensor_readings UNSET 'repartition.column.hint';
该 hint 只会记录供后续 Auto Repartition 使用的元信息,不会立即触发重分区。当表满足 Auto Repartition 的触发条件后,GreptimeDB Enterprise 可以使用该 hint 指定的列生成分区边界,并提交 Repartition 操作。
重分区列 hint 有以下限制:
- 只能指定一个列。
- 指定的列必须存在于表中。
- 指定的列不能是 time index 列。
- 只能在没有 partition metadata 的表上设置。
- 使用
ALTER TABLE时,必须单独设置或取消,不能和其他 table options 一起修改。
限制
Auto Repartition 支持已分区表,以及设置了 repartition.column.hint 的未分区表。对于未分区表,GreptimeDB Enterprise 不会自动推断分区列。
配置
Auto Repartition 依赖 Autopilot 运行时和集群统计信息。下面的示例同时包含共享配置和 Auto Repartition 配置:
[[plugins]]
[plugins.autopilot]
tick_interval = "45s"
[[plugins]]
[plugins.cluster_stat]
sampling_window = "45s"
max_history_windows = 5
ewma_alpha = 0.2
[[plugins]]
[plugins.auto_repartition]
split_trigger_ratio = 1.8
max_split_parts = 3
table_repartition_cooldown_period = "60s"
max_actions_per_tick = 4
max_actions_per_table_per_tick = 2