返回

文章详情

WAL-RUS: PostgreSQL备份的Rust重写版WAL-G

Hacker News2026年6月27日 23:32

Postgres备份是那些应该是无聊的基础设施之一。它们在后台持续归档WAL文件、上传备份,并确保在发生故障时可以进行恢复。在ClickHouse Cloud中,这条路径至关重要。WAL归档使我们能够为我们的Postgres服务保持持久性和可恢复性。WAL-G一直是这个工作的强大可靠工具。它成熟、经过实战检验,并在Postgres社区中表现良好。但随着我们将Postgres推向更加紧凑和资源有限的环境时,我们开始遇到一个特定的问题:内存可预测性。这促使我们构建了WAL-RUS,一个开源的基于Rust的Postgres备份和WAL归档工具实现,旨在实现可预测的内存效率和与WAL-G的兼容性。WAL-G是用Go语言编写的,这是一种垃圾回收语言。虽然Go使构建可靠的基础设施软件变得容易,但垃圾回收的运行时使得内存使用变得难以预测,特别是对于像WAL归档这样的长期运行服务。挑战不仅在于常驻内存(正在被活跃使用的内存),还在于虚拟内存(从操作系统保留的内存)。Go的运行时管理自己的内存池,并可能保留比应用程序实际使用的更多虚拟内存。随着工作负载的变化,这种占用可能会以难以推测和调优的方式波动。Go GC指南将其描述为一种特征性的“锯齿形”模式,其中内存使用在垃圾收集周期之间增长,然后在收集后下降,这使得预测峰值内存消耗和有效配置资源变得困难。对于运维人员来说,这产生了一个简单但重要的问题:应为备份基础设施保留多少内存?答案通常是“超出必要的”,以避免意外的内存压力。分配给WAL归档的内存是不能自信地分配给Postgres本身用于查询、共享缓冲区和页缓存的内存。Postgres在禁用过量提交的情况下最可靠地运行,使得虚拟内存成为一种现代软件常常作为事后思考留下的宝贵资源。WAL-G仍然是一个经过验证和可靠的工具,但随着我们将Postgres扩展到越来越资源有限的环境中,我们希望有一个具有更可预测内存配置的备份系统,同时提供相同的功能并消耗更少的资源,从而简化容量规划。我们没有寻找新的功能。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生成的归档,使现有部署的迁移变得简单。为了评估WAL-RUS,我们构建了一个可重复的基准测试,比较WAL-RUS、WAL-G和pgBackRest在持续的WAL密集型PostgreSQL工作负载下的性能。基准测试持续生成WAL,将其归档到S3,并测量每个归档器在跟上WAL生成的同时使用内存的效率。为了确保公平比较,这三个工具都配置为四个并发归档工作者。内存效率是WAL-RUS背后的主要动机,使得内存消耗成为我们检查的第一个指标。在基准测试中,WAL-G的峰值虚拟内存几乎达到了2.8 GB,而WAL-RUS始终保持在1 GB以下,减少超过70%。WAL-RUS在整个运行过程中还维持了稳定的内存配置,使得在生产环境中更容易推测其资源需求。pgBackRest在这里也值得称赞。

赞助内容

NordVPN Next-gen Antivirus

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

请我喝杯咖啡