别了磁盘:ClickHouse Cloud 中无状态计算背后的架构

图片

本文字数: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 的核心,尤其在迈向无状态计算的过程中至关重要。

正如我们即将看到的,完全无状态的计算需要在这两个层面同时创新:表引擎负责数据解耦,数据库引擎负责元数据解

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值