WAL-RUS:用Rust重写WAL-G实现PostgreSQL备份
1. 引言
Postgres备份是那种应该保持无聊的基础设施组件。它们在后台默默运行,持续归档WAL文件,上传备份,确保当出现问题时能够恢复。在ClickHouse Cloud中,这条路径至关重要。WAL归档使我们能够为Postgres服务保持持久性和可恢复性。WAL-G一直是这项工作的强大可靠工具。它成熟、经过实战检验,并为Postgres社区提供了良好服务。但随着我们将Postgres推向更紧张、资源更受限的环境,我们开始遇到一个特定问题:内存可预测性。这促使我们构建了WAL-RUS,一个基于Rust的开源Postgres备份和WAL归档工具实现,旨在实现可预测的内存效率和WAL-G兼容性。
2. 问题
WAL-G是用Go编写的,这是一种垃圾回收语言。虽然Go使得构建可靠的基础设施软件变得容易,但垃圾回收运行时使得内存使用更难预测,尤其是对于像WAL归档这样的长期运行服务。挑战不仅在于常驻内存(正在使用的内存),还在于虚拟内存(从操作系统保留的内存)。Go的运行时管理自己的内存池,并且可以保留比应用程序实际使用的多得多的虚拟内存。随着工作负载的变化,这种占用空间可能以难以推理和调整的方式波动。Go GC指南将此描述为特征性的锯齿模式,其中内存使用在垃圾回收周期之间增长,然后在回收后下降,使得难以预测峰值内存消耗并有效配置资源。对于运维人员来说,这产生了一个简单但重要的问题:应该为备份基础设施保留多少内存?答案通常是比必要的多,以避免意外的内存压力。为WAL归档预算的内存是不能自信地分配给Postgres本身用于查询、共享缓冲区和页面缓存的内存。Postgres在禁用超额提交的情况下运行最可靠,这使得虚拟内存成为现代软件经常忽视的宝贵资源。WAL-G仍然是一个经过验证的可靠工具,但随着我们将Postgres扩展到越来越资源受限的环境中,我们想要一个具有更可预测内存配置的备份系统,提供相同的功能,同时消耗更少的资源,并使容量规划更简单。
3. 解决方案:介绍WAL-RUS
我们并不是在寻找新功能。WAL-G是一个成熟可靠的备份系统,我们很乐意为其做出贡献。我们的目标是保留核心功能和兼容性,同时提供更可预测的资源配置。WAL-RUS是一个用Rust实现的Postgres备份和WAL归档工具,旨在解决我们在内存可预测性和资源使用方面遇到的操作挑战。1. 可预测的资源使用:与垃圾回收运行时不同,Rust让我们直接控制内存分配和并发。WAL-RUS使用有界工作池和精心控制的并发,使得内存消耗更容易推理,并减少为备份基础设施过度配置资源的需求。2. 专为持续WAL归档构建:WAL-RUS优先采用WAL-G的守护进程架构。它不是为每个WAL文件生成新进程并建立新连接,而是维护持久对象存储连接,在后台持续处理归档请求。3. 针对流式工作负载优化:WAL归档本质上是一个流式问题:读取WAL文件,压缩它们,并上传到对象存储。WAL-RUS在整个管道中最小化不必要的缓冲和数据复制,使其能够以更小、更可预测的内存占用执行相同的归档工作。4. WAL-G兼容性:WAL-RUS使用与WAL-G相同的WALG_配置变量,并持续测试互操作性。WAL-G可以读取WAL-RUS生成的归档,WAL-RUS也可以读取WAL-G生成的归档,使得现有部署的迁移变得简单直接。
4. 基准测试
为了评估WAL-RUS,我们构建了一个可重复的基准测试,在持续的、WAL密集型的PostgreSQL工作负载下比较WAL-RUS、WAL-G和pgBackRest。基准测试持续生成WAL,将其归档到S3,并测量每个归档器在跟上WAL生成的同时如何高效使用内存。为了确保公平比较,所有三个工具都配置了四个并发归档工作线程。
5. 内存使用
内存效率是WAL-RUS背后的主要动机,使得内存消耗成为我们检查的第一个指标。在基准测试期间,WAL-G达到了近2.8 GB的峰值虚拟内存,而WAL-RUS保持在1 GB以下,减少了超过70%。WAL-RUS在整个运行过程中还保持了稳定的内存配置,使其资源需求在生产环境中更容易推理。pgBackRest在这里也值得称赞。作为基于C的实现,没有垃圾回收运行时,它对内存分配有严格的控制。
6. WAL归档吞吐量
WAL-RUS和WAL-G在整个基准测试中始终保持着最小的积压,表明它们能够跟上生成的工作负载。pgBackRest在WAL活动密集期间积累了更大的积压,说明了它们在基于守护进程和基于进程的归档吞吐量之间的架构权衡。
7. CPU利用率
CPU利用率不太重要,但值得关注。三者之间的使用情况相当,主要是计算LZ4压缩。
8. 总结与结论
WAL-RUS是为了解决一个实际问题而构建的:以更小、更可预测的资源占用提供可靠的PostgreSQL备份和WAL归档。通过将Rust的显式内存管理与守护进程化的流式架构相结合,WAL-RUS实现了与WAL-G相当的归档吞吐量,同时显著减少了内存消耗。重要的是,WAL-RUS与现有的WAL-G归档和配置完全兼容,使得现有部署的采用变得简单直接。WAL-RUS引入了对使用Postgres 17的WAL摘要进行增量备份的支持,我们正在努力将其上游到WAL-G。我们构建WAL-RUS不是因为WAL-G缺乏功能。WAL-G仍然是一个成熟且经过实战检验的项目。我们构建WAL-RUS是因为我们想要对资源使用进行更严格的控制,同时保持与WAL-G帮助建立的生态系统的兼容性。随着我们继续开发和强化该项目,我们计划使WAL-RUS成为ClickHouse Cloud中托管Postgres服务的默认备份和WAL归档机制。该项目是开源的,我们欢迎反馈、测试和贡献!尝试由ClickHouse管理的Postgres ClickHouse + Postgres已成为可扩展应用程序的统一数据栈。随着托管Postgres现在在ClickHouse Cloud中可用,这个栈成为第一天的决策。注册 分享此帖子 复制URL 订阅我们的新闻通讯 及时了解功能发布、产品路线图、支持和云产品!近期文章 查看所有博客 社区 我如何利用AI寻找漏洞 Tsvetan Stoychev · 2026年6月26日 公司与文化 ClickHouse获得AWS云运营能力认证 Aditya Chidurala · 2026年6月26日 工程 宣布Silk:ClickHouse的丝滑纤程运行时 James Cunningham和Vadim Skipin · 2026年6月25日 产品 ClickHouse现在成为Notion自定义代理中的原生连接 Alex Francoeur和Aditya Chidurala · 2026年6月25日
🔗 原文链接:https://clickhouse.com/blog/walrus-postgres-backups-in-rust