跳转到主内容
跳转到主内容

使用 remoteSecure 在自管理 ClickHouse 与 ClickHouse Cloud 之间迁移

Migrating Self-managed ClickHouse

本指南说明如何将自管理 ClickHouse 服务器迁移到 ClickHouse Cloud,以及如何在不同的 ClickHouse Cloud 服务之间进行迁移。 remoteSecure 函数可在 SELECTINSERT 查询中使用,以访问远程 ClickHouse 服务器,从而使迁移表的操作简化为编写一个包含嵌套 SELECTINSERT INTO 查询。

从自管理 ClickHouse 迁移到 ClickHouse Cloud

迁移自管理 ClickHouse

无论您的源表是否进行了分片和/或复制,在 ClickHouse Cloud 中您只需要创建目标表(对于该表可以省略 Engine 参数,SharedMergeTree 将会自动被选为表引擎), ClickHouse Cloud 将自动处理纵向和横向扩展。 您无需考虑如何对该表进行复制和分片。

在本示例中,自管理 ClickHouse 服务器是源端,而 ClickHouse Cloud 服务是目标端

概述

流程如下:

  1. 在源服务中添加一个只读用户
  2. 在目标服务中创建与源表相同的表结构
  3. 根据源服务的网络连通性,从源服务拉取数据到目标服务,或由源服务推送数据
  4. 从目标服务的 IP 访问列表中移除源服务器(如适用)
  5. 从源服务中移除只读用户

将表从一个系统迁移到另一个系统:

本示例将单个表从自管理 ClickHouse 服务器迁移到 ClickHouse Cloud。

兼容性

如果你注意到自托管 ClickHouse 部署与 ClickHouse Cloud 服务在行为上存在差异, 这可能与兼容性设置有关。 在 Cloud 中,兼容性是在创建服务时设定的,并且不会在服务级别更改,以确保即使服务升级,客户端也能获得一致的行为。 如果你希望更改兼容性,可以通过支持提交请求。

在源 ClickHouse 系统上(当前承载数据的系统)

  • 添加一个只读用户,用于读取源表(本示例中的 db.table
CREATE USER exporter
IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
SETTINGS readonly = 1;
GRANT SELECT ON db.table TO exporter;
  • 复制表结构
SELECT create_table_query
FROM system.tables
WHERE database = 'db' AND table = 'table'

在目标 ClickHouse Cloud 系统上:

  • 创建目标数据库:
CREATE DATABASE db
  • 使用源端的 CREATE TABLE 语句,在目标端创建对应的表。
提示

在运行 CREATE 语句时,将 ENGINE 修改为不带任何参数的 ReplicatedMergeTree。ClickHouse Cloud 始终会对表进行复制并提供正确的参数。不过,请保留 ORDER BYPRIMARY KEYPARTITION BYSAMPLE BYTTLSETTINGS 子句。

CREATE TABLE db.table ...
  • 使用 remoteSecure 函数从自管理 ClickHouse 集群中拉取数据
迁移自管理 ClickHouse
INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
注意

如果源系统无法从外部网络访问,那么你可以选择推送数据而不是拉取数据,因为 remoteSecure 函数同时支持查询和插入。请参阅下一个选项。

  • 使用 remoteSecure 函数将数据推送到 ClickHouse Cloud 服务
迁移自管理 ClickHouse
将远程系统添加到 ClickHouse Cloud 服务的 IP 访问列表

为了让 remoteSecure 函数能够连接到你的 ClickHouse Cloud 服务,需要在 IP 访问列表中允许该远程系统的 IP 地址。展开此提示下方的 管理你的 IP 访问列表 获取更多信息。

管理 IP 访问列表

在 ClickHouse Cloud 服务列表中选择要使用的服务,并切换到 Settings。如果 IP 访问列表中未包含需要连接到该 ClickHouse Cloud 服务的远程系统的 IP 地址或地址范围,则可以通过 Add IPs 来解决:

检查服务的 IP 访问列表中是否允许来自您 IP 地址的流量

添加需要连接到该 ClickHouse Cloud 服务的单个 IP 地址,或一个地址范围。根据需要修改表单,然后点击 Save

将您当前的 IP 地址添加到 ClickHouse Cloud 的 IP 访问列表中
INSERT INTO FUNCTION
remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table',
'default', 'PASS') SELECT * FROM db.table

在 ClickHouse Cloud 服务之间迁移

Migrating Self-managed ClickHouse

在 ClickHouse Cloud 服务之间迁移数据的一些典型场景:

  • 从恢复的备份中迁移数据
  • 将数据从开发服务复制到预发布服务(或从预发布复制到生产环境)

在本示例中存在两个 ClickHouse Cloud 服务,它们分别被称为目标。数据将从源被拉取到目标。尽管你也可以采用推送方式,但此处演示的是拉取方式,因为它使用只读用户。

Migrating Self-managed ClickHouse

迁移包含以下几个步骤:

  1. 确定一个 ClickHouse Cloud 服务作为,另一个作为目标
  2. 在源服务中添加一个只读用户
  3. 在目标服务上复制源表结构
  4. 临时允许从目标服务的 IP 访问源服务
  5. 将数据从源复制到目标
  6. 在目标服务上重新配置 IP 访问列表
  7. 从源服务中移除只读用户

在源服务中添加只读用户

  • 添加一个只读用户,使其可以读取源表(本例中为 db.table

    CREATE USER exporter
    IDENTIFIED WITH SHA256_PASSWORD BY 'password-here'
    SETTINGS readonly = 1;
    
    GRANT SELECT ON db.table TO exporter;
    
  • 复制表定义

    select create_table_query
    from system.tables
    where database = 'db' and table = 'table'
    

在目标服务上复制表结构

在目标服务中,如果数据库尚不存在,则创建该数据库:

  • 创建目标数据库:

    CREATE DATABASE db
    
  • 使用源服务中的 CREATE TABLE 语句,在目标服务中创建相应对象。

    在目标服务中,使用源服务执行 select create_table_query... 的输出创建表:

    CREATE TABLE db.table ...
    

允许对源服务的远程访问

为了将数据从源服务拉取到目标服务,源服务必须允许连接。请在源服务上临时禁用 IP Access List 功能。

提示

如果计划继续使用当前的源 ClickHouse Cloud 服务,请在切换为允许从任意位置访问之前,将现有的 IP Access List 导出为一个 JSON 文件;这样在数据迁移完成后,就可以重新导入该访问列表。

修改允许列表,并将访问权限临时设置为 Anywhere。详见 IP Access List 文档。

将数据从源复制到目标

  • 使用 remoteSecure 函数从源 ClickHouse Cloud 服务读取数据
    连接到目标。在目标 ClickHouse Cloud 服务上运行以下命令:

    INSERT INTO db.table SELECT * FROM
    remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
    
  • 验证目标服务中的数据

在源服务上重新建立 IP 访问列表

如果您之前导出了访问列表,可以通过 Share 将其重新导入;否则,请将相应条目重新添加到访问列表中。

移除只读的 exporter 用户

DROP USER exporter
  • 调整服务的 IP 访问列表以限制访问