自托管 ClickHouse 与 ClickHouse Cloud 之间的迁移
本指南将介绍如何从自托管 ClickHouse 服务器迁移到 ClickHouse Cloud,以及如何在 ClickHouse Cloud 服务之间进行迁移。该 remoteSecure
函数用于 SELECT
和 INSERT
查询以允许访问远程 ClickHouse 服务器,这使得迁移表就像编写一个带有嵌入 SELECT
的 INSERT INTO
查询一样简单。
从自托管 ClickHouse 迁移到 ClickHouse Cloud
无论您的源表是否分片和/或复制,在 ClickHouse Cloud 上,您只需创建一个目标表(您可以省略此表的 Engine 参数,它将自动成为 ReplicatedMergeTree 表),并且 ClickHouse Cloud 将自动处理垂直和水平扩展。您无需考虑如何复制和分片表。
在此示例中,自托管 ClickHouse 服务器为 源,ClickHouse Cloud 服务为 目标。
概述
流程如下
- 向源服务添加一个只读用户
- 在目标服务上复制源表结构
- 根据源的网络可用性,将数据从源拉取到目标,或将数据从源推送到目标
- 从目标上的 IP 访问列表中删除源服务器(如果适用)
- 从源服务中删除只读用户
从一个系统到另一个系统的表迁移:
此示例将一个表从自托管 ClickHouse 服务器迁移到 ClickHouse 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 BY
、PRIMARY KEY
、PARTITION BY
、SAMPLE BY
、TTL
和 SETTINGS
子句。
CREATE TABLE db.table ...
- 使用
remoteSecure
函数从自托管源拉取数据
INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')
如果源系统无法从外部网络访问,则可以推送数据而不是拉取数据,因为 remoteSecure
函数适用于 select 和 insert。请参阅下一个选项。
- 使用
remoteSecure
函数将数据推送到 ClickHouse Cloud 服务
为了使 remoteSecure
函数能够连接到您的 ClickHouse Cloud 服务,远程系统的 IP 地址需要通过 IP 访问列表允许。展开此提示下方的“管理您的 IP 访问列表”以获取更多信息。
管理您的 IP 访问列表
从 ClickHouse Cloud 服务列表中选择您要使用的服务,然后切换到“安全”。如果 IP 访问列表不包含需要连接到 ClickHouse Cloud 服务的远程系统的 IP 地址或范围,则可以通过“添加条目”解决此问题。
添加需要连接到 ClickHouse Cloud 服务的单个 IP 地址或地址范围。根据需要修改表单,然后“添加条目”和“提交条目”。
INSERT INTO FUNCTION
remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table',
'default', 'PASS') SELECT * FROM db.table
ClickHouse Cloud 服务之间的迁移
ClickHouse Cloud 服务之间迁移数据的一些示例用途
- 从恢复的备份中迁移数据
- 将数据从开发服务复制到暂存服务(或从暂存服务复制到生产服务)
在此示例中,有两个 ClickHouse Cloud 服务,它们将分别称为 源 和 目标。数据将从源拉取到目标。尽管您可以推送,但此处显示的是拉取,因为它使用了只读用户。
迁移有几个步骤
- 确定一个 ClickHouse Cloud 服务作为 源,另一个作为 目标
- 向源服务添加一个只读用户
- 在目标服务上复制源表结构
- 临时允许对源服务进行 IP 访问
- 将数据从源复制到目标
- 在目标上重新建立 IP 访问列表
- 从源服务中删除只读用户
向源服务添加一个只读用户
添加一个可以读取源表(在此示例中为
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 访问列表”功能。
如果您将继续使用源 ClickHouse Cloud 服务,则在切换到允许从任何位置访问之前,请将现有 IP 访问列表导出到 JSON 文件;这将允许您在数据迁移后导入访问列表。
修改允许列表并临时允许来自 任何位置 的访问。有关详细信息,请参阅 IP 访问列表 文档。
将数据从源复制到目标
使用
remoteSecure
函数从源 ClickHouse Cloud 服务拉取数据 连接到目标。在目标 ClickHouse Cloud 服务上运行此命令INSERT INTO db.table SELECT * FROM
remoteSecure('source-hostname', db, table, 'exporter', 'password-here')验证目标服务中的数据
在源上重新建立 IP 访问列表
如果您之前导出了访问列表,则可以使用 共享 重新导入它,否则请将您的条目重新添加到访问列表中。
删除只读 exporter
用户
DROP USER exporter
- 将服务 IP 访问列表切换为限制访问