
本文字数:10940;估计阅读时间:28 分钟
作者:Tom Schreiber
本文在公众号【ClickHouseInc】首发

TL;DR
ClickHouse Cloud 的计算层现已实现完全无状态。本文将介绍实现这一突破的最后一环:一个由共享目录(Shared Catalog)驱动的全新内存数据库引擎,彻底消除了对本地磁盘的依赖。
我们将带你回顾这一演进过程,了解共享目录带来了哪些新能力,以及它如何支撑对任何数据源的无状态计算,甚至包括数据湖。
无状态计算,全面实现
ClickHouse Cloud 现在彻底告别了磁盘。计算节点不再存储任何本地数据,无需同步,无需预热。只需极速启动,执行查询,计算节点便可立刻销毁,真正实现了弹性、无状态的计算。
这不再是概念验证,而是当下的现实。
自 2022 年 10 月 ClickHouse Cloud 上线以来,我们持续致力于从计算层彻底剥离本地状态。本文将带你逐步回顾这一历程,看看我们如何一步步实现完全无状态的计算架构。
最后的关键拼图是共享目录,它实现了数据库元数据与磁盘的解耦。
这一突破带来了诸多立竿见影的好处,稍后我们将一一详述:
-
新的 DDL 能力,包括原子性的 INSERT … SELECT、跨数据库重命名、以及 UNDROP
-
无需依赖活跃计算节点的高可靠 DROP 操作
-
为极速、零预热的资源调度而生,奠定了低延迟的横向扩展、纵向扩展及快速唤醒的基础
-
支持原生及开放格式的数据,如 Iceberg 和 Delta Lake,实现无状态计算
这正是如今支撑 ClickHouse Cloud 部署的核心架构。
让我们从起点讲起:那时,一切数据都还存储在本地的节点上。
第 0 阶段:ClickHouse 的起点
ClickHouse 最初采用的是经典的 shared-nothing(无共享)架构,计算与存储紧密耦合。每台服务器在本地磁盘上存储并访问自身数据,依靠分片来实现横向扩展。
下图展示了在这种架构下,查询是如何被处理的。
在接下来的内容中,随着我们一步步介绍架构的演变,这张图也会不断调整,直到最终呈现出完全无状态、云原生的形态。

① DDL 语句与目录查询:由 Atomic 数据库引擎负责
在 ClickHouse 的早期版本中,DDL 语句以及像 SHOW TABLES、SHOW CREATE TABLE 这样的元数据查询,都是通过 Atomic 数据库引擎来处理的。从 20.10 版本开始,Atomic 替代了此前的 Ordinary 引擎,成为默认选项。
Atomic 为每张表分配一个持久的 UUID,实现了数据与表名的解耦,确保 DDL 操作的安全性与原子性。它会将所有元数据(以 .sql 文件形式保存)存储在本地磁盘,使得每个计算节点都与持久化状态紧密绑定。
(图中未展示:在集群模式下,CREATE、DROP、ALTER、RENAME 等 DDL 语句可以通过 ON CLUSTER 子句广播,由 Keeper 协调。该机制通过将 DDL 命令追加到 DDL 日志或队列中来实现,但不依赖具体的数据库引擎。不过,Keeper 不会保存完整的元数据状态,因此当新节点加入时,并不知道此前发生的变化,需通过手动操作来恢复表结构。)
这种方案在小型集群中运作良好,但在需要动态扩展时就变得困难。为了实现真正的无状态计算,我们必须去除对本地存储的依赖。
② 数据存储:由 MergeTree 表引擎负责
所有与表数据相关的操作(如插入、删除、更新)都由 MergeTree 系列表引擎来处理。该引擎将磁盘上的数据组织为一组不可变的数据部分。
ReplicatedMergeTree 表引擎通过 Keeper 中的复制日志实现数据的自动复制,从而支持高可用性。
③ 内存中的查询执行:依赖操作系统的页面缓存
在执行 SQL SELECT 查询时,所有所需数据都会在内存中完成处理。如果数据尚未被缓存,系统会从本地磁盘读取,并自动加载到操作系统的页面缓存。随后,数据流入查询引擎,借助 CPU 与内存带宽,通过高度并行的方式完成处理,以实现最佳性能。
这种架构设计在单节点或小集群环境下运作良好,但元数据与数据都依赖本地磁盘的紧耦合模式,在云环境中反而成了瓶颈。要突破这一限制、实现无状态计算,我们必须彻底重构 ClickHouse 在各层面对元数据与数据的管理方式。
不过在深入讲解之前,我们需要先澄清一个贯穿全篇、至关重要的基础概念。
如何管理元数据与数据
在深入了解 ClickHouse Cloud 无状态计算的演进之前,有必要先澄清一个关键概念:数据库引擎与表引擎的分离。
-
数据库引擎负责管理数据库及表的定义,处理诸如 CREATE、DROP、RENAME 等 DDL 操作,以及支持 SHOW TABLES 等元数据查询。在集群环境下,不同数据库引擎还支持将 DDL 变更同步到多个节点。
-
表引擎则负责表的实际数据:数据如何存储、索引、读取与写入,涵盖 INSERT、DELETE、UPDATE 等操作,并负责对本地或远程存储的访问。
将元数据管理与数据存储解耦,能够在每一层实现更高的灵活性、可扩展性与专用优化。这种架构正是 ClickHouse Cloud 的核心,尤其在迈向无状态计算的过程中至关重要。
正如我们即将看到的,完全无状态的计算需要在这两个层面同时创新:表引擎负责数据解耦,数据库引擎负责元数据解

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



