文档首页/ MapReduce服务 MRS/ 组件操作指南(LTS版)/ 使用ClickHouse/ ClickHouse数据迁移同步/ 使用remote函数迁移外部ClickHouse数据至MRS集群
更新时间:2025-08-01 GMT+08:00

使用remote函数迁移外部ClickHouse数据至MRS集群

操作场景

remote函数迁移ClickHouse数据是一种高效、便捷的方法,该方法支持多种迁移场景,迁移速度极快(最快可达10亿条记录/小时,迁移速度受网络带宽的影响)。remote函数可以将不同来源的ClickHouse数据迁移到MRS ClickHouse中,包括自建开源ClickHouse、CDH平台ClickHouse和云数据库ClickHouse等。

使用remote函数支持以下数据迁移方式:

数据迁移

迁移过程

适用场景

存量元数据迁移

在源端集群将元数据全量导出,然后对导出的元数据进行批量调整,最后在目标端批量创建表结构。

适用于初次迁移或大规模元数据变更场景。

全量数据迁移

在目标集群客户端使用remote函数远程查询源端数据,然后将查询结果写入目标端。

适用于大规模数据迁移,迁移速度快,操作简单。

对系统影响

迁移过程中会增加源端服务负载,一定程度会影响源端集群正常业务。

约束与限制

  • 迁移表引擎:MergeTree系列表直接迁移,Distributed分布式表只需迁移其元数据即可,它本身不存储数据,依赖对应的本地表。
  • 迁移时间区间需要在源端ClickHouse集群业务低谷期进行迁移,以免影响源端客户侧正常业务。
  • 对于大表remote迁移,需要进行分组迁移,以防OOM影响源端正常业务。
  • 在迁移过程中,需要对remote速率进行限制,且客户端设限显示的迁移速率为数据未压缩前的速率。
  • 迁移过程中,随时观察源端ClickHouse集群各项监控指标参数,例如:CPU、内存等。避免影响源端ClickHouse集群的正常业务。

前提条件

  • 迁移前需保证源端集群和目标端集群之间的网络互通。
  • 源端集群和目标端集群必须同为普通模式(未开启Kerberos认证)或者安全模式(开启Kerberos认证)。如果同为MRS安全模式集群则需要在两端集群配置互信,具体请参考配置MRS集群间互信
  • 需要将目标端MRS ClickHouse集群上的参数“CLICKHOUSE_OPENSOURCE_COMMUNITY”参数值修改为true,修改该参数之后需要重启ClickHouse服务,并重新下载ClickHouse客户端。
    1. 登录Manager页面,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索参数“CLICKHOUSE_OPENSOURCE_COMMUNITY”,修改参数值为true,保存配置并重启ClickHouse服务。
    2. 重新下载并安装目标端ClickHouse集群客户端,具体请参考安装MRS客户端
  • 对于开启了Kerberos认证的MRS集群,需提前在Manager中创建具有ClickHouse相关操作权限的用户,具体请参考创建具有ClickHouse权限的用户

存量元数据迁移

  1. 安装源端集群的ClickHouse客户端,具体请参考安装MRS客户端
  2. 通过ClickHouse客户端查看源端ClickHouse数据库列表。

    clickhouse client --host 源端集群ClickHouse节点IP --port 源端集群ClickHouse端口 --user 源端集群ClickHouse登录用户 --password 源端集群ClickHouse登录用户密码 --query="show databases"
    • 源端集群中的system、information_schema、INFORMATION_SCHEMA是系统数据库,无需迁移。
    • 如果源端集群非MRS ClickHouse,客户端命令需根据实际环境变动。
    表1 参数解释

    参数

    说明

    ClickHouse节点IP

    ClickHouseServer实例对应的IP地址。

    登录集群FusionInsight Manager界面,然后单击“集群 > 服务 > ClickHouse > 实例”,获取ClickHouseServer实例对应的IP地址。

    ClickHouse端口

    连接的端口。

    • 开启Kerberos认证的集群默认使用SSL安全连接,默认端口为9440。

      具体的端口值也可通过查询ClickHouseServer实例配置参数“tcp_port_secure”获取。

      如果该场景下需要使用非SSL安全连接,则可登录集群FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置”,搜索“SSL_NONESSL_BOTH_ENABLE”配置,将该配置修改为“true”并重启所有ClickHouse服务实例。

    • 未开启Kerberos认证的集群默认使用非SSL安全连接,默认端口为9000。

      具体的端口值也可通过查询ClickHouseServer实例配置参数“tcp_port”参数获取。

      如果该场景下需要使用SSL安全连接,则可登录集群FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置”,搜索“SSL_NONESSL_BOTH_ENABLE”配置,将该配置修改为“true”并重启所有ClickHouse服务实例即可。

    ClickHouse登录用户

    • 如果当前集群已启用Kerberos认证(集群为安全模式),必须在Manager上创建该用户名。
    • 如果当前集群未启用Kerberos认证(集群为普通模式),可以使用默认的default用户登录(default默认密码为空),也可以使用创建的具有ClickHouse相关权限的用户登录。

    ClickHouse登录用户密码

    ClickHouse登录用户的密码。

  3. 执行以下命令查看源端ClickHouse某个数据库的table列表。

    clickhouse client --host 源端集群ClickHouse节点IP --port 源端集群ClickHouse端口 --user 源端集群ClickHouse登录用户 --password 源端集群ClickHouse登录用户密码 --query="show tables from db_name"

  4. 执行以下命令,导出源端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

  5. 打开4的db_table.sql文件,在每个“CREATE TABLE”语句中的数据表表名后面加上“ON CLUSTER 目标集群的ClickHouse集群名”。
  6. 登录目标集群ClickHouse客户端节点。

    使用集群客户端连接到ClickHouse服务端,具体请参考ClickHouse客户端使用实践

  7. 使用源端建表DDL创建数据库和表。

    clickhouse client --host 目标端集群ClickHouse节点IP --port 目标端集群ClickHouse端口 --multiquery --user 目标端集群ClickHouse登录用户 --password 目标端集群ClickHouse登录用户密码 < db_table.sql

全量数据迁移

  1. 查看源端集群的ClickHouse数据。

    1. 登录源端集群的客户端节点。

      使用集群客户端连接到ClickHouse服务端,具体请参考ClickHouse客户端使用实践

    2. 执行如下命令,查看源端集群库表及数据。

      查询所有数据库:

      show databases;

      使用查询的数据库,以bigdata_kp为例:

      use bigdata_kp;

      查询当前数据库中的表:

      show tables;
      查询表数据,以表user_behavior为例:
      select count() from bigdata_kp.user_behavior;

      结果如下所示:

  2. 登录目标端集群客户端节点。

    使用集群客户端连接到ClickHouse服务端,具体请参考ClickHouse客户端使用实践

  3. 迁移前,执行如下命令查看目标端和源端表及数据。

    SELECT 
        'target', 
        count(1) 
    FROM 目标端数据库名称.目标端表名称
    UNION ALL
    SELECT 
        'source', 
        count(1) 
    FROM remote('源端ClickHouse节点IP', 源端数据库名称.源端表名称, '源端集群ClickHouse登录用户', '源端集群ClickHouse登录用户密码')

    结果如下:

    其中“target”为目标端表数据,“source”为源端表数据。

  4. 使用如下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)。

  5. 迁移结束后,执行如下命令查看目标端和源端表及数据。

    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的值。

    处理方法:

    1. 确认当前实际正在运行的查询数:
      select count(1) from system.processes;
    2. 查询当前对应查询的query_id:
      select query_id from system.processes where xxx ... ;
    3. 终止对应的查询:
      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”该参数调整。