如何部署 ClickHouse 存储与计算分离架构以独立扩展查询资源
【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse
本文解决的任务是:在自管理的 ClickHouse 上把数据存放到 S3 对象存储,让计算资源与存储资源相互独立,从而可以按需分别扩展查询用的计算节点和容量大的 S3 存储。完成部署后,ClickHouse 的表数据写入 S3 bucket,查询仍走MergeTree引擎的插入与查询性能——ClickHouse 在检测到表使用 S3 存储时,会在内部把引擎自动转换为S3BackedMergeTree,无需在CREATE TABLE中显式指定。
适用条件与前提
动手前核对以下边界,它们来自官方文档的明确要求:
- 版本要求:ClickHouse 22.8 或更高版本。
- 适用场景:对"冷"数据上的查询性能要求不高的用例。
- 硬性限制:不要对 S3/GCS 配置任何 life cycle(生命周期)策略——文档明确指出不支持该做法,且可能导致表损坏。
- 复杂度提醒:文档说明存储计算分离架构比标准部署更复杂;如果是 ClickHouse Cloud 场景,官方推荐直接使用
SharedMergeTree表引擎,无需本文的配置(见 SharedMergeTree 文档 对应的仓库文档)。本文路径面向自管理部署。 - 需要准备一个 S3 bucket,以及对应的
ACCESS_KEY_ID与SECRET_ACCESS_KEY。
完整步骤以 官方分离存储与计算指南 为准。
第一步:把 S3 配置为 ClickHouse 磁盘
在 ClickHouse 的config.d目录下新建存储配置文件(使用config.d覆盖目录的好处是升级时不会丢失这些配置):
vim /etc/clickhouse-server/config.d/storage_config.xml写入以下 XML,其中$BUCKET、$ACCESS_KEY_ID、$SECRET_ACCESS_KEY需替换为你自己的 AWS bucket 地址和凭证:
<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_disk是真正的 S3 磁盘;s3_cache是包在s3_disk上的本地缓存磁盘,max_size示例值为10Gi。policies中的s3_main策略把s3_disk挂到一个名为main的 volume 下,后续建表时通过策略名引用。- 如需进一步设置 S3 磁盘参数(例如指定
region或发送自定义 HTTPheader),完整参数列表见 MergeTree 文档的 S3 外部存储章节。 - 可选凭证方式:可以把
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 service clickhouse-server restart第二步:创建并验证 S3 支撑的表
验证磁盘配置是否生效的最直接方式是建一张表、写入数据并查回来。创建表时指定storage_policy = 's3_main',注意引擎仍写MergeTree,不需要(也无法)写成S3BackedMergeTree,ClickHouse 会自动完成内部转换:
CREATE TABLE my_s3_table ( `id` UInt64, `column1` String ) ENGINE = MergeTree ORDER BY id SETTINGS storage_policy = 's3_main';确认表按预期策略创建:
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 │ └────┴─────────┘最后的落盘验证:在 AWS 控制台中查看你指定的 bucket,如果数据插入成功,应能看到 ClickHouse 在 bucket 中生成了新的数据文件(见文首图片,文档示例截图中 bucket 路径为clickhouse3/,文件名为 ClickHouse 生成的分片文件)。至此存储与计算分离已生效:数据在 S3,查询计算在本地服务器。
可选分支:用多节点多区域实现容错复制
如果你的目标不只是分离存储与计算,还要求容错,文档给出的做法是:多个 ClickHouse 服务器节点分布在不同 AWS 区域,每个节点各配一个 S3 bucket,并用ReplicatedMergeTree表引擎完成复制。完整部署路径(两个 ClickHouse Server 节点 + 三个 ClickHouse Keeper 节点 + 每区域一个 S3 bucket,含 Keeper 的keeper_config.xml配置)见 S3 集成文档的"跨两个 AWS 区域复制单分片"章节。该章节同样再次强调不要配置 AWS/GCS life cycle 策略。
限制与说明
- 本文路径面向自管理 ClickHouse + S3;ClickHouse Cloud 用户应改用
SharedMergeTree,无需上述磁盘与策略配置。 - S3/GCS life cycle 策略明确不受支持,配置前务必确认 bucket 未启用。
- 官方文档给出的延伸阅读为
SharedMergeTree表引擎文档及其发布公告,可在此基础上了解共享存储架构。
【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考