PostgreSQL 流复制(主库 + 备库)
PostgreSQL难度: 中级耗时: 45–90 分钟使用 pg_basebackup 为已安装的主库添加一个或多个 hot standby(复制用户、pg_hba、复制槽、异步或同步 ANY/FIRST 模式、延迟监控),并生成这个无 Patroni 集群的运维手册:计划内 switchover、手动 failover(pg_promote)、用 pg_rewind 将旧主库重新加入、重建备库、级联备库和延迟备库、复制槽清理、修改同步配置。Failover 不是自动的,由 DBA 执行;需要自动 failover 请用 pg-patroni,表级或跨版本数据同步请用 pg-logical-repl。
架构: 1 个主库 + 1..N 个备库
场景
- 部署:为主库添加备库 — 使用 pg_basebackup 为已安装的主库添加一个或多个 hot standby(复制槽、同步/异步、监控)。主库保持运行;初始复制会给主库带来磁盘和网络负载。
- 计划内 switchover(角色切换,无数据丢失) — 计划内维护:干净地关闭主库,提升第一个备库,旧主库作为备库重新加入。无数据丢失;写入中断通常不到 1 分钟。
- 手动 failover(主库宕机,提升备库) — 主库宕机或无法访问:隔离旧主库(fencing),手动提升数据最新的备库。异步模式下最后的事务可能丢失。
- 用 pg_rewind 将旧主库作为备库重新加入 — Failover 之后,用 pg_rewind 将旧主库与新主库重新同步,并作为备库重新加入;比完整复制快得多。
- 添加从备库获取 WAL 的新备库(级联) — 新备库从第一个备库而不是主库接收 WAL:在远程数据中心或多备库架构中,可降低主库的网络/WAL sender 负载。主库不受影响。
- 搭建延迟(delayed)备库 — 数小时后才应用 WAL 的备库(recovery_min_apply_delay):用于在不从备份恢复的情况下找回误删的数据。它不是 failover 候选。
- 从头重建备库 — 备库落后太多、所需 WAL 已被删除或备库已损坏:将数据目录移到一边,从主库重新复制。主库不受影响。
- pg_wal 增长、磁盘写满(清理未使用的复制槽) — 找出 WAL 堆积的原因(非活动复制槽、归档失败、wal_keep_size);删除不再使用的复制槽,回收 WAL 空间。主库保持运行。
- 添加 / 移除同步备库(synchronous_standby_names) — 按表单中的模式(ANY/FIRST、k)重写同步列表,或改回异步;通过 reload 生效,无需重启。错误的配置可能使 commit 挂起;因此先做检查。
开始之前
- 主库 … 已按 pg-install 指南安装并在运行(PostgreSQL …,PGDATA …,端口 …)。
- 备库服务器上只完成了 pg-install 指南的操作系统准备阶段(hostname、chrony、sysctl、THP)。未创建集群;软件在本指南中安装。
- 所有服务器使用相同的操作系统系列、相同的架构(x86_64/aarch64)和相同的 PostgreSQL 主版本(…)。备库是主库的完全物理副本。
- 备库上 … 的可用空间至少比主库数据量多 20%。
- 服务器之间可通过端口 … 互相访问;主机名可解析,时钟已通过 NTP 同步。
- 防火墙已在服务器之间放行端口 …(如果 pg-install 只放行了应用网络,请同时添加复制 IP)。
- 在 Debian/Ubuntu 上配置文件位于数据目录之外(/etc/postgresql),pg_basebackup 不会复制它们;需要能以 root(或有 sudo 权限的用户)从备库 scp 访问主库,或手动拷贝这些文件。
- 旧主库的数据目录完好,服务器可以启动(磁盘故障时需要用 pg_basebackup 重建,而不是 pg_rewind)。
- …已为会给主库带来负载的初始复制(pg_basebackup)选定合适的时间。…维护窗口已开始;应用团队已知晓短暂的写入中断。…已确认主库确实无法访问;并确保它不会恢复后作为第二个主库接受写入(fencing)。…新主库运行正常并在接受写入。…新服务器(…)已就绪:操作系统准备已完成,… 为空且空间充足;初始复制会给源端(…)带来负载。…重建 … 期间,其读负载可转移到其他服务器;复制会给主库带来负载。…正在监控磁盘使用率;删除复制槽之前已与使用该复制槽的备库负责人沟通。…同步配置变更在维护窗口内进行;commit 延迟会变化,应用团队已知晓。…
指南阶段
- 准备(所有服务器) — 将服务器名称添加到 /etc/hosts · 添加 PGDG 软件源 · 添加 PGDG 软件源 · 安装 PostgreSQL 服务器软件 · 准备数据目录 · 创建集群配置并清空数据目录
- 在主库上做复制准备 — 检查 pg_rewind 前提条件 · 写入复制参数文件 · 加载参数 · 创建复制用户 · 设置复制用户的密码 · 在 pg_hba.conf 中添加复制规则 …
- 部署备库(pg_basebackup) — 测试到主库的复制连接 · 复制主库:… · 从主库复制配置文件 · 启动备库
- 验证 — 在主库上检查复制状态 · 在备库上检查 WAL 接收进程 · 在主库上写入测试数据 · 在备库上读取测试数据 · 删除测试表
- 启用同步复制 — 写入同步参数文件 · 在所有服务器上加载参数 · 验证同步状态
- 监控与部署后工作 — 延迟监控查询(主库) · 延迟监控查询(备库) · 复制槽占用监控 · 应用连接串 · 根据备库调整备份
- Switchover 前检查 — 检查备库状态 · 确认新主库已就绪 · 在旧主库上检查 .pgpass 和 pg_hba
- Switchover — 干净地关闭旧主库 · 确认新主库已收到最后的 WAL · 提升 … · 在新主库上创建复制槽 · 将旧主库配置为备库 · 以备库身份启动旧主库 …
- 手动 failover — 停止并禁用旧主库(fencing) · 找出数据最新的备库 · 提升 … · 临时取消同步等待 · 在新主库上创建复制槽 · 将其他备库指向新主库:… …
- 用 pg_rewind 将旧主库重新加入 — 在新主库上检查复制槽和连接规则 · 确认旧主库已停止 · pg_rewind 试运行 · 执行 pg_rewind · 完成备库配置 · 以备库身份启动旧主库 …
- pg_wal 膨胀与复制槽清理 — pg_wal 为什么在增长? · 找出复制槽的所有者 · 删除不再使用的复制槽:… · 删除复制槽:填写表单 · 确认 WAL 空间已回收 · 防止再次发生:上限与监控
- 同步备库变更 — 当前同步状态 · 安全检查:已连接的备库是否足够? · 写入同步参数文件 · 取消同步配置(改回异步) · 在所有服务器上加载参数 · 验证新状态