Hotdry.

Article

Barman 基于 rsync 去重备份与 S3 对象存储集成的工程实现

深入解析 Barman 如何通过 rsync 与硬链接实现文件级增量去重,以及 barman-cloud-backup 对 S3 兼容对象存储的工程化集成方案。

2026-05-02mlops

在 PostgreSQL 备份领域,Barman(Backup and Recovery Manager)凭借其对多服务器集中管理、WAL 归档与 PITR(Point-in-Time Recovery)的原生支持,已成为企业级灾备架构的核心组件。继前文探讨 WAL 归档机制后,本文聚焦 Barman 两大核心技术能力:基于 rsync 的文件级增量去重备份机制,以及面向 S3 兼容对象存储的云端备份集成方案。这两项能力共同支撑了大规模 PostgreSQL 集群在存储成本与恢复效率之间的平衡设计。

rsync 文件级增量去重的技术原理

Barman 的增量备份能力分为两条技术路径:文件级增量备份(rsync-based)与块级增量备份(pg_basebackup with PostgreSQL 17+)。本文重点阐述前者,因其实现机制独特且对存储效率提升显著。

核心实现依赖于硬链接(hard link)机制。当首次执行全量备份时,Barman 将 PostgreSQL 数据目录完整复制至备份存储路径。后续执行增量备份时,rsync 进程逐文件比对源端与目标端的差异仅传输变更数据块,而对于未变更的文件,Barman 通过创建硬链接将其指向上一备份中对应的物理文件。这意味着多个备份版本可以共享同一份未变更的数据库文件,磁盘占用仅为一份真实数据的空间。

启用该特性需在 Barman 配置中设置 reuse_backup 参数。作用域可设为全局(barman.conf)或单服务器配置(/etc/barman.d/pg-server.conf)。典型配置片段如下:

[pg-server]
backup_method = rsync
reuse_backup = link
retention_policy = RECOVERY POINT OF TIME '2026-05-03 00:00:00'

参数 reuse_backup = link 即触发硬链接复用逻辑;设为 copy 则退化为传统全量复制模式。需特别注意的是,rsync 文件级增量备份与 PostgreSQL 17 引入的块级增量备份(--incremental 参数)属于互斥策略,同一备份链中严禁混用,否则会导致恢复时数据不一致。

工程实践中有两个关键监控点:其一,备份链完整性 —— 当父备份被意外删除而子备份仍保留硬链接时,会产生 “孤岛文件”,Barman 在执行 barman check 时会检测并报警;其二,磁盘 inode 消耗 —— 硬链接虽不占用额外磁盘空间,但仍消耗 inode 节点,极端大量备份场景下需关注文件系统 inode 配额。

barman-cloud-backup 与 S3 兼容存储的集成架构

传统 Barman 部署将备份存储于本地磁盘或 NFS 挂载卷,但现代云原生架构越来越多地将备份数据推送至 S3 兼容对象存储,以实现跨区域灾备与更低成本的长期保留。Barman 通过 barman-cloud-backup 工具链提供云端备份能力,该工具独立于主 Barman 守护进程运行,支持将基线备份(base backup)与 WAL 归档上传至云端。

配置流程涉及三个层面:一是凭证管理,Barman 支持通过环境变量(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)或 IAM 角色(EC2 实例角色)进行 S3 认证,生产环境推荐使用 IAM 角色以避免硬编码密钥;二是目标存储定义,需在 Barman 配置中指定 endpoint、bucket 名称及路径前缀;三是备份策略编排,结合 retention_policy 实现本地缓存与云端归档的分层存储。

以下为云存储后端的典型配置:

[pg-server-cloud]
backup_method = postgres
cloud_provider = aws-s3
s3_bucket = barman-backup-prod
s3_endpoint_url = https://s3.amazonaws.com
s3_region = us-east-1
incoming_wals_directory = /var/lib/barman/pg-server/incoming

其中 backup_method = postgres 指定使用 pg_basebackup 进行基线备份;cloud_provider 可选值包括 aws-s3azure-blobgoogle-gcs 等主流云存储。Barman 3.15+ 版本进一步增强了云端 WAL 归档能力,支持将 WAL 段直接流式上传至 S3,实现 RPO(恢复点目标)趋近于零的连续归档。

恢复操作与本地备份一致。执行 barman recover 时指定云端备份 ID,Barman 自动从 S3 下载所需数据至本地临时目录,再完成恢复流程。对于大规模数据库,可通过 barman-cloud-restore 的并行下载参数(--parallel)加速数据传输。

工程落地的关键参数与监控清单

综合上述两大技术方向,以下是生产环境部署的核心参数建议:

rsync 去重备份:启用 reuse_backup = link;设置合理的 retention_policy(建议保留至少 2 个全量备份周期);每月执行一次 barman check --check-all 验证备份链完整性;监控 /var/lib/barman 所在分区的 inode 使用率。

S3 云端备份:生产环境启用 server-side-encryption(SSE-KMS);配置 backup_compression = gzip 减少上传流量与存储成本;设置生命周期策略(如 Glacier Deep Archive 规则)自动归档超过 90 天的备份;监控 S3 请求费用与数据转出流量。

两项能力可协同工作:本地 rsync 备份链提供快速恢复能力,云端对象存储作为异地灾备目的地,形成「本地增量去重 + 云端冷存储」的双层架构。此架构已在多个大型互联网企业的 PostgreSQL 集群中验证,典型场景下可实现 60% 以上的存储成本节约。


参考资料

mlops