Hans-Juergen Schoenig:pg_hardstorage 背后的架构:复制协议

Hans-Juergen Schoenig:pg_hardstorage 背后的架构:复制协议

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

pg_hardstorage 通过 libpq 复制连接(BASE_BACKUP 与 START_REPLICATION SLOT)备份 PostgreSQL,无需 archive_command、SSH 或共享文件系统,兼容 RDS、Aurora 等托管服务。它用复制槽做流控,ACK 持久化的 WAL,槽延迟即背压信号,可接入现有监控。支持主备双槽并发写入 CAS 去重存储,并跟随 Patroni 切换,代价是需管理复制槽。

🔎

延伸解读

复制协议作为数据平面:托管环境的通用接口

pg_hardstorage 仅通过 libpq 复制连接与 PostgreSQL 交互,使用 BASE_BACKUP 和 START_REPLICATION SLOT 完成备份与 WAL 流式传输。这绕过了 archive_command、SSH 和共享文件系统,使其能直接对接 RDS、Aurora、Cloud SQL 等托管服务,只要这些服务暴露复制端点并授予复制权限。这种设计将数据平面统一为复制协议,但前提是托管服务允许创建复制槽并授予相应角色。

复制槽作为背压与监控信号

代理通过复制槽实现流控:它定期 ACK 已持久化的 WAL,PostgreSQL 则保留未 ACK 的 WAL 直到收到确认。若代理变慢或宕机,槽延迟增长,超过 max_slot_wal_keep_size 时 PostgreSQL 会告警。pg_hardstorage doctor --check slot 和 pg_hardstorage_wal_archive_lag_seconds 指标可将此信号接入现有监控,使槽延迟成为可观测的背压指标。

双槽并发与 CAS 去重的容错优势

可在主库和最低延迟备库上各建一个复制槽,同时向同一内容寻址存储写入。CAS 去重基于 SHA-256 哈希,重复块只存储一次并增加引用计数,因此双流产生的重复数据几乎不增加存储成本。任一数据流失败都不会导致 RPO 上升,这比并行 archive_command 更易管理,因为两个消费者共享同一逻辑资源。

Patroni 切换下的恢复与代价

代理通过 Patroni REST API 感知主库切换,在提升后重新连接新主库并捕获时间线切换,继续流式传输,实现约 5 秒内恢复且零 WAL 丢失。代价是需管理复制槽,包括监控槽延迟、设置 max_slot_wal_keep_size 以及使用 doctor 工具检查。对于大多数生产环境,这些代价可控,换来的是跨所有 PostgreSQL 部署的统一代码路径和可观测性。

❓

Q&A

pg_hardstorage 如何连接到 PostgreSQL 进行备份?

pg_hardstorage 的代理通过 libpq 连接,设置 replication 属性,使用 BASE_BACKUP 获取基础备份,使用 START_REPLICATION SLOT 在持久物理复制槽上流式读取 WAL。

pg_hardstorage 为什么能兼容 RDS、Aurora 等托管 PostgreSQL 服务?

因为它仅使用 PostgreSQL 的复制协议端点,不需要 archive_command、archive_library、SSH 或共享文件系统,托管服务通常都提供复制端点并授予必要的复制角色。

pg_hardstorage 如何实现流控和背压?

代理会定期 ACK 已持久化的 WAL,PostgreSQL 在收到 ACK 前会保留 WAL 在复制槽中。如果代理变慢,槽延迟增长,超过 max_slot_wal_keep_size 时 PostgreSQL 会告警,槽延迟就是背压信号。

pg_hardstorage 如何监控备份延迟?

可以使用 pg_hardstorage doctor --check slot 检查槽状态,并通过 pg_hardstorage_wal_archive_lag_seconds 指标导出到 Prometheus,现有的 PostgreSQL 复制延迟仪表板可以直接使用。

pg_hardstorage 支持主备双槽并发写入吗?如何避免重复存储?

支持。可以在主库和延迟最低的备库上各建一个复制槽,同时向同一个内容寻址存储(CAS)写入。CAS 去重确保重复的块只存储一次,仅增加引用计数,不占用额外存储空间。

pg_hardstorage 如何应对 Patroni 故障切换?

代理会监视 Patroni 的 REST API,在提升发生后重新连接到新的主库,捕获时间线切换并恢复流式传输,实现零 WAL 丢失。

使用 pg_hardstorage 有哪些代价或限制?

需要管理复制槽,包括监控槽延迟和确保 max_replication_slots 足够。这些权衡是明确的,但通常可控。

🏷️

标签

➡️

继续阅读