ClickHouse 用 Rust 重写 WAL - G 推 WAL - RUS:内存消耗降超 70%,兼容现有部署
问题所在
Postgres 备份在 ClickHouse Cloud 中至关重要,WAL 归档是保持数据持久性和可恢复性的关键。WAL - G 一直是可靠工具,但将 Postgres 部署到资源更紧张环境时,遇到内存使用可预测性问题。WAL - G 用 Go 语言编写,其垃圾回收运行时使内存使用难以预测,包括常驻内存和虚拟内存。Go 的运行时管理内存池,可能预留比实际使用量多得多的虚拟内存,内存占用随工作负载变化波动,呈“锯齿”模式,这让运维人员难以预测峰值内存消耗和有效分配资源,通常需预留更多内存,影响 Postgres 本身资源分配。
解决方案:引入 WAL - RUS
开发 WAL - RUS 并非寻求新功能,而是为在保持核心功能和兼容性的同时,提供更可预测的资源使用情况。WAL - RUS 是用 Rust 实现的 Postgres 备份和 WAL 归档工具,具有可预测的资源使用,使用有界工作线程池和精心控制的并发,使内存消耗更易理解;专为连续 WAL 归档设计,采用 WAL - G 的守护进程架构,维护持久对象存储连接;针对流式工作负载优化,减少不必要的缓冲和数据复制;与 WAL - G 兼容,使用相同的 `WALG_` 配置变量,可互相读取归档,便于现有部署迁移。
基准测试
为评估 WAL - RUS,构建了可重现的基准测试,在持续的、WAL 密集型 PostgreSQL 工作负载下比较 WAL - RUS、WAL - G 和 pgBackRest。内存使用方面,WAL - G 峰值虚拟内存接近 2.8 GB,WAL - RUS 始终低于 1 GB,减少超 70%,且 WAL - RUS 内存使用稳定,pgBackRest 对内存分配控制严格。WAL 归档吞吐量上,WAL - RUS 和 WAL - G 能跟上工作负载生成速度,pgBackRest 在 WAL 活动高峰期积压较大。CPU 利用率方面,三者相当,主要用于计算 LZ4 压缩。
总结与结论
WAL - RUS 开发旨在以更小、更可预测的资源占用提供可靠的 PostgreSQL 备份和 WAL 归档。结合 Rust 的显式内存管理与守护进程流式架构,在实现与 WAL - G 相当的归档吞吐量时,显著降低内存消耗。WAL - RUS 与现有 WAL - G 归档和配置完全兼容,还支持使用 Postgres 17 的 WAL 摘要进行增量备份,正在努力将此功能上游集成到 WAL - G。未来计划将 WAL - RUS 作为 ClickHouse Cloud 中托管 Postgres 服务的默认备份和 WAL 归档机制,该项目开源,欢迎反馈、测试和贡献。此外,ClickHouse + Postgres 成为可扩展应用程序的统一数据栈,托管 Postgres 服务在 ClickHouse Cloud 可用,可立即注册试用。
