背景:ClickHouse介绍了用ClickHouse-Copier 做数据迁移的方法,但是针对表量多的情况下,操作繁琐,本文推荐一种针对库表数据量非常多的情况下使用Zookeeper做副本数据迁移的方法。
1、迁移方案
迁移方案是通过源集群的zookeeper 做副本数据同步,方案如下:
要求源、目标集群在同一个网络,源、目标集群的分片数是相同的,另外建议源、目标集群的ck内核版本也一致,避
免不同版本使用到的zstd 版本不一致导致merge出错
迁移条件 & 情况:
- 目标集群必须跟源集群具备相同的分片数,目标集群跟源集群网络相通;
- 只支持依赖zk的副本表;
- partitiong同步过程,源集群可正常读写,迁移过程源集群能正常读,但是不能写;
- 数据同步和迁移过程,不会删除源集群的数据;
- 数据同步过程源集群下的数据(本地数据 + cos数据)都会同步到目标集群下,因此目标集群下的容量要足够。
2、迁移步骤:
整体的迁移环节可概括为:创建临时表(开始同步数据)和正式表 - 》 修改临时表引擎为 MergeTree — 》从临时表
把数据转移到正式表 - 》删除临时表
具体步骤如下:
1、在目标集群的各个分片选择一个节点,加入到tmp_cluster里头去(metrika.xml文件中新增tmp_cluster),修改目
标集群的config.xml文件,把源集群的zk信息配置进来,如果有多个,那分别加入
<auxiliary_zookeepers> <zookeeper2> <node> <host>ip1</host> <port>2181</port> </node> <node> <host>ip2</host> <port>2181</port> </node> <node> <host>ip3</host> <port>2181</port> </node> </zookeeper2> <session_timeout_ms>60000</session_timeout_ms> <operation_timeout_ms>30000</operation_timeout_ms> </auxiliary_zookeepers> |
2、在目标集群上创建临时的副本表,绑定源集群的zk,以ReplicatedMergeTree为例子:
CREATE TABLE table_name_tmp on cluster tmp_cluster ( ... ) ENGINE = ReplicatedMergeTree('zookeeper2:path', '{replica}') ... |
备注说明:
- 创建的临时副本表使用临时表名,在正式表后面加_tmp。
- 创建的临时副本表使用的ZooKeeper路径和源端搬迁表的ZooKeeper路径需保持一致。
- 创建的临时副本表的表结构需和源端搬迁表保持一致。
3、创建完临时副本表之后,集群会自动通过源zk做part同步到目标集群的副本。期间不用做任何处理,可以准备下一
步骤工作呢 —— 这个过程不要对临时表做任何数据分区操作,因为操作临时表分区就等于操作源集群对应正式表
4、在目标集群创建正式名字的 副本表,采用默认zookeeper(可直接通过on cluster default_cluster去创建)
5、同步完成之后,检查源集群和目标集群,各个表数据分布情况,数据准确性校验(查询part数,以及count总数是
否匹配,校验数据准确性时最好做到源集群停写)
6、检查无误之后,在目标集群metadata 目录下,修改所有临时表的sql,把Engine均改成MergeTree (这步是为了
迁移过程影响到源集群,保证源集群的数据可读),修改完后重启集群 —— 有现成脚本
7、执行DETACH 命令对临时表中的每个partition DETACH,然后登入目标集群,把临时表下detached目
录的所有part mv 到对应的目标表的detached 目录下 —— 如果分区多,可用脚本完成,有现成脚本
例如:default 下lineorder表,可以执行 mv /data/clickhouse/clickhouse-
server/data/default/lineorder_tmp/ detached/* /data/clickhouse/clickhouse-server/data/default/lineorder/detached/
例如:default 下lineorder_tmp临时表,分区有'1992','1993','1994','1995','1996' 第一步:在studio上执行(也可以通过脚本去完成): ALTER TABLE default.lineorder_tmp on cluster tmp_cluster DETACH PARTITION '1992'; ALTER TABLE default.lineorder_tmp on cluster tmp_cluster DETACH PARTITION '1993'; ALTER TABLE default.lineorder_tmp on cluster tmp_cluster DETACH PARTITION '1994'; ALTER TABLE default.lineorder_tmp on cluster tmp_cluster DETACH PARTITION '1995'; ALTER TABLE default.lineorder_tmp on cluster tmp_cluster DETACH PARTITION '1996'; 第二步:登入到目标集群在各个节点上,执行: mv /data/clickhouse/clickhouse-server/data/default/lineorder_tmp/detached/* /data/clickhouse/clickhouse-server/data/default/lineorder/detached/ |
8、执行attach 命令,把目标表下detached的part加载到表内 —— 如果分区多,可用脚本完成,有现成脚本(可找作者提供)
例如:default 下lineorder表,可以执行 alter table default.lineorder attach partition 'partition_name'; 依次把所有的partition 加载到正式表
9、所有的表迁移完成之后,删除临时表,再删除config.xml文件中的 auxiliary_zookeepers配置;
说明
数据副本同步过程因为某种原因导致副本服务中断(可能是网络、bug、人为手工停止),再次重启后支持断 点续传,不会影响源数据同步传输。 操作过程会涉及到多个partition的 DETACH和 attach命令,同时还需要登入到目标节点执行mv 操作,为了简化工 作提高效率,减少过多人为操作而导致的失误,建议 通过批量工具(天翼云ClickHouse提供) + 脚本方式执行(找作者提供) 批量工具:批量分发文件到目标集群各个节点,批量在目标集群各个节点执行命令脚本等 参考脚本:查询一个表下的所有partition 列表,然后执行 DETACH命令, mv 命令 和最后的 attach命令 |
警告
在添加临时表之后,源集群表的part就会自动通过zk做part复制,因为数据量很大,建议分批创建临时副 本表,以免对源zk造成负载过高,从而影响业务 在临时表数据同步的过程中,一定一定一定不要对临时表做任何数据或是分区操作,操作临时表就等于操 作源集群对应的正式表 在临时表数据同步过程,不能有ddl变化 |
方案优点:可支持对巨量副本表(几百个以上)的数据迁移,数据同步过程通过zk 做到后台自动同步,无需干预;同时支持对cos 数据的迁移;
不足:只能迁移ReplicatedMergeTree 引擎表,其它表不支持这种方案。