PostgreSQL 流復制與邏輯復制性能優化與故障切換實戰經驗分享

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;就直接跳轉到這…