tidb使用pre_split_regions参数打散regions

CREATE TABLE t2 (
id int(11) DEFAULT NULL
) shard_row_id_bits=4 pre_split_regions=3;

CREATE TABLE t2 (
id int(11) DEFAULT NULL
) shard_row_id_bits=4 pre_split_regions=4;

在建表时间使用pre_split_regions参数预分配regions,发现LEADER_STORE_ID节点有时候都在同一个节点,有时候多数都分布在一个节点,就不会适当的均匀分布。


1 个赞

调高 PD 的leader-schedule-limit,加速自动均衡;
用 pd-ctl 手动批量迁移 Region Leader 到不同节点;
规范参数:pre_split_regions数值和shard_row_id_bits保持一致。

1 个赞

应该还是主要通过scheduler内部调度控制的,创建的时候不是平均分布。毕竟每个KV的负载不同,完全平均分布有可能更加重负载重的节点的性能了。
即使内部调度也不会对该部分region完全打散,优先有读写的leader region迁移到别的节点了。

1 个赞

这个问题可以看看官方文档的 FAQ,TiDB 在这块有比较详细的说明。方便的话贴一下具体的报错日志,方便大家帮忙定位。

1 个赞

建表预分区后 Leader 分布不均,可调大 PD 领导者调度限制加速均衡,也能手动迁移 Leader,同时让 pre_split_regions 与 shard_row_id_bits 参数匹配。

1 个赞

PD有三种调度器分别处理不同场景。

pre_split_regions 仅预先切割出对应数量 Region 分片,不主动分配 Leader 节点,新建 Region 默认 Leader 会落在同一个 TiKV 节点。

PD有三种调度器分别处理不同场景。

执行后 PD 会立刻迁移该表所有 Region Peer 与 Leader,均衡分布到集群所有 TiKV 节点。

pre_split_regions 只能建表时候用吗,修改表可以吗?

感觉是跟当时的负载有关系

pre_split仅拆分Region不分配Leader,调大PD调度阈值或手动迁移可均衡Leader分布。

pre_split_regions 只在建表瞬间预切分 Region,初始 leader 分布由 PD 调度,短期内可能集中在少数节点,属正常现象。PD 的 balance-leader-scheduler 会随时间把 leader 打散。若长期不均,检查 leader-schedule-limit、各 store 的 leader-weight 是否一致,以及是否有 label 约束限制了调度。也可用 pd-ctl 手动触发 leader 均衡观察效果。

1 个赞