news 2026/9/12 11:01:53

如何部署 ClickHouse 存储与计算分离架构以独立扩展查询资源

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何部署 ClickHouse 存储与计算分离架构以独立扩展查询资源

如何部署 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_IDSECRET_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 11:01:08

自动驾驶LMI-LQR多面体控制器设计与MATLAB实现

1. 项目背景与核心价值自动驾驶汽车的巡航控制一直是行业内的关键技术痛点。传统PID控制器在复杂路况下容易出现顿挫感&#xff0c;影响乘坐舒适性。我们团队基于线性矩阵不等式(LMI)方法设计了多面体LQR控制器&#xff0c;通过实验验证能够显著提升纵向控制的平顺性。这个方案…

作者头像 李华
网站建设 2026/9/12 11:00:51

神经形态安全测试:对抗脉冲注入与失效边界评估

这几年做神经形态计算的项目&#xff0c;我一直有个感觉&#xff1a;大家聊功耗、聊延时、聊准确率&#xff0c;聊得热火朝天&#xff0c;可一旦聊到安全测试&#xff0c;会议室能安静下来几个钟头。神经形态系统看起来“新”&#xff0c;但安全问题恰恰是它最容易被忽视的软肋…

作者头像 李华
网站建设 2026/9/12 10:55:38

Qt C++充电桩本地调度计费系统实现

简介&#xff1a;本资源是一套基于Qt框架开发的智能充电桩调度计费系统完整源码工程&#xff0c;面向计算机专业本科生、嵌入式与物联网方向初学者及Qt桌面应用开发者&#xff0c;解决新能源场景下充电桩资源智能分配、用户端交互与后台计费管理的综合实践问题。压缩包共79个文…

作者头像 李华
网站建设 2026/9/12 10:54:22

YooAsset深度解析:Unity资源管理的可控性与热更稳定性实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 10:53:37

2024年AI前沿模型解析:多模态与领域专用技术突破

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华