数据重分布(Resharding)是指将每张 MergeTree 家族表根据分片键(Sharding Key)拆分到每个分片,使得集群每个节点数据更均衡,为查询提供的性能也更均衡。
适用场景
- 刚刚进行过水平扩容,但数据未重分布,或部分表重分布失败的场景;
- 因为直接插入本地表,或因为 Kafka 导入时上游 Partition 数量未按最佳实践配置,导致的数据不均匀的场景(不适用于 Sharding Key 设错,导致数据不均衡的场景);
不适用场景
- 表不完整的场景:如果用户没有按照最佳实践建表(如部分表只在部分节点存在),则不会重分布这些数据;
- 特殊的数据类型:含 Bitmap64 类型的表,无法执行重分布;
- 特殊表引擎:MySQL,S3 等外表引擎,View,Merge,Join 等无数据存储的表引擎不支持重分布;
- 物化库表引擎:MaterializedView,MaterializeMySQL 暂时不支持数据重分布,但您可以在扩容后通过重建库/表,重新同步数据。
注意事项
- 每个旧节点需要预留存储的容量为最大的一张表的容量,例如,表的总大小为 100GB,当前10个节点,缩容为5个节点,则需要在每个旧节点预留 100GB/5 = 20GB 以上的存储;
- 数据重分布期间,表会逐一进入只读状态,同时集群的计算和 IO 负载会较高,预估读性能会下降且不稳定;
- 特殊情况:HaUniqueMergeTree 表引擎只能在单一分片内实现去重,因此若采用 Kafka 导入,Kafka Partition -> ByteHouse Shard 的映射关系需要保持不变。例如:
- 扩容后:unique_key = 1 -> 原 Kafka partition 1 -> 原 ByteHouse shard 1
- 扩容后:unique_key = 1 -> ByteHouse shard 3,那需要调整 unique_key = 1 -> 新的 Partition,使其能稳定写入 ByteHouse shard 3;
- 若您有相关疑问,请提交工单。
操作步骤
您可以参考下面步骤完成重分布操作,操作过程中需要集群管理员或系统管理员权限。
- 运维与权限管理 > 集群管理 > 集群列表 > 重分布;
- 选择重分布的表;
- 开始重分布。系统会依据 Sharding_key 将数据重新拆分到所有节点;表会逐一进入只读状态,同时集群的计算和 IO 负载会较高,预估读性能会下降且不稳定;