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