告别Go GC!ClickHouse重构WAL-G,Rust让Postgres备份更高效
本文字数3119估计阅读时间8 分钟作者Sai Srirampur and Philip DubéPostgreSQL 备份是那些理应默默无闻的基础设施组件之一。它们在后台运行持续归档 WAL 文件WAL files上传备份并确保在出现问题时能够进行恢复。在 ClickHouse Cloud这一环节至关重要。WAL 归档是确保我们 PostgreSQL 服务持久性durability和可恢复性recoverability的关键所在。WAL-G 一直是这项工作的强大而可靠的工具。它技术成熟久经考验并为 PostgreSQL 社区提供了卓越的服务。然而随着我们在更严苛、资源受限的环境中部署 PostgreSQL我们开始遭遇一个特定问题内存可预测性。这促使我们开发了WAL-RUS这是一个基于 Rust 的 PostgreSQL 备份和 WAL 归档工具的开源实现旨在提供可预测的内存效率和 WAL-G 兼容性。问题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-RUS 介绍我们并非在寻求新功能。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-G 的峰值虚拟内存接近2.8 GB而 WAL-RUS 则保持在1 GB以下降幅超过70%。此外WAL-RUS 在整个运行过程中保持了稳定的内存占用这使得其在生产环境中的资源需求更易于预测和管理。pgBackRest 在此也值得肯定作为一款基于 C 语言实现且不依赖垃圾回收运行时的工具它对内存分配拥有严格的控制。WAL 归档吞吐量在整个基准测试中WAL-RUS 和 WAL-G 都始终保持极小的积压这表明它们能够跟上所生成的工作负载。pgBackRest 在 WAL 活动剧烈期间积累了更大的积压这体现了其在 daemon-based 和 process-based 归档吞吐量方面的架构权衡。CPU 利用率CPU 利用率虽然相对次要但仍值得关注。三者之间的 CPU 使用率相近主要用于 LZ4 压缩计算。总结与结论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 归档机制。该项目是开源的我们欢迎大家提供反馈、进行测试并贡献代码关于我们ClickHouse 是面向 AI 时代打造的高性能实时分析数据库能够以极致性能处理海量数据分析任务。凭借高并发、低延迟和云原生架构ClickHouse 广泛应用于可观测性、数据仓库、实时分析及 AI 数据基础设施等场景。我们致力于帮助企业在公有云平台上构建安全、弹性且高性价比的实时分析与 AI 数据平台加速释放数据价值推动智能化创新与数字化转型。目前Trip.com、DiDi、Meta、Sony、Netflix、Deutsche Bank、Sierra、Cloudflare 等全球领先企业均在使用 ClickHouse 支撑其关键业务和数据分析平台。

相关新闻

C++实现围棋游戏:从数据结构到DFS算法实战

C++实现围棋游戏:从数据结构到DFS算法实战

1. 项目概述:为什么用C写一个简单的围棋游戏?如果你学过C,并且已经厌倦了在控制台里打印“Hello World”或者写一些简单的计算器,那么用C来开发一个简单的围棋游戏,会是一个绝佳的练手项目。这听起来可能有点唬人&…

2026/10/15 13:04:40 阅读更多 →
HY-Motion+Unity实战:AI驱动3D数字人实时交互动作生成方案

HY-Motion+Unity实战:AI驱动3D数字人实时交互动作生成方案

1. 项目概述:当数字人需要“活”起来最近在做一个虚拟展厅的项目,客户的核心需求是让里面的3D数字人导览员能和访客进行实时问答互动。这听起来很酷,但实现起来第一个拦路虎就是动作——你总不能指望数字人像个木头桩子一样杵在那里&#xff…

2026/10/15 13:51:41 阅读更多 →
Footprint图表与订单流分析:金融交易中的成交量洞察技术

Footprint图表与订单流分析:金融交易中的成交量洞察技术

在金融交易领域,成交量分析是判断市场参与者行为的关键技术之一。Footprint 图表作为一种高级成交量分析工具,能够直观展示每个价格水平上的买卖力量对比,帮助交易者识别潜在的支持阻力位和市场转折点。本文将深入解析 Footprint 交易的核心原…

2026/10/15 13:41:05 阅读更多 →

最新新闻

S7-200 PLC在变压器强油循环风冷控制中的应用与组态王监控设计

S7-200 PLC在变压器强油循环风冷控制中的应用与组态王监控设计

很多人一听到S7-200,第一反应就是“西门子停产多年的老型号了”。但在我经手过的变电站变压器自动化改造里,这个老型号依然活跃在大量主变冷却控制柜中。就拿变压器强迫油循环风冷控制来说,潜油泵让变压器油强制循环,风机把热量吹…

2026/10/16 13:31:02 阅读更多 →
Spring AI Java AI工程化实战:协议抽象与RAG生产落地

Spring AI Java AI工程化实战:协议抽象与RAG生产落地

1. 一个被误读的“停更”:Spring AI Alibaba到底发生了什么?“Spring AI Alibaba已停更了,Java还有希望吗?”——这个标题在技术社区里刷屏时,我正调试着一个用Spring AI 阿里云百炼API跑通的RAG服务。第一反应不是焦…

2026/10/16 13:31:02 阅读更多 →
CDMA扩频序列实战:Walsh码与m序列的正交性原理及多址干扰排查

CDMA扩频序列实战:Walsh码与m序列的正交性原理及多址干扰排查

简介:这份文档面向通信工程、无线通信课程学习者及CDMA系统入门研究者,系统梳理扩频序列中m序列与Walsh码的原理与实现。内容涵盖m序列的线性移位寄存器生成机制、反馈系数与起始状态对序列的影响,Walsh码基于Hadamard矩阵的正交构造及64阶序…

2026/10/16 13:31:02 阅读更多 →
信奥P4138挂饰题解:可变容量背包的动态规划技巧

信奥P4138挂饰题解:可变容量背包的动态规划技巧

打卡信奥刷题系列第2809篇,今天选的题目是P4138 [JOISC 2014] 挂饰 / Straps。这道题拿到第一眼容易误判成模拟:挂着挂着不就行了?但它其实是一个很经典的背包问题变种,考察的是对“可变容量背包”的理解。JOISC的题通常不会让你一…

2026/10/16 13:31:02 阅读更多 →
Windows下编译gRPC C++全静态库:解决LNK2019与DLL依赖问题

Windows下编译gRPC C++全静态库:解决LNK2019与DLL依赖问题

简介:本资源为 Windows 平台下预编译完成的 gRPC C 静态库集合,面向 C 开发者、跨平台通信模块集成工程师及需要离线构建 gRPC 客户端/服务端的中高级用户,有效解决 Windows 环境中 gRPC 源码编译门槛高、依赖复杂、易出错等实际痛点。压缩包…

2026/10/16 13:31:02 阅读更多 →
Java工程师转Agent工程师:24周实战转型路线全解析

Java工程师转Agent工程师:24周实战转型路线全解析

最近小半年,我身边好几个写Java的朋友陆续来问同一个问题:Agent这波机会,Java工程师能不能上车?我的答案一直很直接:能,而且比想象中容易得多。关键在于别一上来就扎进模型API和各种框架的文档里&#xff0…

2026/10/16 13:30:01 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →