searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

自建集群如何通过zookeeper做副本数据迁移

2024-11-29 09:11:18
4
0

背景: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、创建完临时副本表之后,集群会自动通过源zkpart同步到目标集群的副本。期间不用做任何处理,可以准备下一

步骤工作呢 —— 这个过程不要对临时表做任何数据分区操作,因为操作临时表分区就等于操作源集群对应正式表

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 命令,把目标表下detachedpart加载到表内 —— 如果分区多,可用脚本完成,有现成脚本(可找作者提供)

例如:default lineorder表,可以执行 alter table default.lineorder attach partition 'partition_name'; 依次把所有的partition 加载到正式表

9、所有的表迁移完成之后,删除临时表,再删除config.xml文件中的 auxiliary_zookeepers配置;

说明

数据副本同步过程因为某种原因导致副本服务中断(可能是网络、bug、人为手工停止),再次重启后支持断

点续传,不会影响源数据同步传输。

操作过程会涉及到多个partitionDETACH和 attach命令,同时还需要登入到目标节点执行mv 操作,为了简化工

作提高效率,减少过多人为操作而导致的失误,建议 通过批量工具(天翼云ClickHouse提供) + 脚本方式执行(找作者提供)

批量工具:批量分发文件到目标集群各个节点,批量在目标集群各个节点执行命令脚本等

参考脚本:查询一个表下的所有partition 列表,然后执行 DETACH命令, mv 命令 和最后的 attach命令

 

警告

在添加临时表之后,源集群表的part就会自动通过zkpart复制,因为数据量很大,建议分批创建临时副

本表,以免对源zk造成负载过高,从而影响业务

在临时表数据同步的过程中,一定一定一定不要对临时表做任何数据或是分区操作,操作临时表就等于操

作源集群对应的正式表

在临时表数据同步过程,不能有ddl变化

 

方案优点:可支持对巨量副本表(几百个以上)的数据迁移,数据同步过程通过zk 做到后台自动同步,无需干预;同时支持对cos 数据的迁移;

不足:只能迁移ReplicatedMergeTree 引擎表,其它表不支持这种方案。

 

 

0条评论
0 / 1000
杨****涛
2文章数
0粉丝数
杨****涛
2 文章 | 0 粉丝
杨****涛
2文章数
0粉丝数
杨****涛
2 文章 | 0 粉丝
原创

自建集群如何通过zookeeper做副本数据迁移

2024-11-29 09:11:18
4
0

背景: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、创建完临时副本表之后,集群会自动通过源zkpart同步到目标集群的副本。期间不用做任何处理,可以准备下一

步骤工作呢 —— 这个过程不要对临时表做任何数据分区操作,因为操作临时表分区就等于操作源集群对应正式表

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 命令,把目标表下detachedpart加载到表内 —— 如果分区多,可用脚本完成,有现成脚本(可找作者提供)

例如:default lineorder表,可以执行 alter table default.lineorder attach partition 'partition_name'; 依次把所有的partition 加载到正式表

9、所有的表迁移完成之后,删除临时表,再删除config.xml文件中的 auxiliary_zookeepers配置;

说明

数据副本同步过程因为某种原因导致副本服务中断(可能是网络、bug、人为手工停止),再次重启后支持断

点续传,不会影响源数据同步传输。

操作过程会涉及到多个partitionDETACH和 attach命令,同时还需要登入到目标节点执行mv 操作,为了简化工

作提高效率,减少过多人为操作而导致的失误,建议 通过批量工具(天翼云ClickHouse提供) + 脚本方式执行(找作者提供)

批量工具:批量分发文件到目标集群各个节点,批量在目标集群各个节点执行命令脚本等

参考脚本:查询一个表下的所有partition 列表,然后执行 DETACH命令, mv 命令 和最后的 attach命令

 

警告

在添加临时表之后,源集群表的part就会自动通过zkpart复制,因为数据量很大,建议分批创建临时副

本表,以免对源zk造成负载过高,从而影响业务

在临时表数据同步的过程中,一定一定一定不要对临时表做任何数据或是分区操作,操作临时表就等于操

作源集群对应的正式表

在临时表数据同步过程,不能有ddl变化

 

方案优点:可支持对巨量副本表(几百个以上)的数据迁移,数据同步过程通过zk 做到后台自动同步,无需干预;同时支持对cos 数据的迁移;

不足:只能迁移ReplicatedMergeTree 引擎表,其它表不支持这种方案。

 

 

文章来自个人专栏
天翼云ClickHouse
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0