WAL-RUS:PostgreSQL备份工具WAL-G的Rust重写版
速览
WAL-RUS是一个将PostgreSQL备份工具WAL-G用Rust语言重写的项目。该重写旨在利用Rust的性能优势,提升备份操作的效率和安全性。对于需要高性能数据库备份方案的用户来说,WAL-RUS提供了一个值得关注的替代选择。
AI 深度解读
WAL-RUS:为 PostgreSQL 备份引入 Rust 重写的 WAL-G
背景
PostgreSQL 的备份基础设施应当是“无聊”且稳定的。它需要在后台持续归档 WAL(Write-Ahead Log,预写式日志)文件,上传备份,并确保在发生故障时能够进行恢复。对于 ClickHouse Cloud 而言,这一路径至关重要,因为 WAL 归档是保障其 PostgreSQL 服务持久性和可恢复性的核心机制。
长期以来,WAL-G 一直是执行此任务的强大且可靠的工具。它成熟、经过实战考验,并为 PostgreSQL 社区做出了巨大贡献。然而,随着 ClickHouse Cloud 将 PostgreSQL 部署到资源更加受限、环境更加紧凑的场景中,团队开始面临一个具体问题:内存可预测性(Memory Predictability)。
WAL-G 基于 Go 语言编写,虽然 Go 在构建可靠的基础设施软件方面表现出色,但其垃圾回收(GC)机制使得内存使用变得难以预测,特别是对于像 WAL 归档这样长期运行的服务。这种不确定性导致运维人员在资源规划时往往需要预留过多的内存,从而挤占了 PostgreSQL 本身用于查询、共享缓冲区和页面缓存的资源。为了解决这一痛点,ClickHouse Cloud 开发了 WAL-RUS,一个基于 Rust 的开源实现,旨在提供与 WAL-G 兼容但具有更可控内存效率的 PostgreSQL 备份和 WAL 归档工具。
核心内容
WAL-RUS 并非为了引入新功能而构建,WAL-G 依然是一个成熟且可靠的项目。WAL-RUS 的核心目标是在保留核心功能和兼容性的同时,提供更可预测的资源配置文件。
1. 可预测的资源使用
与基于垃圾回收的运行环境不同,Rust 允许开发者直接控制内存分配和并发。WAL-RUS 使用有界的工作池(bounded worker pools)和精心控制的并发机制,使得内存消耗更容易被理解和预估,从而减少了对备份基础设施进行过度资源预配的必要性。
2. 专为连续 WAL 归档设计
WAL-RUS 优先采用 WAL-G 的守护进程(daemon)架构。与为每个 WAL 文件生成新进程并建立新连接不同,WAL-RUS 保持与对象存储的持久连接,并在后台持续处理归档请求。这种架构减少了进程创建和连接建立的开销。
3. 针对流式工作负载优化
WAL 归档本质上是一个流式问题:读取 WAL 文件、压缩它们并上传到对象存储。WAL-RUS 在整个管道中最大限度地减少了不必要的缓冲和数据复制,使其能够以更小且更可预测的内存占用完成相同的归档工作。
4. WAL-G 兼容性
WAL-RUS 使用与 WAL-G 相同的 WAL_ 配置变量,并持续测试互操作性。WAL-G 可以读取由 WAL-RUS 生成的归档,反之亦然。这种双向兼容性使得现有部署的迁移变得简单直接。
基准测试数据
为了评估 WAL-RUS,ClickHouse Cloud 构建了一个可复现的基准测试,在持续的、WAL 密集的 PostgreSQL 工作负载下,对比了 WAL-RUS、WAL-G 和 pgBackRest 的表现。所有工具均配置了四个并发归档工作进程。
- 内存使用:这是 WAL-RUS 的主要动机。基准测试显示,WAL-G 在测试期间峰值虚拟内存接近 2.8 GB,而 WAL-RUS 保持在 1 GB 以下,减少了 70% 以上。WAL-RUS 在整个运行过程中保持了稳定的内存配置文件。pgBackRest(基于 C 语言,无垃圾回收)也表现出色,拥有对内存分配的紧密控制。
- WAL 归档吞吐量:WAL-RUS 和 WAL-G 在整个基准测试期间始终保持最小的积压(backlog),证明它们能够跟上生成的工作负载。相比之下,pgBackRest 在 WAL 活动剧烈期间积累了更大的积压,这体现了守护进程架构与基于进程的归档架构之间的权衡。
- CPU 利用率:三者的 CPU 使用率相当,主要消耗在 LZ4 压缩计算上。
未来计划
WAL-RUS 引入了对 PostgreSQL 17 的 wal summaries 用于增量备份的支持,ClickHouse 团队正致力于将此功能上游提交给 WAL-G。随着项目的进一步开发和加固,ClickHouse Cloud 计划将 WAL-RUS 作为其托管 PostgreSQL 服务的默认备份和 WAL 归档机制。
关键要点
- 解决内存不可预测性问题:WAL-G 基于 Go 语言,其垃圾回收机制导致虚拟内存使用呈现“锯齿状”波动,难以精确预估峰值内存。WAL-RUS 利用 Rust 的内存管理特性,提供了更稳定、可预测的内存占用。
- 显著的内存节省:在同等工作负载下,WAL-RUS 的峰值虚拟内存比 WAL-G 低 70% 以上(从 ~2.8GB 降至 <1GB),同时保持稳定的内存曲线。
- 完全兼容 WAL-G 生态:WAL-RUS 兼容 WAL-G 的配置变量,且两者生成的归档文件可以互相读取,确保现有用户无需担心数据迁移问题。
- 架构优势:采用守护进程架构和流式处理优化,减少了进程创建开销和数据复制,吞吐量与 WAL-G 相当,优于基于进程模式的 pgBackRest(在 WAL 密集场景下)。
- 开源与社区贡献:WAL-RUS 是开源项目,ClickHouse Cloud 计划将其作为自家托管 PostgreSQL 的默认备份工具,并正推动 PostgreSQL 17 的 WAL 摘要功能上游化。
意义与影响
WAL-RUS 的出现反映了云原生数据库运维中对资源效率和确定性的极致追求。
- 优化基础设施成本与性能:在资源受限的环境中,备份工具消耗的内存直接挤占了数据库核心功能(如缓存和查询处理)的资源。WAL-RUS 通过降低 70% 以上的内存占用,使得运维人员可以更自信地将内存分配给 PostgreSQL 本身,从而提升数据库的整体性能和稳定性,特别是在禁用内存超卖(overcommit)的生产环境中。
- Rust 在基础设施领域的崛起:该项目是 Rust 语言在系统级基础设施软件中替代 Go 和 C/C++ 的又一典型案例。它证明了 Rust 在提供内存安全的同时,能够实现比 Go 更细粒度的资源控制,特别适合对内存敏感的高并发、长运行服务。
- 增强 PostgreSQL 生态的多样性:虽然 WAL-G 已经非常成熟,但引入 WAL-RUS 为社区提供了另一个高性能、低资源消耗的选项。这种良性竞争有助于推动整个 PostgreSQL 备份工具链的优化,特别是针对云原生和边缘计算等新兴场景。
- 简化容量规划:对于云服务商和大型数据库管理员而言,更可预测的内存行为意味着更简单的容量规划和更少的资源浪费,这对于大规模部署至关重要。
ClickHouse Cloud 将 WAL-RUS 作为默认备份机制的决定,标志着该工具已从内部实验走向生产级验证,也为其他面临类似内存管理挑战的 PostgreSQL 托管服务提供商提供了新的参考范式。
