PostgreSQL 流复制与逻辑复制性能优化与故障切换实战经验分享

在高可用和数据安全愈发受到重视的生产环境中,PostgreSQL 复制技术是保障业务连续性的重要手段。本文结合真实生产场景,分享流复制(Physical Replication)与逻辑复制(Logical Replication)的架构设计、性能优化和故障切换实战经验。

1. 业务场景描述

  • 主库承载日均千万级写入请求,读请求峰值达2000 QPS。
  • 需要实时备库做故障切换,且对主从延迟(Replication Lag)有严格要求(<100ms)。
  • 希望在无需停机的情况下进行版本升级或跨数据中心切换。
  • 同时需要对部分表或数据库进行灵活的逻辑订阅,以支持分库分表后数据同步。

2. 技术选型过程

  • 流复制:内置、稳定,对全库一致性保证强,适合主从切换或流量剪切。
  • 逻辑复制:基于发布/订阅,可选择性同步表结构变更,支持跨版本/跨架构迁移。
  • 工具选型:使用官方 replication slot+pg_basebackup 搭建流复制,逻辑复制使用 CREATE PUBLICATION/CREATE SUBSCRIPTION。故障切换借助 pg_ctl promote 或第三方 repmgr

最终方案:主备采用流复制+同步提交(synchronous commit),跨 DC 或分库场景使用逻辑复制。

3. 实现方案详解

3.1 流复制部署

  1. 主库配置(postgresql.conf):
# WAL 级别
wal_level = logical             # 支持逻辑复制可选 physical
max_wal_senders = 10           # 并发复制连接数
max_replication_slots = 10      # 复制槽
wal_keep_segments = 128        # 保留WAL段避免过快清理
synchronous_commit = on        # 开启同步提交
synchronous_standby_names = 'standby1'  # 同步备库名称
  1. 主库认证(pg_hba.conf):
# 允许复制用户连接
host replication replicator 192.168.1.0/24 md5
  1. 创建复制用户:
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'StrongP@ssw0rd';
  1. 初始化备库:
pg_basebackup -h 主库IP -D /data/pgsql/primary2 -U replicator -X stream -P
  1. 备库配置(recovery.conf 或 postgresql.auto.conf):
standby_mode = 'on'
primary_conninfo = 'host=主库IP port=5432 user=replicator password=StrongP@ssw0rd'
recovery_target_timeline = 'latest'
# 可选:故障切换触发
trigger_file = '/data/pgsql/trigger.promote'
  1. 启动备库:
pg_ctl -D /data/pgsql/primary2 start

3.2 逻辑复制部署

  1. 主库开启逻辑复制支持:
wal_level = logical
max_worker_processes = 8
max_replication_slots = 8
max_wal_senders = 8
  1. 创建发布:
-- 发布所有表
CREATE PUBLICATION pub_all FOR ALL TABLES;
-- 发布单表
CREATE PUBLICATION pub_user FOR TABLE public.user;
  1. 目标库创建订阅:
CREATE SUBSCRIPTION sub_all CONNECTION 'host=主库IP port=5432 dbname=postgres user=replicator password=StrongP@ssw0rd'PUBLICATION pub_all;
  1. 验证延迟:
-- 查看逻辑订阅状态
SELECT * FROM pg_stat_subscription;

4. 踩过的坑与解决方案

  1. WAL 段过快清理导致备库初始化失败

    • 原因: wal_keep_segments 配置过小
    • 方案:适当增大 wal_keep_segments 或使用 archive_mode+archive_command 长期保存WAL。
  2. 复制槽堆积导致磁盘占满

    • 原因:逻辑复制槽未及时消费
    • 方案:定期监控 pg_replication_slots,必要时手动清理或调整 max_replication_slots
  3. 主从切换后客户端连接抖动

    • 原因:应用侧未配置连接重试和读写分离
    • 方案:使用 PgBouncer 或 HAProxy 实现健康检查和自动路由。
  4. 版本升级时逻辑复制不兼容

    • 原因:跨主次版本时 WAL 格式或目录结构变化
    • 方案:升级前先测试 publication/subscription 兼容性,必要时使用双写中间件平滑切换。
  5. 同步提交性能瓶颈

    • 原因:synchronous_commit 阻塞主库写入
    • 方案:仅对关键库开启同步提交,其他只用异步模式;或者使用半同步模式(remote_write)。

5. 总结与最佳实践

  • 对业务关键表使用流复制+同步模式,保障零数据丢失。
  • 对灵活拆库、跨 DC 场景使用逻辑复制,按需订阅表。
  • 生产环境中要覆盖 WAL 归档、复制槽监控、连接池与中间件容灾。
  • 灰度或测试环境定期演练故障切换,验证 pg_ctl promote 和连接重试策略。
  • 持续关注 pg_stat_replicationpg_stat_subscription 延迟指标,自动告警。

通过以上实战经验的分享,希望帮助后端开发及 DBA 在高并发场景下,结合业务需求选择合适的 PostgreSQL 复制方案,并在性能优化与故障切换实践中少走弯路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94699.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94699.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/94699.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django开发规范:构建可维护的AWS资源管理应用

引言 在现代Web开发中,遵循一致的开发规范对于项目的可维护性和团队协作至关重要。本文基于实际的AWS资源管理项目,分享一套经过实践检验的Django开发规范,涵盖模型设计、Admin配置、管理命令和工具类开发等方面。 模型开发规范 数据模型设计原则 良好的数据模型设计是应…

机器学习可解释库Shapash的快速使用教程(五)

文章目录1 快速使用1.1 安装1.2 三个简单步骤快速入门1.2.1 步骤 1&#xff1a;准备模型和数据1.2.2 步骤 2&#xff1a;声明并编译 SmartExplainer1.2.3 步骤 3&#xff1a;可视化和探索1.2.4 启动 Web 应用1.2.5 将解释结果导出为数据2 Shapash的后端集成2.1 方法一&#xff…

如何在emacs中添加imenu插件

在配置文件中添加&#xff1a; ;; 删除现有的包管理器配置&#xff08;如果有&#xff09;&#xff0c;然后添加以下&#xff1a;;; 初始化包管理器 (require package);; 清除现有的仓库列表 (setq package-archives nil);; 添加正确的仓库&#xff08;注意&#xff1a;使用 H…

Linux下的网络编程SQLITE3详解

常用数据库关系型数据库将复杂的数据结构简化为二维表格形式大型&#xff1a;Oracle、DB2中型&#xff1a;MySql、SQLServer小型&#xff1a;Sqlite非关系型数据库以键值对存储&#xff0c;且结构不固定JSONRedisMongoDBsqlite数据库特点开源免费&#xff0c;C语言开发代码量少…

适配openai

openai 脚本 stream脚本import os from openai import OpenAIclient OpenAI(base_url"http://127.0.0.1:9117/api/v1",api_keyos.environ["ACCESS_TOKEN"], )stream client.chat.completions.create(model "Qwen/Qwen2-7B-Instruct",messages…

一天认识一个神经网络之--CNN卷积神经网络

CNN 是一种非常强大的深度学习模型&#xff0c;尤其擅长处理像图片这样的网格结构数据。你可以把它想象成一个系统&#xff0c;它能像我们的大脑一样&#xff0c;自动从图片中学习并识别出各种特征&#xff0c;比如边缘、角落、纹理&#xff0c;甚至是更复杂的物体部分&#xf…

13 SQL进阶-InnoDB引擎(8.23)

一、逻辑存储结构&#xff08;1&#xff09;表空间&#xff08;ibd文件&#xff09;&#xff1a;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据。cd /var/lib/mysql&#xff08;2&#xff09;段&#xff0c;分为数据段&#xff08;leaf node segment&a…

MTK Linux DRM分析(二十四)- MTK mtk_drm_plane.c

一、代码分析 mtk_drm_plane.h 和 mtk_drm_plane.c 两个文件,并生成基于文本的函数调用图,我将首先解析文件中的主要函数及其功能,然后根据代码中的调用关系整理出调用图。由于文件内容较长,我会专注于关键函数及其相互调用关系,并以清晰的文本形式呈现。 文件分析 1. …

滚珠导轨如何赋能精密制造?

在智能制造发展的趋势下&#xff0c;新兴行业对高精度、高稳定性的运动控制需求激增。作为直线传动领域的“精密纽带”&#xff0c;滚珠导轨凭借低摩擦、长寿命、高刚性优势&#xff0c;广泛应用于精密传动领域&#xff0c;成为产业升级的关键。新能源汽车制造领域&#xff1a;…

医疗 AI 的 “破圈” 时刻:辅助诊断、药物研发、慢病管理,哪些场景已落地见效?

一、引言在科技迅猛发展的当下&#xff0c;医疗领域正经历着深刻变革&#xff0c;人工智能&#xff08;AI&#xff09;技术宛如一颗璀璨新星&#xff0c;强势 “破圈” 闯入&#xff0c;为医疗行业带来了前所未有的机遇与活力。从辅助医生精准诊断病情&#xff0c;到助力药企高…

【项目思维】编程思维学习路线(推荐)

本篇博客是一份系统性、分阶段的 编程思维学习路线图推荐&#xff0c;从零基础小白到系统架构级别&#xff0c;帮助你全面建立和提升编程思维能力。 &#x1f6a6; 阶段 0&#xff1a;思维准备&#xff08;理解编程是什么&#xff09; &#x1f3af; 学习目标&#xff1a; 理…

vue3+antd实现华为云OBS文件拖拽上传详解

1、文件上传核心流程 选择文件​​&#xff1a;用户通过拖拽或点击选择文件手动触发上传​​&#xff1a;点击"确定"按钮后开始上传&#xff08;阻止自动上传&#xff09;​​获取上传凭证​​&#xff1a;从后端获取华为云OBS的上传配置构建表单数据​​&#xff1…

Mac 开发环境与配置操作速查表

Mac 开发环境与配置操作速查表 安装和配置 nvm / Node 安装 Homebrew Homebrew 安装参考文章 如果没有VPN&#xff0c;不要使用此命令安装&#xff01; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew --v…

【论文简读】MuGS

今天读一篇ICCV 2025的文章&#xff0c;关注的是Generalizable Gaussian Splatting&#xff0c;作者来自华中科技大学。 文章链接&#xff1a;arxiv 代码仓库&#xff1a;https://github.com/EuclidLou/MuGS&#xff08;摘要中的链接&#xff0c;但暂时404&#xff09; 文章目…

基于SpringBoot和百度人脸识别API开发的保安门禁系统

角色&#xff1a; 管理员、保安 技术&#xff1a; Spring Boot, MyBatis, MySQL, PageHelper, Bootstrap, jQuery, JavaScript, CSS3, HTML5, JSP, 百度人脸识别API 核心功能&#xff1a; 小区保安门禁系统是一个基于Spring Boot技术栈开发的综合性平台&#xff0c;旨在实现小区…

抖音电商首创最严珠宝玉石质检体系,推动行业规范与消费扩容

8月27日&#xff0c;“抖音电商开放日质检专场”活动在广州华林国际举行。活动上&#xff0c;抖音电商首次对外介绍了质检仓配一体化中心&#xff08;QIC&#xff09;的运作流程&#xff0c;并发布了服务升级计划。这一行业首创的“先鉴定后发货”模式&#xff0c;被认为推动了…

SpringBoot整合Spring WebFlux弃用自带的logback,使用log4j2,并启动异步日志处理

第一步&#xff1a;修改pom文件<!-- Spring Boot Starter WebFlux (排除默认日志) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>${spring-boot.vers…

理解虚拟 DOM:前端开发中的高效渲染利器

在前端开发中&#xff0c;我们经常听到 虚拟 DOM&#xff08;Virtual DOM&#xff09; 这个概念。它是 React、Vue 等框架的核心机制之一&#xff0c;用来提升性能和简化开发。那么&#xff0c;虚拟 DOM 到底是什么&#xff1f;为什么要用它&#xff1f;又是如何工作的呢&#…

GraphRAG数据可视化

GraphRAG数据可视化

vue/react项目如何跳转到一个已经写好的html页面

如果是一个你copy的别人的网站&#xff0c;某些页面是已经可以直接使用的&#xff0c;但是有些页面需要在vue/react项目中重新二次调整加工&#xff0c;这个时候&#xff0c;就需要将html文件和vue/react项目结合&#xff0c;当某些页面可以直接使用&#xff0c;就直接跳转到这…