更新时间:2024-08-01 GMT+08:00
分享

迁移MRS集群内ClickHouse数据至其他MRS集群

本章节仅适用于MRS 3.2.0及之后版本。

操作场景

场景一:随着MRS ClickHouse业务数量的增长,原有集群的存储和计算资源已不满足业务需求,需要对集群进行拆分,将部分用户业务及数据库数据迁移到新建集群中。

场景二:MRS ClickHouse集群后端主机所在机房需要搬迁,需要将ClickHouse集群整体迁移到另外一个机房的新集群当中。

为了解决上述场景下对搬迁能力的要求,MRS提供了ClickHouse集群数据一键式工具搬迁能力,将源集群中的ClickHouse数据库、表对象DDL、业务数据迁移到新建集群中。

迁移方案原理介绍

  • Replicated*MergeTree引擎的复制表迁移:

    ClickHouse利用ZooKeeper将同一分片下不同副本的Replicated*MergeTree引擎表数据自动进行同步,本迁移方案利用该特性进行数据迁移。大致逻辑步骤如下:

    首先,在目标集群的配置文件中添加源集群的ZooKeeper信息作为辅助ZooKeeper。其次,再在目标集群中创建和源集群相同ZooKeeper路径不同副本并且表结构和源集群一致的临时表。临时表创建完成源集群中的数据将会自动同步到临时表。最后,等待源集群数据同步到目标集群的临时表完成后,将目标集群中的临时表数据复制到正式表即可。
    图1 Replicated*MergeTree引擎表迁移架构图
  • 分布式表迁移:

    分布式表不涉及表数据,只涉及表的元数据信息,迁移过程中会将源集群ClickHouse分布式表的元数据信息导出,然后将元数据信息修改为目标集群的ZooKeeper路径和副本,根据修改后的元数据信息在目标集群新建表即可。

  • 非复制表和物化视图迁移:

    针对非复制表和物化视图采用调用remote函数方式进行数据迁移。

上述迁移的操作步骤通过迁移工具脚本做了封装处理,只需修改相关配置文件执行迁移脚本即可完成一键式迁移操作,具体可以参考操作步骤说明。

前提条件

  • 待迁移的源ClickHouse集群状态正常,并且源集群和目的集群必须同为安全集群或者同为普通集群。如果集群模式都为普通模式,请联运维人员。
  • 已创建待迁移数据的ClickHouse目标集群,该集群版本为MRS 3.1.3及以上版本。该ClickHouse集群的ClickHouserver实例数量需要大于等于源集群。
  • 逻辑集群当前只支持副本数相同的集群间的数据搬迁。

迁移约束

  • 该搬迁指导仅支持迁移表数据及表对象DDL元数据,用户业务ETL等SQL语句需要自行迁移。
  • 为了保证迁移后源目标集群数据的一致性,迁移开始前需要短暂停止源集群的ClickHouse业务,具体停止时机请参考操作步骤说明。
  • 搬迁过程中如果源集群表被删除,迁移程序无法自动处理该场景,需要手动进行处理。

迁移整体流程

迁移整体流程和步骤参考如下:
图2 迁移流程图
表1 迁移流程说明

阶段

流程说明

步骤1:源集群和目标集群网络打通

将源ClickHouse集群和目标ClickHouse集群的网络需要打通,保证两个集群ClickHouse实例节点网络可以互通。

步骤2:在目标集群配置文件中增加源集群的ZooKeeper信息

通过在目标集群的ClickHouse配置文件中添加源集群的ZooKeeper信息,将源集群中的ZooKeeper作为迁移过程中的辅助ZooKeeper。

步骤3:迁移源ClickHouse集群下数据库和表的元数据信息到目标集群

执行元数据迁移脚本,将源集群中的ClickHouse数据库和表的数据库名、表名、表结构等元数据信息迁移到目标集群。

步骤4:迁移源ClickHouse集群下数据库和表数据到目标集群

执行数据迁移脚本,将源集群中的ClickHouse数据库和表的数据迁移至目标集群。

步骤1:源集群和目标集群网络打通

  1. 打通源集群和目标集群的网络。保证两个集群ClickHouse实例节点网络可以互通。
  2. 在目标集群的所有节点配置中添加源集群的hosts信息,同时在源集群的所有节点配置中添加目标集群的hosts信息。
    1. 登录源ClickHouse集群的FusionInsight Manager,选择“集群 > ClickHouse > 实例”,查看ClickHouseServer实例节点的业务IP地址。
    2. 使用ssh登录任意一个ClickHouseServer节点,执行以下命令查看源集群ClickHouse实例的hosts配置。

      cat /etc/hosts

      例如,如下示例显示命令查询示例集群查询结果,获取ClickHouse实例的主机配置信息。

    3. 登录目标ClickHouse集群的FusionInsight Manager,选择“集群 > ClickHouse > 实例”,查看目标集群ClickHouseServer实例节点的业务IP地址。
    4. root用户登录所有目标集群的ClickHouse实例节点,执行编辑命令修改节点的“/etc/hosts”配置。

      vi /etc/hosts

      将步骤2.b中获取的源集群ClickHouse实例的hosts信息,复制到该hosts文件中。

    5. 参考2.a2.d将目标集群的节点IP信息添加到源集群节点hosts中。
  3. 源集群和目标集群之间配置系统互信,具体请参考配置跨Manager集群互信

    源集群和目标集群同为普通模式时,无需配置互信。

步骤2:在目标集群配置文件中增加源集群的ZooKeeper信息

  1. 登录源集群的FusionInsight Manager,选择“集群 > 服务 > ZooKeeper > 实例”,查看源集群ZooKeeper实例quorumpeer的业务IP地址。

    例如图3显示示例集群获取的ZooKeeper实例IP地址。

    图3 源集群ZooKeeper实例地址
  2. 登录目标端FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“clickhouse-config-customize”配置项。
  3. 在“clickhouse-config-customize”配置项中,参考表2分别添加源集群的ZooKeeper实例信息。
    表2 “clickhouse-config-customize”配置名称和值参考

    名称

    auxiliary_zookeepers.zookeeper2.node[1].host

    1中获取的源集群第一个ZooKeeper实例quorumpeer的业务IP地址。注意:该参数当前仅支持配置ZooKeeper实例的IP地址,不支持配置主机名。

    auxiliary_zookeepers.zookeeper2.node[1].port

    2181

    auxiliary_zookeepers.zookeeper2.node[2].host

    1中获取的源集群第二个ZooKeeper实例quorumpeer的业务IP地址。注意:该参数当前仅支持配置ZooKeeper实例的IP地址,不支持配置主机名。

    auxiliary_zookeepers.zookeeper2.node[2].port

    2181

    auxiliary_zookeepers.zookeeper2.node[3].host

    1中获取的源集群第三个ZooKeeper实例quorumpeer的业务IP地址。注意:该参数当前仅支持配置ZooKeeper实例的IP地址,不支持配置主机名。

    auxiliary_zookeepers.zookeeper2.node[3].port

    2181

  4. 添加完配置后,单击“保存”,在弹出的对话框中单击“确定”完成配置保存。
  5. 保存成功后,以root用户登录任意一个目的集群的ClickHouseServer实例节点。执行以下命令查看ClickHouseServer实例信息。

    ps -ef |grep clickhouse

    根据查询的结果,获取“--config-file”参数值,即ClickHouseServer的配置文件config.xml目录。
    图4 获取ClickHouseServer配置文件目录
  6. 执行以下命令查看ClickHouse配置文件config.xml,可以看到<auxiliary_zookeepers>相关信息已添加成功。

    cat 5中获取的config.xml文件路径

    • 源集群和目标集群同为安全模式时,执行7
    • 源集群和目标集群同为普通模式时,执行11
    图5 查看已添加的源集群的ZooKeeper信息
  7. 5中获取的配置文件目录下,执行以下命令获取源集群ZooKeeper的认证信息。

    cat ENV_VARS | grep ZK

    分别获取:ZK_SERVER_FQDN、ZK_USER_PRINCIPAL、ZK_USER_REALM三个参数的值。

  8. 登录目标端FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,在“ClickHouseServer(角色)”下选择“备份”,参考下表配置具体参数。
    表3 配置源集群ZooKeeper认证信息

    参数

    AUXILIARY_ZK_SERVER_FQDN

    7中获取的ZK_SERVER_FQDN参数值。

    AUXILIARY_ZK_SERVER_PRINCIPAL

    7中获取的ZK_USER_PRINCIPAL参数值。

    AUXILIARY_ZK_SERVER_REALM

    7中获取的ZK_USER_REALM参数值。

    METADATA_COLLECTION_TIMEOUT

    配置为180。

    含义为:元数据备份时等待其他节点完成的超时时间,单位为秒。

    图6 配置源集群ZooKeeper认证信息
  9. 在“ClickHouseServer(角色)”下选择“存储”,修改参数max_partition_size_to_drop,max_table_size_to_drop值为0。

  10. 配置修改完成后,单击“保存”,在弹出的对话框中单击“确定”完成配置保存。
  11. 在ClickHouse服务页面,选择“实例”,勾选ClickHouseServer实例,选择“更多 > 重启实例”,重启ClickHouseServer实例。

步骤3:迁移源ClickHouse集群下数据库和表的元数据信息到目标集群

  1. 分别登录源和目标集群的FusionInsight Manager,创建迁移需要的用户名和密码,具体步骤如下。
    1. 登录Manager,选择“系统 > 权限 > 角色”,在“角色”界面单击“添加角色”按钮,进入添加角色页面。
    2. 在添加角色界面输入“角色名称”,例如ckrole,在配置资源权限处单击集群名称,进入服务列表页面,单击ClickHouse服务,进入ClickHouse权限资源页面。
    3. 勾选“ClickHouse管理员权限”,单击“确定”操作结束。
    4. 选择“系统 > 权限 > 用户”,单击“添加用户”,进入添加用户页面。
    5. “用户类型”选择“人机”,在“密码”和“确认密码”参数设置该用户对应的密码。
      • 用户名:添加的用户名不能包含字符“-”,否则会导致认证失败。
      • 密码:设置的密码不能携带“$”、“.”、“#”特殊字符,否则会导致认证失败。
    6. 在“角色”处单击“添加”,在弹框中选择1.b的角色名,单击“确定”添加到角色,单击“确定”完成操作。
    7. 创建完用户后,单击右上角的用户名,注销当前用户登录。使用新创建的用户名登录,根据提示修改当前用户密码。
  2. 下载和并使用omm安装ClickHouse客户端到目标集群。
  3. 使用omm用户登录到客户端节点,进入到“客户端安装目录/ClickHouse/clickhouse_migration_tool/clickhouse-metadata-migration”目录下配置迁移信息,执行以下命令,参考表4修改“example_config.yaml”配置文件。

    cd 客户端安装目录/ClickHouse/clickhouse_migration_tool/clickhouse-metadata-migration

    vi example_config.yaml

    修改完配置后,请务必将所有#号的注释信息删除,只保留有效的配置信息,否则后续迁移脚本执行可能会报错。

    表4 元数据example_config.yaml参数说明

    配置项

    配置子项

    配置说明

    source_cluster

    host

    源集群的任意一个ClickHouseServer节点的IP地址即可。

    cluster_name

    源集群ClickHouse的cluster名,可以参考ClickHouse客户端使用实践使用客户端登录,执行以下命令获取,如果没有修改过,默认为:default_cluster。

    select cluster,shard_num,replica_num,host_name from system.clusters;

    https_port

    • 安全集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“https_port”参数获取。
    • 普通集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“http_port”参数获取。

    zookeeper_root_path

    可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“clickhouse.zookeeper.root.path”参数获取。

    system

    系统参数。当前可不用配置,保持示例配置即可。

    databases

    可选配置。

    • 如果指定该参数,则表示迁移源ClickHouse集群指定数据库的数据,可指定多个。配置参考如下:
      databases:
          - "database"
          - "database_1"

      表示迁移源集群的database和database_1数据库。

    • 如果不指定该参数,则表示迁移源ClickHouse集群所有数据库的表数据。databases参数配置保留为空即可,参考如下:
      databases:

      表示迁移源ClickHouse集群的所有数据库的表信息。

    tables

    可选配置。参数格式为:数据库名.表名。表名前的数据库名必须在databases参数列表中。

    • 如果指定该参数,则表示迁移源ClickHouse集群数据库下的指定表数据,可指定多个。配置参考如下:
      tables:
          - "database.table_1"
          - "database_1.table_2"

      表示迁移源集群的database数据库下的table_1数据和database_1数据库下的table_2数据。

    • 如果不指定该参数,如果指定了databases参数则表示迁移databases数据库下的所有表数据,没有指定databases参数则表示迁移源ClickHouse集群所有数据库下的所有表数据。参考如下:
      tables:

    destination_cluster

    host

    目标集群的任意一个ClickHouseServer节点的IP地址即可。

    cluster_name

    目标集群ClickHouse的cluster名,可以参考ClickHouse客户端使用实践使用客户端登录,执行以下命令获取,如果没有修改过,默认为:default_cluster。

    select cluster,shard_num,replica_num,host_name from system.clusters;

    user

    1中创建的目标集群ClickHouse登录的用户名。

    https_port

    • 安全集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“https_port”参数获取。
    • 普通集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“http_port”参数获取。

    zookeeper_root_path

    可以登录目标集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“clickhouse.zookeeper.root.path”参数获取。

    system

    系统参数。当前可不用配置,保持示例配置即可。

  4. 执行以下命令,开始进行数据迁移,等待脚本执行完成。

    ./clickhouse_migrate_metadata.sh -f yaml_file

    输入源集群、目的集群的用户名和密码

元数据搬迁失败处理方法:

  1. 排查元数据搬迁失败原因,仔细排查配置文件内容,检视是否有参数配置错误。
    • 是,如果有参数配置错误,请重新配置并执行元数据搬迁。
    • 否,如果没有参数配置错误,请执行2
  2. 参考表4中的“databases”和“tables”参数,在元数据搬迁配置文件中设置搬迁失败的表名,重新执行元数据搬迁命令。如果迁移失败,请联系运维人员。

步骤4:迁移源ClickHouse集群下数据库和表数据到目标集群

  1. 使用omm用户登录到目标集群ClickHouse客户端节点的“客户端安装目/ClickHouse/clickhouse_migration_tool/clickhouse-data-migration”目录下。

    cd 客户端安装目录/ClickHouse/clickhouse_migration_tool/clickhouse-data-migration

  2. 执行以下命令,参考表5修改“example_config.yaml”配置文件。

    vi example_config.yaml

    修改完配置后,请务必将所有#号的注释信息删除,只保留有效的配置信息,否则后续迁移脚本执行可能会报错。
    表5 example_config.yaml参数说明

    配置项

    配置子项

    配置说明

    source_cluster

    host

    源集群的任意一个ClickHouseServer节点的IP地址即可。

    cluster_name

    源集群ClickHouse的cluster名,可以参考ClickHouse客户端使用实践使用客户端登录,执行以下命令获取,如果没有修改过,默认为:default_cluster。

    select cluster,shard_num,replica_num,host_name from system.clusters;

    user

    1中创建的源集群ClickHouse登录的用户名。

    https_port

    • 安全集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“https_port”参数获取。
    • 普通集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“http_port”参数获取。

    tcp_port

    可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,安全集群搜索“tcp_port_secure”参数获取,普通集群搜索“tcp_port”参数获取。

    zookeeper_root_path

    可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“clickhouse.zookeeper.root.path”参数获取。

    system

    系统参数。当前可不用配置,保持示例配置即可。

    databases

    可选配置。

    • 如果指定该参数,则表示迁移源ClickHouse集群指定数据库的数据,可指定多个。配置参考如下:
      databases:
          - "database"
          - "database_1"

      表示迁移源集群的database和database_1数据库。

    • 如果不指定该参数,则表示迁移源ClickHouse集群所有数据库的表数据。databases参数配置保留为空即可,参考如下:
      databases:

      表示迁移源ClickHouse集群的所有数据库的表信息。

    tables

    可选配置。参数格式为:数据库名.表名。表名前的数据库名必须在databases参数列表中。

    • 如果指定该参数,则表示迁移源ClickHouse集群数据库下的指定表数据,可指定多个。配置参考如下:
      tables:
          - "database.table_1"
          - "database_1.table_2"

      表示迁移源集群的database数据库下的table_1数据和database_1数据库下的table_2数据。

    • 如果不指定该参数,如果指定了databases参数则表示迁移databases数据库下的所有表数据,没有指定databases参数则表示迁移源ClickHouse集群所有数据库下的所有表数据。参考如下:
      tables:

    destination_cluster

    host

    目标集群的任意一个ClickHouseServer节点的IP地址即可。

    cluster_name

    目标集群ClickHouse的cluster名,可以参考ClickHouse客户端使用实践使用客户端登录,执行以下命令获取,如果没有修改过,默认为:default_cluster。

    select cluster,shard_num,replica_num,host_name from system.clusters;

    user

    1中创建的目标集群ClickHouse登录的用户名。

    https_port

    • 安全集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“https_port”参数获取。
    • 普通集群,可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“http_port”参数获取。

    tcp_port

    。可以登录目标集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,安全集群搜索“tcp_port_secure”参数获取,普通集群搜索“tcp_port”参数获取。

    zookeeper_root_path

    可以登录目标集群的FusionInsight Manager,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置”,搜索“clickhouse.zookeeper.root.path”参数获取。

    system

    系统参数。当前可不用配置,保持示例配置即可。

    auxiliary_zookeepers

    name

    3中配置的源ClickHouse的ZooKeeper名。例如当前为zookeeper2。

    hosts

    源ClickHouse集群的ZooKeeper的实例IP地址。可以登录源集群的FusionInsight Manager,选择“集群 > 服务 > ZooKeeper > 实例”,查看源集群ZooKeeper实例quorumpeer的业务IP地址。

    格式参考为:
    hosts:
        - "192.168.1.2"
        - "192.168.1.3"
        - "192.168.1.4"

    port

    2181

    execution_procedure

    -

    默认为空,表示执行一次脚本,将业务数据同步。参数还支持firststep和secondstep。

    • firststep:表示只执行完成临时复制表的创建,通过辅助Zookeeper能够将原集群的数据实时同步到临时表。
    • secondstep:表示将临时复制表里面的数据attach到目的集群的本地表中。
      注意:

      参数值为secondstep时,脚本执行前,需要运维人员和用户确认ClickHouse相关业务必须已经停止。

    onereplica_use_auxiliaryzookeeper

    -

    • 参数值为1,表示只为shard里面的一个副本创建临时表。
    • 参数值为0,表示为shard里面的两个副本创建临时表。
  3. 停止当前源集群的ClickHouse业务。
  4. 执行以下命令,开始进行数据迁移,等待脚本执行完成。

    ./clickhouse_migrate_data.sh -f yaml_file

    输入源集群、目的集群的用户名和密码

  5. 脚本执行完成后,根据迁移结果日志确认源集群和目标集群迁移的数据是否一致,具体操作如下:

    登录到目标集群ClickHouse客户端节点的“客户端安装目录/ClickHouse/clickhouse_migration_tool/clickhouse-data-migration/comparison_result”目录下。

    对比如下迁移后的结果文件信息,确认迁移后源集群和目标集群数据的一致性:

    • source_cluster_table_info:源集群迁出数据的统计
    • destination_cluster_table_info:目标集群迁入的数据统计
    • compare_result_file.txt:迁移前后数据一致性对比结果

    对于迁移前后数据不一致的表,需要清空目的集群中该表的数据,并针对该表重新单独进行数据迁移或人工完成数据迁移。

    另外,也可以分别登录到源和目标集群的ClickHouse数据库,手工查询表数据数量,分区个数等是否一致。

  6. 登录目标集群的FusionInsight Manager,将2在“clickhouse-config-customize”添加的ZooKeeper信息删除。

    完成后单击“保存”,在弹出的对话框中单击“确定”完成配置保存。

  7. 数据迁移完成后,将业务指向迁移后的目标ClickHouse集群,完成业务切流。
  8. 分别进入到目标集群ClickHouse节点的“客户端安装目录/ClickHouse/clickhouse_migration_tool/clickhouse-data-migration”和“客户端安装目录/ClickHouse/clickhouse_migration_tool/clickhouse-metadata-migration”目录下。

    vi example_config.yaml

    将配置文件中password参数密码信息清除,防止密码泄露。

业务数据搬迁失败:

  1. 排查元数据搬迁失败原因,仔细排查配置文件内容,检视是否有参数配置错误。
    • 是,如果有参数配置错误,请重新配置并执行业务数据搬迁。
    • 否,如果没有参数配置错误,请执行2
  2. 执行drop table table_name命令,删除目的集群搬迁失败节点上该表的相关数据表。
  3. 执行show create table table_name命令,查询源集群该表相关的创表语句,在目的集群重新创建该表。
  4. 参考表5中的“databases”和“tables”参数,在业务数据搬迁配置文件中设置搬迁失败的表名,重新执行业务数据搬迁命令。如果执行失败请联系运维人员。

相关文档