内容提要
Barman是一个用于管理PostgreSQL数据库备份和恢复过程的生产级工具。它不仅处理物理备份,还提供自动管理保留策略、压缩、接近零的恢复点目标(RPO)和在恢复窗口内的任意时间点(PITR)恢复的能力。Barman的流式归档功能通过使用pg_recievewal实用程序实现了零RPO的关键组件。pg_recievewal实用程序通过与PostgreSQL建立复制连接,实时将预写日志(WAL)文件备份到指定的Barman服务器。在某些情况下,配置Barman需要设置一个标准的与PostgreSQL的连接,用于管理、协调和监控,以及一个用于备份和WAL流式传输的流复制连接。这种配置在Barman的术语中被称为仅流式设置,备份和归档操作不需要SSH连接。
延伸解读
流式归档与原生归档的取舍
文章指出,PostgreSQL原生归档(archive_command)仅在WAL文件写满(16MB)时触发,灾难时可能丢失最多16MB的已提交事务。而pg_receivewal通过复制连接实时流式传输WAL,实现接近零RPO。但需注意,pg_receivewal默认使用异步复制,仍存在少量丢失已提交事务的可能;若业务无法容忍,可启用同步复制,但会因每次提交需等待备份服务器响应而降低吞吐量,且备份服务器故障时主库将停止提交。
备份方法选择:postgres与rsync
Barman支持两种备份方法:postgres(基于pg_basebackup的流式备份)和rsync。文章明确,postgres方法不支持增量或差异备份,而rsync方法支持增量备份,但要求Barman与PostgreSQL服务器之间配置无密码SSH连接。因此,若需要增量备份能力,必须选择rsync并配置SSH;若仅需全量流式备份,postgres方法更简单,无需SSH。
保留策略:冗余与恢复窗口
Barman允许基于备份冗余或恢复窗口定义保留策略。冗余策略指定保留的周期备份数量,如REDUNDANCY 8表示保留8个全量备份及其WAL;恢复窗口策略指定时间范围,如RECOVERY WINDOW OF 1 WEEK,确保可恢复到过去一周内任意时间点。此外,minimum_redundancy参数可设置最低冗余,即使保留期过期,备份也不会被删除,避免因保留策略误删关键备份。
恢复前的关键检查与故障转移
执行恢复前,必须确保Barman与目标PostgreSQL服务器的硬件架构相同、主版本匹配,并配置双向无密码SSH连接。恢复时,barman recover命令会复制基础备份并配置restore_command,使用barman-wal-restore工具获取WAL。若发生故障转移,需更新Barman配置中的conninfo和streaming_conninfo指向新主库,并运行barman cron启动新的pg_receivewal进程。Barman v3.10及以上版本提供config-switch命令简化集群
Q&A
Barman 是什么?它主要用来做什么?
Barman 是一个生产级的 PostgreSQL 数据库备份和恢复管理工具。它处理物理备份,并自动管理保留策略、压缩、接近零的恢复点目标(RPO),还支持在恢复窗口内进行任意时间点恢复(PITR)。
pg_receivewal 是什么?为什么用它代替 PostgreSQL 原生的归档方式?
pg_receivewal 是一个实用程序,它通过复制连接实时流式传输 PostgreSQL 的预写日志(WAL)文件到 Barman 服务器。原生归档(archive_command)只在 WAL 文件写满(16MB)时才归档,灾难时可能丢失最多 16MB 的已提交事务;而 pg_receivewal 实时流式传输,能实现接近零的数据丢失。
pg_receivewal 使用同步复制还是异步复制?各有什么优缺点?
pg_receivewal 默认使用异步流复制,因此存在丢失已提交事务的小概率风险。如果无法接受这种风险,可以启用同步复制,但会带来权衡:每次提交都需要与运行 pg_receivewal 的服务器进行往返通信,可能降低系统吞吐量;如果备份服务器宕机,PostgreSQL 将停止提交事务,直到备份服务器恢复在线。
如何配置 Barman 的保留策略?
Barman 支持基于备份冗余或恢复窗口的保留策略。基于冗余的策略指定保留的定期备份数量,例如 `retention_policy: REDUNDANCY 8` 表示保留 8 个完整备份及其 WAL 文件。基于恢复窗口的策略指定一个时间段,例如 `retention_policy: RECOVERY WINDOW OF 1 WEEK` 表示保留一周内的备份和归档,允许恢复到该窗口内的任意时间点。还可以设置 `minimum_redundancy` 来确保即使保留期过期,也至少保留一定数量的备份。
使用 Barman 进行恢复需要哪些前提条件?
恢复的前提条件包括:Barman 和 PostgreSQL 服务器应具有相同的硬件架构;PostgreSQL 主版本号必须匹配;同步两台服务器的时间;建立 Barman 和 PostgreSQL 服务器之间的双向无密码 SSH 连接;建议在所有 PostgreSQL 服务器上安装 barman-cli 包;SSH 连接应使用公钥交换认证;远程用户需要有权限在目标位置创建备份目录结构,并确保有足够空间存储基础备份和恢复所需的 WAL 文件。
在故障转移后,如何将 Barman 重定向到新的服务器?
在故障转移后,需要更新 `/etc/barman.d/pg_server.conf` 文件中的 IP 地址,修改 `conninfo` 和 `streaming_conninfo` 参数为新服务器的详细信息,然后执行 `barman cron` 命令以从新主库启动 pg_receivewal 进程。建议在提升或恢复后执行一次完整的基础备份。对于 Barman v3.10 及以上版本,可以使用 `config-switch` 选项进行集群配置切换,例如 `barman config-switch pg_server pg_server:pgreplica2`。
如何停止 Barman 服务器?
停止 Barman 服务器的步骤:1. 从 crontab 中移除所有相关条目(包括 `/etc/cron.d/barman` 中的自动条目);2. 运行 `barman receive-wal --stop pg_server` 停止归档;3. 运行 `barman receive-wal --drop-slot pg_server` 删除复制槽。