集群数据迁移(迁移工具方案)
本方案是「ClickHouse 集群数据迁移」系列方案之一,通过 BMR 提供的专用迁移工具 ck_migrator.py 完成源集群与目标集群之间的数据迁移。工具以点对点方式迁移,支持高并行与断点续传,适用于数据量较大、数据表较多,且只需保证源和目标集群间数据最终一致的场景。
使用本方案需要在集群节点上部署迁移工具、MySQL 元数据库及 Python 运行环境(相关安装包见文末附录)。如果迁移仅涉及少量数据表、属于临时或一次性操作,且不希望部署额外工具,可参考仅用 SQL 即可完成的集群数据迁移(原生 SQL 方案)。
环境准备
- 本工具使用 python3 开发,因此执行节点上需要部署 python3 环境,版本最低要求为 3.6,推荐 3.7(附件有 python 安装包以及已经集成好的 python 环境)。
- 迁移过程需要保存迁移元数据信息,元数据库选择的是 mysql(每个 BMR 集群会自带一个 mysql 实例,无需另外搭建),因此需要安装 python 的 mysql connector 依赖,附件的 python_venv 中已经集成。
- 迁移需要连接源集群实例和目标集群实例,因此需要安装 clickhouse-client 依赖,附件的 python_venv 中已经集成。
- (可选)为了不影响原来的 python 环境,推荐使用附件中的 python_venv 集成环境来执行迁移。
- 启动虚拟环境后再启动迁移工具。

启动方式
启动之前需要将迁移任务录入元数据库,此信息对应的 mysql 数据表为 migrator.jobs,如下所示:

表一 字段说明
| 字段 | 字段说明 |
|---|---|
| job_id | job 的标识 |
| src_host | 源集群实例主机名或 ip |
| src_port | 源集群实例端口 |
| src_user | 源集群实例用户名 |
| src_password | 源集群实例密码 |
| dst_host | 目标集群实例主机名 |
| dst_port | 目标集群实例端口 |
| dst_user | 目标集群用户名 |
| dst_password | 目标集群密码 |
说明:job_id 是迁移任务的唯一标识,一般对应一对源和目标实例之间的迁移链路(此链路上可以开启多个 task,即多个迁移进程,以提供并行度)。因此在源和目标集群拓扑同构的情况下,有多少个实例就需要录入多少个 job,例如有 10 个分片、20 个节点就需要录入 20 个 job,一般奇数 id 的 job 负责迁移数据,偶数 id 的 job 负责校验数据。 在集群的每个 core 实例上执行迁移工具的命令格式如下:
1python ck_migrator.py hostname taskID taskSize runType
表二 参数说明
| 参数名称 | 参数说明 |
|---|---|
| hostname | 直接使用 bmr 提供的 hostname,例如:core-0cb9d33-01,切记不要使用 ip 或者 alias 后的 hostname。 |
| taskID | 当前 job 的 task 的标识,是为了提高并行度,和 taskSize 配合使用可以在一个 job 上执行更高并行度的迁移,加快迁移速度。 |
| taskSize | 当前 job 总共的 task 数,一般和 taskID 配合使用。 |
| runType | 当前迁移任务的类型,目前支持的类型有如下几种: |
使用实例
- 执行命令:
1python ck_migrator.py core-0cb9d33-01 0 5 migration_schema
上述命令参数意义为:在 core-0cb9d33-01 这个节点上执行 job,task 并行度为 5(taskID 为 0、1、2、3、4),当前 task id 为 0,任务类型为迁移库表结构(migration_schema)。
- 上述命令执行后会显示:Will migrator all schemas!,执行完成后会显示以下信息:Migrator all shcema done!。如果中间失败了可以重新拉起 task 进程,参数不变,不用担心数据或表会重复。
注意事项
- 在迁移过程中不要对源集群的库表执行 ddl 操作,例如增删表字段等。
- 如果有物化视图需要单独迁移。
- mysql 元数据库访问的用户名和密码指定在工具代码内的如图位置,可以依据实际情况进行修改,若不清楚当前集群 mysql 的访问密码可以咨询 bmr 值班同学。

- 如果想过滤自定义的表或者库,可以在工具内的如下位置进行修改:
在 filter 里面加上不想迁移的表名即可(直接修改代码),如下图。修改后迁移工具将不会迁移表 'za_search_info' 和表 'deeptrace_info'。

附录一:工具与依赖下载
迁移工具:
ck_migrator.py
bos 链接:https://bmr-clickhouse-package.bj.bcebos.com/tools/migration/ck_migrator.py
clickhouse python 依赖库:
clickhouse_driver-0.2.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
python3 安装包(带虚拟环境):
python3.6-gcc485-bmr.tar.gz
bos 链接:https://bmr-clickhouse-package.bj.bcebos.com/tools/migration/python3.6-gcc485-bmr.tar.gz
python3_venv.tar.gz
bos 链接:https://bmr-clickhouse-package.bj.bcebos.com/tools/migration/python3_venv.tar.gz
说明:上面附件的虚拟环境中已经集成了 mysql-connector,因此可以直接使用。部署方式为:将 python3.6-gcc485-bmr.tar.gz 放到 core 节点的 /opt/bmr/airflow/ 路径下解压;将 python3_venv.tar.gz 放到要执行迁移进程的路径下解压(例如 /root/ 下);然后执行
source ./python3_venv/bin/activate即可切换到 python3 的集成环境,然后安装 clickhouse-client:pip install clickhouse_driver-0.2.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl,安装完成后在此环境下启动 ck_migrator.py 进程即可。
附录二:mysql 建表语句参考
1CREATE DATABASE IF NOT EXISTS `migrator`;
2
3CREATE TABLE IF NOT EXISTS `migrator`.`jobs` (
4 `job_id` int(4) NOT NULL,
5 `src_host` varchar(32) NOT NULL,
6 `src_port` int(4) NOT NULL,
7 `src_user` varchar(32) NOT NULL,
8 `src_password` varchar(32) DEFAULT NULL,
9 `dst_host` varchar(32) NOT NULL,
10 `dst_port` int(4) NOT NULL,
11 `dst_user` varchar(32) NOT NULL,
12 `dst_password` varchar(32) DEFAULT NULL,
13 PRIMARY KEY (`job_id`),
14 UNIQUE KEY `instance_link` (`src_host`,`src_port`,`dst_host`,`dst_port`)
15) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
16
17CREATE TABLE IF NOT EXISTS `migrator`.`partitions` (
18 `id` bigint(20) NOT NULL AUTO_INCREMENT,
19 `job_id` int(4) NOT NULL,
20 `src_db` varchar(128) NOT NULL,
21 `src_table` varchar(128) NOT NULL,
22 `dst_db` varchar(128) NOT NULL,
23 `dst_table` varchar(128) NOT NULL,
24 `partition_keys` varchar(128) DEFAULT NULL,
25 `partition_id` varchar(128) NOT NULL,
26 `rows` bigint(20) DEFAULT NULL,
27 `bytes` bigint(20) DEFAULT NULL,
28 `status` varchar(16) NOT NULL,
29 `create_time` datetime DEFAULT NULL,
30 `update_time` datetime DEFAULT NULL,
31 `check_time` datetime DEFAULT NULL,
32 PRIMARY KEY (`id`),
33 UNIQUE KEY `unique_partition` (`src_db`,`src_table`,`dst_db`,`dst_table`,`job_id`,`partition_id`)
34) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
评价此篇文章
