存储与计算分离
概述
本指南探讨如何使用 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 复制到新创建的文件中,并将 BUCKET
、ACCESS_KEY_ID
、SECRET_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_id
和 secret_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!
3. 实施复制以实现容错(可选)
请勿配置任何 AWS/GCS 生命周期策略。这不受支持,并可能导致表损坏。
为了实现容错,您可以使用分布在多个 AWS 区域的多个 ClickHouse 服务器节点,每个节点使用一个 S3 存储桶。
使用 S3 磁盘的复制可以通过使用 ReplicatedMergeTree
表引擎来完成。有关详细信息,请参阅以下指南