告别Go GC!ClickHouse重构WAL-G,Rust让Postgres备份更高效
本文字数:3119;估计阅读时间:8 分钟 作者: Sai Srirampur and Philip Dubé
WAL-G 采用 Go 语言编写,Go 是一种垃圾回收(garbage-collected)语言。尽管 Go 语言便于构建可靠的基础设施软件,但垃圾回收运行时使得内存使用难以预测,特别是对于 WAL 归档这类长期运行的服务。 挑战不仅在于 常驻内存 (resident memory,即实际使用的内存),还在于 虚拟内存 (virtual memory,即从操作系统预留的内存)。Go 运行时管理其自身的内存池,并可能预留远超应用程序实际需求的虚拟内存。随着工作负载的变化,这种内存占用会以难以理解和调优的方式波动。《Go GC 指南》(Go GC guide)将其描述为一种典型的“锯齿状”模式:在垃圾回收周期之间内存使用量会增长,回收后则会下降,这导致难以预测峰值内存消耗,并难以高效地分配资源。 对于运维人员来说,这带来了一个简单却重要的问题: 究竟应该为备份基础设施预留多少内存? 通常,为了避免意外的内存压力,答案是“超出所需”。预留给 WAL (Write-Ahead Log) 归档的内存,就无法可靠地分配给 Postgres (PostgreSQL) 本身用于查询、共享缓冲区和页面缓存。 当禁用内存过量分配 (overcommit) 时,Postgres 运行最为可靠,这使得虚拟内存成为一项宝贵的资源,而现代软件却常常将其忽视。 WAL-G (Write-Ahead Log G) 仍然是一个成熟可靠的工具,但随着我们将 Postgres 扩展到日益资源受限的环境中,我们希望拥有一个内存占用更可预测的备份系统,它能在提供相同功能的同时,消耗更少资源,并让容量规划变得更简单。
我们并非在寻求新功能。WAL-G 是一个成熟可靠的备份系统,我们乐于为其做出贡献。我们的目标是在保留核心功能和兼容性的同时,提供更可预测的资源使用模式。 WAL-RUS 是一个基于 Rust (编程语言) 实现的 Postgres 备份和 WAL 归档工具,旨在解决我们在内存可预测性和资源使用方面遇到的操作挑战。 1. 可预测的资源使用: 与垃圾回收 (garbage-collected) 运行时不同,Rust 允许我们直接控制内存分配和并发。WAL-RUS 采用有界工作池和精心控制的并发机制,使得内存消耗更易于理解,并减少了为备份基础设施过度配置资源的需要。 2. 专为持续 WAL 归档而设计: WAL-RUS 优先考虑 WAL-G 的守护进程 (daemon) 架构。它不会为每个 WAL 文件生成一个新进程并建立新连接,而是维护持久的对象存储连接,在后台持续处理归档请求。 3. 针对流式工作负载进行优化: WAL 归档本质上是一个流式处理问题:读取 WAL 文件,压缩它们,然后上传到对象存储。WAL-RUS 在整个处理流程中最大限度地减少了不必要的缓冲和数据复制,使其能够以更小、更可预测的内存占用完成相同的归档工作。 4. WAL-G 兼容性: WAL-RUS 沿用 WAL-G 的
WALG_
配置变量,并持续进行互操作性测试。WAL-G 能够读取 WAL-RUS 生成的归档,反之亦然,这使得现有部署的迁移过程变得无缝便捷。
为评估 WAL-RUS 的性能,我们构建了一个可复现的基准测试。该测试在持续的 WAL 密集型 PostgreSQL 工作负载下,对 WAL-RUS、WAL-G 和 pgBackRest 进行比较。此基准测试会持续生成 WAL,并将其归档至 S3,同时衡量每个归档工具在跟上 WAL 生成速度的同时,内存使用效率如何。为确保公平比较,所有这三款工具均配置了 四个并发归档工作进程 。
内存使用
内存效率是 WAL-RUS 设计的首要考量,因此内存消耗成为我们首先考察的指标。
WAL 归档吞吐量
CPU 利用率
WAL-RUS 的诞生旨在解决一个实际问题:以更小、更可预测的资源占用提供可靠的 PostgreSQL 备份和 WAL 归档。WAL-RUS 将 Rust 的显式内存管理与守护进程流式架构相结合,在实现与 WAL-G 相当的归档吞吐量的同时,显著降低了内存消耗。 值得注意的是,WAL-RUS 与现有的 WAL-G 归档和配置完全兼容,这使得它易于现有部署采用。WAL-RUS 还引入了对使用 Postgres 17 的 WAL 摘要进行增量备份的支持,我们正致力于将其贡献给 WAL-G 上游项目。 我们并非因为 WAL-G 缺少功能而构建 WAL-RUS。WAL-G 仍然是一个成熟且经过实战检验的项目。我们构建 WAL-RUS 是因为我们希望在保持与 WAL-G 所建立生态系统兼容性的同时,能更精细地控制资源使用。 随着我们持续开发并提升 WAL-RUS 的健壮性,我们计划将其作为 ClickHouse Cloud 中我们托管式 Postgres 服务的默认备份和 WAL 归档机制。 该项目是开源的,我们欢迎大家提供反馈、进行测试并贡献代码!
/END/ 征稿启示 面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至: [email protected]
关于我们
ClickHouse(clickhouse.com) 是面向 AI 时代打造的高性能实时分析数据库,能够以极致性能处理海量数据分析任务。凭借高并发、低延迟和云原生架构,ClickHouse 广泛应用于可观测性、数据仓库、实时分析及 AI 数据基础设施等场景。我们致力于帮助企业在公有云平台上构建安全、弹性且高性价比的实时分析与 AI 数据平台,加速释放数据价值,推动智能化创新与数字化转型。目前,Trip.com、DiDi、Meta、Sony、Netflix、Deutsche Bank、Sierra、Cloudflare 等全球领先企业均在使用 ClickHouse 支撑其关键业务和数据分析平台。
点击上方 关注我们