返回

文章详情

让我们从零开始构建 PlanetScale:基础设施

Hacker News2026年7月16日 11:58

Homescale,家里的 PlanetScale。我多年前为一家数据库工具公司工作,幸运地在 PlanetScale 成名之前建造了一些数据库克隆工具。这些工具从未注定会像 PlanetScale 那样成功,但它们确实有其用处。这些工具背后的想法很简单:将存储层与计算层隔离,并使用最佳的存储技术来克隆数据库文件。几个月前,当我在推特上谈论我与一个寻找具有 Ceph 实际经验的 Rust 开发者的 F1 团队的采访时,这个想法回到了我脑海中。提到 Ceph 让我想起了我参与过的一个失败产品尝试,我开玩笑地告诉一个朋友,我要建造 Homescale,家里的 PlanetScale。Homescale 我正在 github.com/homescale-dev/homescale 上构建 Homescale。Homescale 创建可写的数据库实例和基于不可变快照的时间点分支,而不复制整个数据库。我借用了 Docker 的镜像和容器模型来表示数据库状态:数据库镜像是一个不可变的起始点。数据库容器是从该镜像创建的可写克隆。分支是从现有容器的当前状态创建的另一个容器。我想的命令行界面看起来像这样: homescale image create --engine postgres postgres-base homescale container create --image postgres-base dev-db homescale container connect dev-db homescale branch create --container dev-db feature-login homescale container connect feature-login 本系列中的示例使用 Postgres,但 Homescale 的存储模型与数据库无关。镜像、容器和分支模型可以适用于任何将其持久状态保存在块设备支持的文件系统上的数据库引擎,并可以为可恢复快照做好准备。Postgres 是我计划支持的第一个引擎,为我在构建存储和编排层时提供了一些具体的使用例子。特定引擎的行为应放在适配器后面。该适配器初始化一个镜像,启动数据库进程,暴露连接细节,并在必要时为快照准备数据库。Homescale 处理与其相关的生命周期:卷、不可变状态、可写克隆、工作负载和谱系。分支一词描述了容器之间的关系。在运行这些命令后,dev-db 和 feature-login 都是可写的数据库容器。feature-login 只是从创建分支时 dev-db 的状态开始。在底层,谱系看起来是这样的: flowchart LR Image[/postgres-base<br/>image/] Dev[dev-db<br/>writable] State[/read-only<br/>state/] Feature[feature-login<br/>writable] Image -->|clone| Dev Dev -->|snapshot| State State -->|clone| Feature 镜像已经是不可变的,所以 Homescale 可以直接从中创建 dev-db。从可写容器进行分支需要一个中间状态。Homescale 首先在某个时间点捕获 dev-db,然后从该状态创建 feature-login。创建 feature-login 并不意味着逐字复制 dev-db。一个 100 GB 的数据库在分支开始之前需要额外的 100 GB 存储。分支应最初与捕获的 dev-db 状态共享其数据。只有之后更改的数据才需要额外的存储。这需要分支发生在数据库进程之下,位于存储层中。将存储与计算分开 将数据库存储与计算分开并不是一个新观点。标准的 Amazon RDS 引擎将数据库和日志文件存储在 EBS 卷上。Google Cloud SQL 在具有附加网络块存储的虚拟机中运行数据库进程,根据机器系列使用持久磁盘或超级磁盘。数据库仍然看到一个正常的块设备,但其持久数据并未与计算主机的本地磁盘绑定。Aurora、AlloyDB 和 Azure SQL Hyperscale 更进一步。它们的计算实例连接到专门为数据库设计的共享或分布式存储系统。计算实例可以被替换或缩放,而无需为每个实例创建完整的数据副本。Homescale 更接近第一个模型。数据库进程读写一个看似块设备上的文件系统。我只需要使用该设备后面的存储具有独立于其使用过程的生命周期。 flowchart TD Database[Database process] Filesystem[Filesystem] Device[Block device] Storage[(Persistent storage)] Database -->|file reads and writes| Filesystem Filesystem -->|block I/O| Device Device --> Storage 这个边界允许 Homescale 在启动数据库进程之前创建存储,并在进程停止后保留它。更重要的是,它允许在存储层中进行分支,而无需数据库引擎自己实现分支。这两个 Postgres 进程对它们的共享历史一无所知。每个进程都看到自己的可写块设备。另一个支持的引擎将看到相同的存储边界。引擎适配器将更改,但快照...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡