
# 使用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集群间互信](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0354.html)。
- 需要将目标端MRS ClickHouse集群上的参数"CLICKHOUSE_OPENSOURCE_COMMUNITY"参数值修改为true，修改该参数之后需要重启ClickHouse服务，并重新下载ClickHouse客户端。
  1. [登录Manager页面](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2124.html)，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置"，搜索参数"CLICKHOUSE_OPENSOURCE_COMMUNITY"，修改参数值为true，保存配置并重启ClickHouse服务。
  
  2. 重新下载并安装目标端ClickHouse集群客户端，具体请参考[安装MRS客户端](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2127.html)。
   
- 对于开启了Kerberos认证的MRS集群，需提前在Manager中创建具有ClickHouse相关操作权限的用户，具体请参考[创建具有ClickHouse权限的用户](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24057.html)。
 
 #### 存量元数据迁移
1. 安装源端集群的ClickHouse客户端，具体请参考[安装MRS客户端](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2127.html)。
2. 通过ClickHouse客户端查看源端ClickHouse数据库列表。 
   ```
   clickhouse client --host 源端集群ClickHouse节点IP --port 源端集群ClickHouse端口 --user 源端集群ClickHouse登录用户 --password 源端集群ClickHouse登录用户密码 --query="show databases"
   ```
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 源端集群中的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客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2345.html)。
   
   
7. 使用源端建表DDL创建数据库和表。 
   ```
   clickhouse client --host 目标端集群ClickHouse节点IP --port 目标端集群ClickHouse端口 --multiquery --user 目标端集群ClickHouse登录用户 --password 目标端集群ClickHouse登录用户密码 < db_table.sql
   ```
   
   
 
 #### 全量数据迁移
1. 查看源端集群的ClickHouse数据。 
   1. 登录源端集群的客户端节点。 使用集群客户端连接到ClickHouse服务端，具体请参考[ClickHouse客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2345.html)。
      
   
   2. 执行如下命令，查看源端集群库表及数据。 查询所有数据库：
      ```
      show databases;
      ```
      使用查询的数据库，以bigdata_kp为例：
      ```
      use bigdata_kp;
      ```
      查询当前数据库中的表：
      ```
      show tables;
      ```
      查询表数据，以表user_behavior为例：
      ```
      select count() from bigdata_kp.user_behavior;
      ```
      结果如下所示：
      ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002305948438.png "点击放大")
      
   
   
   
   
2. 登录目标端集群客户端节点。 
   使用集群客户端连接到ClickHouse服务端，具体请参考[ClickHouse客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2345.html)。
   
   
3. 迁移前，执行如下命令查看目标端和源端表及数据。 
   ```
   SELECT 
       'target', 
       count(1) 
   FROM 目标端数据库名称.目标端表名称
   UNION ALL
   SELECT 
       'source', 
       count(1) 
   FROM remote('源端ClickHouse节点IP', 源端数据库名称.源端表名称, '源端集群ClickHouse登录用户', '源端集群ClickHouse登录用户密码')
   ```
   结果如下：
   其中"target"为目标端表数据，"source"为源端表数据。
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002333878961.png "点击放大")
   
   
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 
       'source', 
       count(1) 
   FROM remote('源端ClickHouse节点IP, 源端数据库名称.源端表名称, '源端集群ClickHouse登录用户', '源端集群ClickHouse登录用户密码')
   ```
   结果如下：
   其中"target"为目标端表数据，"source"为源端表数据。
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002338136621.png "点击放大")
   
   
 
#### 迁移常见问题
- **问题一：正在执行的查询数过多，报错如下：**
  ```
  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"该参数调整。
  
 
