ClickHouse-Copier实战:从零开始的数据迁移与集群扩缩容

张开发
2026/4/17 3:07:26 15 分钟阅读

分享文章

ClickHouse-Copier实战:从零开始的数据迁移与集群扩缩容
1. ClickHouse-Copier数据迁移与集群管理的瑞士军刀第一次接触ClickHouse集群扩容需求时我被数据迁移问题卡了整整两天。当时源集群有6个分片需要扩展到12个分片手动操作不仅容易出错还会导致服务长时间不可用。直到发现了ClickHouse-Copier这个神器才明白官方早就为我们准备好了解决方案。ClickHouse-Copier是ClickHouse官方工具包中的分布式数据迁移工具它通过ZooKeeper协调多个工作节点实现跨集群、跨分片的数据迁移。与简单的INSERT INTO...SELECT语句不同它能自动处理分片逻辑、保证数据一致性还能在迁移过程中灵活控制数据分布。我在电商大促前扩容集群时用它在3小时内完成了20TB订单数据的迁移期间查询服务完全不受影响。这个工具特别适合三类场景集群扩容/缩容增加或减少分片数量时重新分布数据集群迁移将数据从旧集群迁移到新硬件集群数据重组按新的分片规则重新组织数据分布2. 环境准备与工具配置2.1 基础环境检查在开始迁移前需要确保以下组件就绪ZooKeeper集群建议3节点以上这是Copier的协调中枢。我遇到过因为ZK性能不足导致迁移卡顿的情况所以务必检查/etc/zookeeper/conf/zoo.cfg中的maxClientCnxns参数建议≥500网络互通所有ClickHouse节点需要双向互通特别是要检查防火墙规则。曾经有个坑是忘了开9000端口导致迁移一直超时磁盘空间目标集群需要有1.2倍于源数据的空间。有次迁移800GB数据目标盘只剩900GB空间结果迁移到90%时因临时文件爆盘失败2.2 ClickHouse-Copier安装Copier通常随ClickHouse-server包安装位于/usr/bin/clickhouse-copier。如果找不到可以用以下命令单独安装sudo apt-get install clickhouse-copier # Ubuntu/Debian sudo yum install clickhouse-copier # CentOS/RHEL验证安装是否成功clickhouse-copier --help | grep daemon应该能看到--daemon参数说明。我推荐使用v21.8以上版本早期版本有些分片bug已修复。3. 迁移实战从单集群到多集群3.1 配置文件详解核心配置文件schema.xml包含三大模块下面是我优化过的模板yandex !-- 集群定义 -- remote_servers source_cluster shard replicahostsrc1/hostport9000/port/replica /shard !-- 更多分片... -- /source_cluster destination_cluster shard replicahostdst1/hostport9000/port/replica /shard !-- 更多分片... -- /destination_cluster /remote_servers !-- 并发控制 -- max_workers8/max_workers settings_pullreadonly1/readonly/settings_pull settings_pushreadonly0/readonly/settings_push !-- 表级配置 -- tables user_events !-- 任务ID可自定义 -- cluster_pullsource_cluster/cluster_pull table_pullevents_local/table_pull cluster_pushdestination_cluster/cluster_push table_pushevents_new_local/table_push engine ENGINE ReplicatedMergeTree(/tables/{shard}/events_new_local, {replica}) ORDER BY (user_id, event_time) PARTITION BY toYYYYMM(event_time) /engine sharding_keycityHash64(user_id)/sharding_key where_conditionevent_time 2023-01-01/where_condition /user_events /tables /yandex关键参数经验max_workers建议设为源集群分片数的1-2倍sharding_key用cityHash64比rand()更均匀生产环境一定要加where_condition分批迁移3.2 ZooKeeper任务配置将配置上传到ZK的推荐方式# 创建任务路径 ./zkCli.sh create /clickhouse/copytasks ./zkCli.sh create /clickhouse/copytasks/order_migration # 上传配置注意反引号 ./zkCli.sh set /clickhouse/copytasks/order_migration/description cat schema.xml如果遇到Node already exists错误可以加-r参数强制覆盖。我习惯在ZK上保留历史版本方便回滚./zkCli.sh create /clickhouse/copytasks/order_migration_v2 4. 高级技巧与避坑指南4.1 大规模迁移优化当迁移TB级数据时需要特别注意网络带宽控制在schema.xml中添加settings_pull max_execution_time3600/max_execution_time max_network_bandwidth50000000/max_network_bandwidth !-- 50MB/s -- /settings_pull分批迁移策略按时间范围分批执行例如enabled_partitions partition202301/partition partition202302/partition /enabled_partitions断点续传Copier本身支持断点续传但需要保证ZK任务路径不变。遇到中断时只需重新执行原命令4.2 常见问题排查卡在Waiting for workers检查ZK连接和max_workers设置数据倾斜优化sharding_key改用业务主键哈希版本兼容问题确保源和目标集群的ClickHouse大版本一致监控迁移进度的小技巧# 查看ZK上的状态节点 watch -n 5 ./zkCli.sh get /clickhouse/copytasks/task1/status5. 真实案例电商订单表扩容去年双十一前我们需要将订单集群从16分片扩展到32分片。具体操作准备新集群部署32分片的ClickHouse配置自动同步的分布式表编写迁移配置关键点是按用户ID哈希分片保证同一用户的订单在同一个分片sharding_keycityHash64(user_id) % 32/sharding_key分批次迁移按订单日期分批先迁移3个月前的历史数据流量切换凌晨将查询流量切换到新集群再迁移近期数据最终用时6小时完成80TB数据迁移期间P99查询延迟仅增加15ms。这个案例让我深刻体会到好的工具配合合理的策略能让复杂的数据迁移变得优雅高效。

更多文章