pgrust 复制与流式复制:Rust 版 PostgreSQL 的数据同步指南

pgrust 复制与流式复制:Rust 版 PostgreSQL 的数据同步指南

【免费下载链接】pgrust Postgres rewritten in Rust, now faster than Postgres and Clickhouse 【免费下载链接】pgrust 项目地址: https://gitcode.com/GitHub_Trending/pg/pgrust

如果你正在寻找一款高性能、可替代传统 PostgreSQL 的 Rust 数据库,那么 pgrust 绝对值得关注。它是 PostgreSQL 的 Rust 重写版,在保持磁盘格式与 Postgres 18.3 完全兼容的同时,通过了超过 46,000 条回归查询测试。本文是一份面向新手的 pgrust 复制与流式复制 入门指南,带你理解物理复制、逻辑复制、复制槽与同步复制的工作原理,并快速上手数据同步配置,为后续的高可用架构打下基础。

为什么复制对数据库如此重要

复制(Replication)是数据库高可用的基石。通过复制,你可以把主库的数据实时同步到备库,实现:

  • 故障转移:主库宕机时,备库可以立即接管服务
  • 读写分离:把查询流量分担到只读副本,减轻主库压力
  • 数据备份:复制本身就是一份持续更新的"热备份"
  • 版本升级与迁移:逻辑复制可以跨版本、跨实例迁移数据

pgrust 完整移植了 PostgreSQL 的复制体系,这意味着你熟悉的 pg_basebackuppg_receivewal 等工具和 SQL 语法,在 pgrust 上依然适用。

pgrust 复制架构全景

pgrust 的复制功能分散在 crates/backend/replication/ 目录下,与原生 PostgreSQL 的源码结构一一对应。核心模块如下:

模块路径职责
WAL 发送端crates/backend/replication/walsender/负责把 WAL 日志流式发送给备库
WAL 接收端crates/backend/replication/replication_walreceiver/备库侧接收并回放 WAL
复制槽crates/backend/replication/replication_slot/管理复制槽的生命周期与状态
同步复制crates/backend/replication/syncrep/实现同步提交的确认机制
逻辑解码crates/backend/replication/logical/把 WAL 解码成逻辑变更流

这套架构与 PostgreSQL 保持一致,因此你现有的运维经验可以直接迁移到 pgrust 上。

物理复制与流式复制:主从同步的底层机制

流式复制(Streaming Replication) 是 PostgreSQL 最常用的复制方式,也是 pgrust 实现的核心功能。它的本质是:主库不断产生 WAL(Write-Ahead Log,预写日志),通过 walsender 进程把 WAL 记录实时"流"给备库的 walreceiver 进程,备库回放这些日志,从而保持数据一致。

pgrust 对这条链路的移植非常忠实:

  • start_replication.rs 实现了 StartReplicationStartLogicalReplication,负责初始化复制命令、校验复制槽并启动 WAL 发送主循环
  • physical.rs 是物理发送回调 XLogSendPhysical 的 1:1 移植,负责计算"当前可以安全发送到哪个 LSN"、处理级联备库与时间线切换
  • mainloop.rs 对应 WalSndLoop,驱动整个发送循环
  • lag_tracker.rs 负责记录主备之间的延迟,供监控使用
主库 (walsender)  ──WAL 流──▶  备库 (walreceiver)  ──▶  回放 WAL  ──▶  数据一致

关键概念:

  • LSN:WAL 日志的位置指针,备库用它来确认"我已经收到并回放到哪里了"
  • 时间线(Timeline):数据库恢复到某个时间点后产生的新分支,pgrust 的物理发送逻辑中专门处理了历史时间线的流式发送

逻辑复制:更灵活的数据分发方式

如果说物理复制是"整库复制",那么 逻辑复制 就是"按表复制"。逻辑复制通过逻辑解码(Logical Decoding)把 WAL 解析成 INSERT/UPDATE/DELETE 等变更事件,然后发送给订阅端。它的优势在于:

  • 可以只复制指定的表
  • 支持跨版本、跨数据库类型的数据同步
  • 可以用于数据仓库、数据管道等下游系统

pgrust 的逻辑复制模块位于 crates/backend/replication/logical/,包含以下关键组件:

  • snapbuild/:构建一致性的初始快照
  • reorderbuffer/:对事务内的变更进行排序与缓冲
  • worker/launcher/:逻辑复制工作进程及其调度器
  • origin/:记录复制来源,防止循环复制
  • slotsync/:复制槽的同步
  • proto/:复制协议的相关实现

在 walsender 中,logical.rs 对应 XLogSendLogical,配合 start_replication.rs 中的 StartLogicalReplication,通过输出插件把解码后的变更以 'w' 消息写入复制流。

复制槽:流式复制的"安全锚点"

复制槽(Replication Slot) 是流式复制与逻辑复制中防止 WAL 被过早清理的机制。创建复制槽后,即使备库暂时断开连接,主库也会保留备库尚未消费的 WAL,不会将其覆盖。

pgrust 的复制槽实现位于 crates/backend/replication/replication_slot/。使用 pg_create_physical_replication_slotpg_create_logical_replication_slot 即可创建。

💡 提示:复制槽会占用磁盘空间,如果备库长期离线,WAL 会持续累积。运维时要为复制槽建立监控告警。

同步复制与级联复制:高可用进阶

同步复制(Synchronous Replication) 保证主库在提交事务时,至少有一个备库确认收到 WAL,从而避免主备切换时丢失数据。pgrust 的 crates/backend/replication/syncrep/ 模块实现了这一确认机制,支持通过 synchronous_standby_names 参数指定同步备库。

级联复制(Cascading Replication) 则允许备库继续向下游转发 WAL,形成"主库 → 备库 A → 备库 B"的拓扑。在 start_replication.rsGetStandbyFlushRecPtr 中,pgrust 专门处理了级联 walsender 的情况——它会发送 walreceiver 已流式接收但尚未回放的部分,以最大化同步效率。

如何快速体验 pgrust 的复制能力

pgrust 与 PostgreSQL 磁盘格式兼容,可以直接启动于现有 Postgres 18.3 数据目录。以下是一个最简化的主从同步验证思路:

  1. 启动 pgrust 主实例,确认 wal_level = replica(或 logical
  2. 创建用于复制的账号并授予复制权限
  3. 在主库创建复制槽,记录起始 LSN
  4. 启动备库实例,配置 primary_conninfo 指向主库
  5. 在主库执行数据变更,观察备库是否同步出现

由于 pgrust 保持 Postgres 协议兼容,你完全可以复用 pg_basebackup 等 PostgreSQL 生态工具来完成初始数据同步。

常见问题速查

Q1:pgrust 与 PostgreSQL 的复制是否互通? pgrust 磁盘格式与 Postgres 18.3 兼容,并完整移植了 walsender/walreceiver 协议实现,目标是与 PostgreSQL 生态无缝协作。不过项目仍处于早期阶段,生产环境使用前请先做充分验证。

Q2:物理复制和逻辑复制应该选哪个? 主从高可用、读写分离选物理复制(流式复制);按表迁移、异构同步、变更数据捕获(CDC)选逻辑复制。

Q3:pgrust 复制目前成熟吗? 项目声明"尚未达到生产就绪",复制模块属于移植版块的一部分,建议先在测试环境验证。官方路线图中还包括多线程内核、内置连接池等特性,值得持续关注。

结语

pgrust 用 Rust 重写 PostgreSQL,既保留了 Postgres 的行为与兼容性,又为性能优化打开了新的空间。通过本文对 pgrust 复制与流式复制 的介绍,你应该已经掌握了它的核心架构:walsender 发送、walreceiver 接收、复制槽锚定、同步复制与逻辑解码。数据同步是高可用架构的第一步,理解这些机制后,无论是搭建主从集群还是构建实时数据管道,你都能更有底气。

如果你对源码实现感兴趣,可以从 crates/backend/replication/walsender/src/start_replication.rs 开始阅读,这是整个复制链路的入口。

【免费下载链接】pgrust Postgres rewritten in Rust, now faster than Postgres and Clickhouse 【免费下载链接】pgrust 项目地址: https://gitcode.com/GitHub_Trending/pg/pgrust

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值