跳至主要内容

存储和计算分离

概述

本指南探讨了如何使用 ClickHouse 和 S3 来实现一个具有分离存储和计算的架构。

存储和计算分离是指计算资源和存储资源是独立管理的。在 ClickHouse 中,这可以实现更好的可扩展性、成本效益和灵活性。您可以根据需要分别扩展存储和计算资源,优化性能和成本。

使用 S3 作为 ClickHouse 后端的方案对于查询性能对“冷”数据不太重要的用例特别有用。ClickHouse 支持使用 S3 作为 MergeTree 引擎的存储,使用 S3BackedMergeTree。这种表引擎使用户能够利用 S3 的可扩展性和成本优势,同时保持 MergeTree 引擎的插入和查询性能。

请注意,与标准 ClickHouse 部署相比,实现和管理分离存储和计算的架构更加复杂。虽然自管理的 ClickHouse 允许像本指南中讨论的那样分离存储和计算,但我们建议使用 ClickHouse Cloud,它允许您在不进行配置的情况下使用 ClickHouse 在此架构中,使用 SharedMergeTree 表引擎

本指南假设您使用的是 ClickHouse 22.8 或更高版本。

危险

不要配置任何 AWS/GCS 生命周期策略。这不受支持,可能会导致表损坏。

1. 将 S3 作为 ClickHouse 磁盘使用

创建磁盘

在 ClickHouse config.d 目录中创建一个新文件以存储存储配置

vim /etc/clickhouse-server/config.d/storage_config.xml

将以下 XML 复制到新创建的文件中,将 BUCKETACCESS_KEY_IDSECRET_ACCESS_KEY 替换为您要存储数据的 AWS 存储桶详细信息

<clickhouse>
<storage_configuration>
<disks>
<s3_disk>
<type>s3</type>
<endpoint>$BUCKET</endpoint>
<access_key_id>$ACCESS_KEY_ID</access_key_id>
<secret_access_key>$SECRET_ACCESS_KEY</secret_access_key>
<metadata_path>/var/lib/clickhouse/disks/s3_disk/</metadata_path>
</s3_disk>
<s3_cache>
<type>cache</type>
<disk>s3_disk</disk>
<path>/var/lib/clickhouse/disks/s3_cache/</path>
<max_size>10Gi</max_size>
</s3_cache>
</disks>
<policies>
<s3_main>
<volumes>
<main>
<disk>s3_disk</disk>
</main>
</volumes>
</s3_main>
</policies>
</storage_configuration>
</clickhouse>

如果您需要进一步指定 S3 磁盘的设置,例如指定 region 或发送自定义 HTTP header,您可以在 此处 找到相关设置的列表。

您也可以将 access_key_idsecret_access_key 替换为以下内容,这将尝试从环境变量和 Amazon EC2 元数据中获取凭据

<use_environment_credentials>true</use_environment_credentials>

创建配置文件后,您需要将文件的拥有者更新为 clickhouse 用户和组

chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml

您现在可以重启 ClickHouse 服务器以使更改生效

service clickhouse-server restart

2. 创建一个由 S3 支持的表

为了测试我们是否已正确配置 S3 磁盘,我们可以尝试创建一个表并对其进行查询。

创建一个指定新的 S3 存储策略的表

CREATE TABLE my_s3_table
(
`id` UInt64,
`column1` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';

请注意,我们不必将引擎指定为 S3BackedMergeTree。如果 ClickHouse 检测到表正在使用 S3 作为存储,它会自动在内部转换引擎类型。

显示该表是否已使用正确的策略创建

SHOW CREATE TABLE my_s3_table;

您应该看到以下结果

┌─statement────────────────────────────────────────────────────
│ CREATE TABLE default.my_s3_table
(
`id` UInt64,
`column1` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main', index_granularity = 8192
└──────────────────────────────────────────────────────────────

现在让我们将一些行插入到我们的新表中

INSERT INTO my_s3_table (id, column1)
VALUES (1, 'abc'), (2, 'xyz');

让我们验证我们的行是否已插入

SELECT * FROM my_s3_table;
┌─id─┬─column1─┐
│ 1 │ abc │
│ 2 │ xyz │
└────┴─────────┘

2 rows in set. Elapsed: 0.284 sec.

在 AWS 控制台中,如果您的数据已成功插入到 S3,您应该会看到 ClickHouse 在您指定的存储桶中创建了新文件。

如果一切顺利,您现在正在使用 ClickHouse,存储和计算是分离的!

S3 bucket example using separation of compute and storage

3. 实现容错复制(可选)

危险

不要配置任何 AWS/GCS 生命周期策略。这不受支持,可能会导致表损坏。

为了实现容错,您可以使用分布在多个 AWS 区域的多个 ClickHouse 服务器节点,每个节点都使用一个 S3 存储桶。

使用 S3 磁盘进行复制可以通过使用 ReplicatedMergeTree 表引擎来完成。有关详细信息,请参阅以下指南

进一步阅读