使用remote函数迁移外部ClickHouse数据至MRS集群
操作场景
remote函数迁移ClickHouse数据是一种高效、便捷的方法,该方法支持多种迁移场景,迁移速度极快(最快可达10亿条记录/小时,迁移速度受网络带宽的影响)。remote函数可以将不同来源的ClickHouse数据迁移到MRS ClickHouse中,包括自建开源ClickHouse、CDH平台ClickHouse和云数据库ClickHouse等。
使用remote函数支持以下数据迁移方式:
对系统影响
迁移过程中会增加源端服务负载,一定程度会影响源端集群正常业务。
约束与限制
- 迁移表引擎:MergeTree系列表直接迁移,Distributed分布式表只需迁移其元数据即可,它本身不存储数据,依赖对应的本地表。
- 迁移时间区间需要在源端ClickHouse集群业务低谷期进行迁移,以免影响源端客户侧正常业务。
- 对于大表remote迁移,需要进行分组迁移,以防OOM影响源端正常业务。
- 在迁移过程中,需要对remote速率进行限制,且客户端设限显示的迁移速率为数据未压缩前的速率。
- 迁移过程中,随时观察源端ClickHouse集群各项监控指标参数,例如:CPU、内存等。避免影响源端ClickHouse集群的正常业务。
前提条件
- 迁移前需保证源端集群和目标端集群之间的网络互通。
- 源端集群和目标端集群必须同为普通模式(未开启Kerberos认证)或者安全模式(开启Kerberos认证)。如果同为MRS安全模式集群则需要在两端集群配置互信,具体请参考配置MRS集群间互信。
- 需要将目标端MRS ClickHouse集群上的参数“CLICKHOUSE_OPENSOURCE_COMMUNITY”参数值修改为true,修改该参数之后需要重启ClickHouse服务,并重新下载ClickHouse客户端。
- 登录Manager页面,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索参数“CLICKHOUSE_OPENSOURCE_COMMUNITY”,修改参数值为true,保存配置并重启ClickHouse服务。
- 重新下载并安装目标端ClickHouse集群客户端,具体请参考安装MRS客户端。
- 对于开启了Kerberos认证的MRS集群,需提前在Manager中创建具有ClickHouse相关操作权限的用户,具体请参考创建具有ClickHouse权限的用户。
存量元数据迁移
- 安装源端集群的ClickHouse客户端,具体请参考安装MRS客户端。
- 通过ClickHouse客户端查看源端ClickHouse数据库列表。
clickhouse client --host 源端集群ClickHouse节点IP --port 源端集群ClickHouse端口 --user 源端集群ClickHouse登录用户 --password 源端集群ClickHouse登录用户密码 --query="show databases"
- 源端集群中的system、information_schema、INFORMATION_SCHEMA是系统数据库,无需迁移。
- 如果源端集群非MRS ClickHouse,客户端命令需根据实际环境变动。
- 执行以下命令查看源端ClickHouse某个数据库的table列表。
clickhouse client --host 源端集群ClickHouse节点IP --port 源端集群ClickHouse端口 --user 源端集群ClickHouse登录用户 --password 源端集群ClickHouse登录用户密码 --query="show tables from db_name"
- 执行以下命令,导出源端ClickHouse的数据库db_name的建表语句。
clickhouse client --host 源端集群ClickHouse节点IP --port 源端集群ClickHouse端口 --user 源端集群ClickHouse登录用户 --password 源端集群ClickHouse登录用户密码 --query="select create_table_query from system.tables where database='db_name' FORMAT TSVRaw" > db_table.sql
- 打开4的db_table.sql文件,在每个“CREATE TABLE”语句中的数据表表名后面加上“ON CLUSTER 目标集群的ClickHouse集群名”。
- 登录目标集群ClickHouse客户端节点。
使用集群客户端连接到ClickHouse服务端,具体请参考ClickHouse客户端使用实践。
- 使用源端建表DDL创建数据库和表。
clickhouse client --host 目标端集群ClickHouse节点IP --port 目标端集群ClickHouse端口 --multiquery --user 目标端集群ClickHouse登录用户 --password 目标端集群ClickHouse登录用户密码 < db_table.sql
全量数据迁移
- 查看源端集群的ClickHouse数据。
- 登录源端集群的客户端节点。
使用集群客户端连接到ClickHouse服务端,具体请参考ClickHouse客户端使用实践。
- 执行如下命令,查看源端集群库表及数据。
show databases;
使用查询的数据库,以bigdata_kp为例:
use bigdata_kp;
查询当前数据库中的表:
show tables;
查询表数据,以表user_behavior为例:select count() from bigdata_kp.user_behavior;
结果如下所示:
- 登录源端集群的客户端节点。
- 登录目标端集群客户端节点。
使用集群客户端连接到ClickHouse服务端,具体请参考ClickHouse客户端使用实践。
- 迁移前,执行如下命令查看目标端和源端表及数据。
SELECT 'target', count(1) FROM 目标端数据库名称.目标端表名称 UNION ALL SELECT 'source', count(1) FROM remote('源端ClickHouse节点IP', 源端数据库名称.源端表名称, '源端集群ClickHouse登录用户', '源端集群ClickHouse登录用户密码')
结果如下:
其中“target”为目标端表数据,“source”为源端表数据。
- 使用如下remote迁移SQL语法,进行数据迁移:
insert into db_name.table_name select * from remote('源集群ClickHouse节点IP:ClickHouse端口', db_name.table_name, '源集群ClickHouse用户', '源集群ClickHouse用户密码') SETTINGS max_network_bandwidth = '限制值';
表2 参数解释2 参数
说明
max_network_bandwidth
是一个用于限制数据传输网络带宽的参数,主要用于控制查询过程中通过网络传输数据的速率,避免因数据传输量过大导致网络拥塞或影响其他服务,单位为byte/s。
- 0:不限制,由系统自动调整。
- 大于0:指定具体带宽限制(例如 100 * 1024 * 1024 表示100 MB/s)。
- 迁移结束后,执行如下命令查看目标端和源端表及数据。
SELECT 'target', count(1) FROM 目标端数据库名称.目标端表名称 UNION ALL SELECT 'ource', count(1) FROM remote('源端ClickHouse节点IP, 源端数据库名称.源端表名称, '源端集群ClickHouse登录用户', '源端集群ClickHouse登录用户密码')
结果如下:
其中“target”为目标端表数据,“source”为源端表数据。
迁移常见问题
- 问题一:正在执行的查询数过多,报错如下:
Code: 202. DB::Exception: Too many simultaneous queries. Maximum: 100. (TOO_MANY_SIMULTANEOUS_QUERIES) (version 23.3.2.1). (TOO_MANY_SIMULTANEOUS_QUERIES)
正在执行的查询数过多,超过了数据库的最大限制。
查看目标端ClickHouse的配置文件config.xml,查看max_concurrent_queries的值。
处理方法:
- 确认当前实际正在运行的查询数:
select count(1) from system.processes;
- 查询当前对应查询的query_id:
select query_id from system.processes where xxx ... ;
- 终止对应的查询:
kill query where query_id = 'xxx';
- 确认当前实际正在运行的查询数:
- 问题二:同一批次写入分区的数据过多,报错如下:
Code: 252. DB::Exception: Too many partitions for single INSERT block (more than 100). The limit is controlled by 'max_partitions_per_insert_block' setting. (TOO_MANY_SIMULTANEOUS_QUERIES) (version 23.3.2.1). (TOO_MANY_SIMULTANEOUS_QUERIES)
处理方法:
调整该参数settings max_partitions_per_insert_block=1000,避免同一批次写入包含太多分区的数据。
针对于大数量表迁移,且迁移速度较慢,可考虑进行“profiles.default.background_pool_size”该参数调整。