Docker 下配置 Pgsql 主從復制的全過程
在實際生產(chǎn)環(huán)境中,PostgreSQL(簡稱 Pgsql)作為一款強大的開源關系型數(shù)據(jù)庫,單節(jié)點部署存在明顯的單點故障風險——一旦主庫宕機,將直接導致業(yè)務中斷、數(shù)據(jù)丟失,嚴重影響系統(tǒng)可用性。而主從復制技術,正是解決這一痛點的核心方案:通過搭建主庫(Master)與從庫(Slave)架構(gòu),主庫負責處理所有寫操作(增刪改),從庫實時同步主庫數(shù)據(jù)并提供讀操作支持,既能實現(xiàn)數(shù)據(jù)備份,又能分擔主庫讀壓力,同時在主庫故障時可快速切換到從庫,保障業(yè)務連續(xù)性。
Docker 作為輕量級容器化工具,能夠快速部署、隔離 Pgsql 實例,大幅降低主從復制的環(huán)境搭建復雜度,無需擔心不同系統(tǒng)的環(huán)境差異,實現(xiàn)“一次配置,多環(huán)境復用”。本文將以通俗易懂的語言,結(jié)合詳細的示例代碼,從環(huán)境準備、主庫配置、從庫配置、同步驗證、故障排查到進階拓展,完整講解 Docker 下 Pgsql 主從復制的配置全過程,適合新手入門和運維人員實操參考。
一、核心概念與前置說明
在開始配置前,先明確幾個核心概念,避免后續(xù)操作混淆,同時梳理好前置準備工作,確保配置過程順暢。
1.1 主從復制核心原理
Pgsql 主從復制基于 WAL(Write-Ahead Log,預寫日志) 實現(xiàn),核心流程如下:
- 主庫執(zhí)行所有寫操作時,會先將操作記錄寫入 WAL 日志文件;
- 從庫通過專用復制用戶連接主庫,實時獲取主庫的 WAL 日志;
- 從庫將獲取到的 WAL 日志解析并重放,從而同步主庫的數(shù)據(jù),保持主從數(shù)據(jù)一致性。
根據(jù) WAL 日志的同步方式,Pgsql 主從復制主要分為兩種:
- 異步復制(默認):主庫寫入 WAL 日志后,無需等待從庫確認接收,即可返回寫操作成功。優(yōu)點是性能好,缺點是主庫宕機時,可能存在少量未同步的數(shù)據(jù)丟失,適合對數(shù)據(jù)一致性要求不極致的場景。
- 同步復制:主庫寫入 WAL 日志后,必須等待至少一個從庫確認接收并寫入本地磁盤,才能返回寫操作成功。優(yōu)點是數(shù)據(jù)一致性高,無數(shù)據(jù)丟失風險,缺點是主庫寫性能會受網(wǎng)絡延遲影響,適合金融、電商等對數(shù)據(jù)一致性要求極高的場景。
本文將先實現(xiàn)最常用的異步復制,后續(xù)拓展部分會講解如何切換為同步復制。
1.2 前置準備
確保你的環(huán)境滿足以下條件,避免配置過程中出現(xiàn)異常:
- 已安裝 Docker 和 Docker Compose(推薦使用 Docker Compose 管理容器,簡化配置和啟動流程);
- 服務器空閑端口:主庫默認使用 5432 端口,從庫建議使用 5433 端口(可自定義,需確保端口未被占用);
- 網(wǎng)絡通暢:主從容器需在同一網(wǎng)絡下,確保從庫能正常訪問主庫的 5432 端口;
- Pgsql 鏡像:推薦使用官方鏡像(postgres:14,穩(wěn)定版,兼容性好),避免使用第三方鏡像導致配置異常。
驗證 Docker 環(huán)境(終端執(zhí)行以下命令):
# 驗證 Docker 是否啟動 docker --version # 驗證 Docker Compose 是否安裝 docker compose --version
若均能正常顯示版本信息,說明 Docker 環(huán)境就緒。
二、Docker 環(huán)境搭建 Pgsql 主從架構(gòu)(詳細步驟)
本次配置采用“單主單從”架構(gòu)(最基礎、最常用的架構(gòu)),使用 Docker Compose 統(tǒng)一管理主從容器,步驟分為:創(chuàng)建自定義網(wǎng)絡、編寫 Docker Compose 配置、啟動容器、配置主庫、配置從庫、驗證同步,每一步都提供詳細示例代碼,可直接復制實操。
2.1 第一步:創(chuàng)建自定義 Docker 網(wǎng)絡
為了讓主從容器能夠通過容器名直接通信(避免使用 IP 地址,減少配置復雜度),我們先創(chuàng)建一個自定義的 Docker 網(wǎng)絡,主從容器都加入該網(wǎng)絡。
# 創(chuàng)建自定義網(wǎng)絡(網(wǎng)絡名:pg_network,可自定義) docker network create pg_network # 查看網(wǎng)絡是否創(chuàng)建成功 docker network ls
執(zhí)行后,若能在網(wǎng)絡列表中看到 pg\_network,說明網(wǎng)絡創(chuàng)建成功。后續(xù)主從容器將通過該網(wǎng)絡通信,主庫容器名可直接作為“主機名”被從庫訪問。
2.2 第二步:編寫 Docker Compose 配置文件
創(chuàng)建一個工作目錄(如pg\-master\-slave),在目錄下創(chuàng)建 docker\-compose\.yml 文件,該文件將定義主庫(pg-master)和從庫(pg-slave)的容器配置,包括鏡像、端口映射、數(shù)據(jù)掛載、環(huán)境變量等。
示例代碼(可直接復制,注釋已詳細說明每個配置的作用):
version: '3.8' # Docker Compose 版本,兼容大多數(shù) Docker 版本
services:
# 主庫配置(pg-master)
pg-master:
image: postgres:14 # 使用 Pgsql 14 官方鏡像
container_name: pg-master # 容器名,用于從庫連接
restart: always # 容器異常退出時自動重啟
network_mode: pg_network # 加入自定義網(wǎng)絡
ports:
- "5432:5432" # 端口映射:宿主機5432端口 → 容器5432端口(主庫默認端口)
environment:
- POSTGRES_USER=postgres # 數(shù)據(jù)庫超級管理員用戶名
- POSTGRES_PASSWORD=123456 # 數(shù)據(jù)庫超級管理員密碼(生產(chǎn)環(huán)境請修改為復雜密碼)
- POSTGRES_DB=testdb # 初始化默認數(shù)據(jù)庫(可自定義)
volumes:
# 數(shù)據(jù)掛載:將宿主機目錄 ./master/data 掛載到容器 /var/lib/postgresql/data
# 作用:持久化主庫數(shù)據(jù),容器刪除后數(shù)據(jù)不丟失
- ./master/data:/var/lib/postgresql/data
# 配置文件掛載:后續(xù)將主庫配置文件放在 ./master/conf 目錄,掛載到容器對應位置
- ./master/conf:/var/lib/postgresql/data/conf
# 啟動后執(zhí)行的命令(確保配置文件目錄權(quán)限正確)
command: ["sh", "-c", "chmod 700 /var/lib/postgresql/data && exec postgres"]
# 從庫配置(pg-slave)
pg-slave:
image: postgres:14 # 與主庫使用相同版本的鏡像,避免版本兼容問題
container_name: pg-slave # 容器名
restart: always
network_mode: pg_network
ports:
- "5433:5432" # 端口映射:宿主機5433端口 → 容器5432端口(避免與主庫端口沖突)
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=123456 # 與主庫超級管理員密碼一致,方便管理
- POSTGRES_DB=testdb
volumes:
- ./slave/data:/var/lib/postgresql/data
- ./slave/conf:/var/lib/postgresql/data/conf
command: ["sh", "-c", "chmod 700 /var/lib/postgresql/data && exec postgres"]
# 依賴主庫:確保主庫啟動后,再啟動從庫(避免從庫先啟動無法連接主庫)
depends_on:
- pg-master配置說明:
- 數(shù)據(jù)掛載:通過
volumes掛載宿主機目錄,確保容器刪除后,Pgsql 數(shù)據(jù)不會丟失,同時方便后續(xù)修改配置文件; - 網(wǎng)絡配置:
network\_mode: pg\_network表示主從容器都加入自定義網(wǎng)絡,可通過容器名(pg-master、pg-slave)直接通信; - 依賴配置:
depends\_on: \[pg\-master\]確保主庫先啟動,避免從庫啟動時主庫未就緒,導致連接失敗; - 權(quán)限設置:
chmod 700 /var/lib/postgresql/data確保 Pgsql 數(shù)據(jù)目錄權(quán)限正確(Pgsql 要求數(shù)據(jù)目錄權(quán)限為 700,否則無法啟動)。
2.3 第三步:啟動主從容器
在 docker\-compose\.yml 文件所在目錄,執(zhí)行以下命令啟動主從容器:
# 啟動容器(后臺運行) docker compose up -d # 查看容器啟動狀態(tài) docker compose ps
若輸出中 pg\-master 和pg\-slave 的狀態(tài)均為 Up,說明容器啟動成功。若啟動失敗,可通過 docker logs pg\-master 或 docker logs pg\-slave 查看日志,排查錯誤(常見錯誤為端口占用、數(shù)據(jù)目錄權(quán)限不足)。
2.4 第四步:配置主庫(關鍵步驟)
主庫的核心配置的是:開啟 WAL 日志、創(chuàng)建復制專用用戶、配置訪問權(quán)限,允許從庫連接并獲取 WAL 日志。
4.1 進入主庫容器
# 進入主庫容器(容器名:pg-master) docker exec -it pg-master bash
進入容器后,默認處于 / 目錄,接下來需要修改 Pgsql 的核心配置文件 postgresql\.conf 和pg\_hba\.conf(這兩個文件位于容器內(nèi) /var/lib/postgresql/data 目錄下)。
4.2 修改主庫 postgresql.conf 配置
該文件是 Pgsql 的核心配置文件,需開啟 WAL 日志相關配置,支持主從復制。
# 進入 Pgsql 數(shù)據(jù)目錄(配置文件所在目錄) cd /var/lib/postgresql/data # 使用 vi 編輯 postgresql.conf(若容器內(nèi)無 vi,可先執(zhí)行 apt update && apt install -y vim) vi postgresql.conf
找到以下配置項,修改為對應值(若配置項被注釋,先取消注釋;若不存在,直接添加到文件末尾):
# 1. 監(jiān)聽所有IP地址(允許從庫遠程連接) listen_addresses = '*' # 2. 開啟 WAL 日志歸檔(主從復制必需) archive_mode = on # 3. WAL 日志歸檔命令(將 WAL 日志復制到歸檔目錄,這里簡化配置,實際可自定義路徑) archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f' # 4. WAL 日志級別(設置為 replica,支持主從復制) wal_level = replica # 5. 最大 WAL 發(fā)送進程數(shù)(控制從庫最大連接數(shù),建議設置為從庫數(shù)量+1,這里設為5) max_wal_senders = 5 # 6. WAL 日志保留數(shù)量(單位:個,每個 WAL 日志默認16MB,保留64個即1024MB,避免從庫同步時日志被刪除) wal_keep_segments = 64 # 7. WAL 發(fā)送超時時間(從庫連接超時時間,設為60秒) wal_sender_timeout = 60s # 8. 主庫最大連接數(shù)(建議從庫最大連接數(shù)大于主庫,避免從庫連接數(shù)不足) max_connections = 100
配置說明:
archive\_mode = on:開啟 WAL 日志歸檔,確保主庫的 WAL 日志不會被自動清理,以便從庫同步;wal\_level = replica:設置 WAL 日志級別為 replica,支持主從復制所需的日志信息;max\_wal\_senders:控制從庫最大連接數(shù),若有多個從庫,需適當增大該值。
修改完成后,保存并退出 vi(按 Esc,輸入 :wq 回車)。
4.3 創(chuàng)建 WAL 歸檔目錄
由于上面配置了 archive\_command,需要創(chuàng)建對應的歸檔目錄,并設置權(quán)限:
# 在主庫數(shù)據(jù)目錄下創(chuàng)建歸檔目錄 mkdir -p /var/lib/postgresql/data/pg_archive # 設置目錄權(quán)限(與數(shù)據(jù)目錄一致,為700) chmod 700 /var/lib/postgresql/data/pg_archive
4.4 修改主庫 pg_hba.conf 配置
該文件是 Pgsql 的訪問控制配置文件,用于控制哪些 IP、哪些用戶可以訪問數(shù)據(jù)庫,需添加從庫的訪問權(quán)限,允許復制用戶連接。
# 繼續(xù)在數(shù)據(jù)目錄下,編輯 pg_hba.conf vi pg_hba.conf
在文件末尾添加以下內(nèi)容(允許從庫通過復制用戶連接主庫):
# 允許從庫(同一自定義網(wǎng)絡下的所有IP)使用復制用戶連接主庫 # 格式:host 數(shù)據(jù)庫類型 用戶名 允許訪問的IP 認證方式 host replication replica 172.18.0.0/16 trust # 可選:允許宿主機訪問主庫(方便本地測試) host all all 0.0.0.0/0 md5
配置說明:
replication:表示數(shù)據(jù)庫類型為復制(主從復制專用);replica:后續(xù)將創(chuàng)建的復制專用用戶名(可自定義);172\.18\.0\.0/16:自定義 Docker 網(wǎng)絡的網(wǎng)段(可通過docker network inspect pg\_network查看網(wǎng)段,替換為實際網(wǎng)段);trust:認證方式為信任(同一網(wǎng)絡下,無需密碼即可連接,適合測試環(huán)境;生產(chǎn)環(huán)境建議改為md5,需輸入密碼)。
修改完成后,保存并退出 vi。
4.5 創(chuàng)建復制專用用戶
進入 Pgsql 客戶端,創(chuàng)建一個具備 replication(復制)權(quán)限的專用用戶,用于從庫連接主庫同步數(shù)據(jù)(避免使用超級管理員用戶,提升安全性)。
# 進入 Pgsql 客戶端(使用超級管理員用戶 postgres) psql -U postgres # 創(chuàng)建復制專用用戶(用戶名:replica,密碼:replica123,可自定義) CREATE ROLE replica LOGIN REPLICATION ENCRYPTED PASSWORD 'replica123'; # 驗證用戶是否創(chuàng)建成功(查看所有用戶) \du # 退出 Pgsql 客戶端 \q
執(zhí)行 \\du 后,若能看到 replica 用戶,且 Attributes 包含 Replication,說明用戶創(chuàng)建成功。
4.6 重啟主庫容器,使配置生效
主庫配置修改完成后,需重啟容器,讓配置生效:
# 退出主庫容器 exit # 重啟主庫容器 docker restart pg-master # 查看主庫容器日志,確認重啟成功 docker logs pg-master
若日志中出現(xiàn) database system is ready to accept connections,說明主庫重啟成功,主庫配置完成。
2.5 第五步:配置從庫(關鍵步驟)
從庫的核心配置是:初始化主庫數(shù)據(jù)(通過基礎備份同步主庫現(xiàn)有數(shù)據(jù))、配置從庫連接主庫的信息,開啟熱備模式,實現(xiàn)實時同步。
5.1 進入從庫容器
# 進入從庫容器(容器名:pg-slave) docker exec -it pg-slave bash
5.2 清空從庫默認數(shù)據(jù)(關鍵)
從庫需要同步主庫的完整數(shù)據(jù),因此需先清空從庫默認生成的數(shù)據(jù)目錄(避免數(shù)據(jù)沖突):
# 進入從庫數(shù)據(jù)目錄 cd /var/lib/postgresql/data # 清空數(shù)據(jù)目錄(注意:執(zhí)行前確認是從庫容器,避免誤刪主庫數(shù)據(jù)) rm -rf *
5.3 從主庫同步基礎數(shù)據(jù)(使用 pg_basebackup)
pg\_basebackup 是 Pgsql 官方提供的基礎備份工具,可快速將主庫的完整數(shù)據(jù)備份到從庫,為后續(xù)同步奠定基礎。
# 執(zhí)行基礎備份(同步主庫數(shù)據(jù)到從庫) pg_basebackup -h pg-master -U replica -D /var/lib/postgresql/data -X stream -P
命令參數(shù)說明:
\-h pg\-master:主庫的主機名(即主庫容器名,因主從在同一網(wǎng)絡,可直接使用容器名);\-U replica:復制專用用戶名(主庫創(chuàng)建的 replica 用戶);\-D /var/lib/postgresql/data:備份數(shù)據(jù)的存儲目錄(從庫數(shù)據(jù)目錄);\-X stream:流式備份,同步主庫的 WAL 日志,確保備份數(shù)據(jù)的一致性;\-P:顯示備份進度(方便查看備份是否正常進行)。
執(zhí)行命令后,會提示輸入復制用戶(replica)的密碼(即 replica123),輸入后開始備份,等待備份完成(備份速度取決于主庫數(shù)據(jù)量,小型測試庫幾秒即可完成)。
備份完成后,從庫數(shù)據(jù)目錄將包含與主庫完全一致的數(shù)據(jù)。
5.4 配置從庫 recovery.conf 文件(PostgreSQL 12+ 版本)
PostgreSQL 12 及以上版本,recovery\.conf 文件已被整合到 postgresql\.conf 中,無需單獨創(chuàng)建,只需在從庫的 postgresql\.conf 中添加從庫相關配置,或創(chuàng)建 standby\.signal 文件(標記從庫身份)。
我們采用更簡潔的方式,創(chuàng)建 standby\.signal 文件,并修改 postgresql\.conf 配置:
# 1. 在從庫數(shù)據(jù)目錄下,創(chuàng)建 standby.signal 文件(標記該節(jié)點為從庫) touch /var/lib/postgresql/data/standby.signal # 2. 編輯從庫 postgresql.conf 文件 vi /var/lib/postgresql/data/postgresql.conf
找到以下配置項,修改為對應值(重點配置從庫相關參數(shù)):
# 1. 監(jiān)聽所有IP地址 listen_addresses = '*' # 2. 開啟熱備模式(從庫可提供只讀服務,同時同步主庫數(shù)據(jù)) hot_standby = on # 3. 從庫最大連接數(shù)(建議大于主庫,分擔讀壓力) max_connections = 200 # 4. 流復制最大延遲時間(超過該時間,從庫將停止接收 WAL 日志,默認30秒) max_standby_streaming_delay = 30s # 5. 從庫向主庫報告狀態(tài)的間隔時間(默認10秒) wal_receiver_status_interval = 10s # 6. 從庫反饋(若從庫有長時間運行的查詢,通知主庫不要清理相關 WAL 日志) hot_standby_feedback = on # 7. 從庫連接主庫的配置(核心) primary_conninfo = 'host=pg-master port=5432 user=replica password=replica123' # 8. 同步到最新的時間線(確保從庫同步主庫的所有數(shù)據(jù)) recovery_target_timeline = 'latest'
關鍵配置說明:
hot\_standby = on:開啟熱備模式,從庫在同步主庫數(shù)據(jù)的同時,可提供只讀查詢服務,分擔主庫讀壓力;primary\_conninfo:從庫連接主庫的核心配置,包含主庫主機名、端口、復制用戶、密碼,與主庫配置一致;recovery\_target\_timeline = \&\#39;latest\&\#39;:確保從庫同步主庫的最新數(shù)據(jù),即使主庫發(fā)生故障切換,也能同步到最新時間線。
修改完成后,保存并退出 vi。
5.5 重啟從庫容器,使配置生效
# 退出從庫容器 exit # 重啟從庫容器 docker restart pg-slave # 查看從庫容器日志,確認重啟成功 docker logs pg-slave
若日志中出現(xiàn)entering standby mode(進入 standby 模式)和 started streaming WAL from primary(開始從主庫流式同步 WAL 日志),說明從庫配置成功,已開始同步主庫數(shù)據(jù)。
2.6 第六步:驗證主從復制是否成功(核心驗證)
配置完成后,需通過實際操作驗證主從復制是否正常,確保主庫的寫操作能實時同步到從庫。
6.1 驗證主庫復制狀態(tài)
進入主庫容器,查看從庫的連接狀態(tài),確認從庫已成功連接主庫:
# 進入主庫容器 docker exec -it pg-master bash # 進入 Pgsql 客戶端 psql -U postgres # 查看主庫復制狀態(tài)(核心查詢語句) SELECT * FROM pg_stat_replication;
若查詢結(jié)果中包含一條記錄,且 state 字段為 streaming(表示正在流式復制)、usename 為 replica、client\_addr 為從庫的 IP 地址,說明從庫已成功連接主庫,正在同步數(shù)據(jù)。
6.2 驗證數(shù)據(jù)同步(寫主庫,讀從庫)
通過“主庫寫入數(shù)據(jù),從庫讀取數(shù)據(jù)”的方式,驗證同步是否正常:
- 主庫寫入數(shù)據(jù):
# 主庫 Pgsql 客戶端中,執(zhí)行以下 SQL(創(chuàng)建表、插入數(shù)據(jù)) CREATE TABLE test_repl ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); # 插入一條測試數(shù)據(jù) INSERT INTO test_repl (name) VALUES ('Docker Pgsql 主從復制測試'); # 查看主庫數(shù)據(jù) SELECT * FROM test_repl;
- 從庫讀取數(shù)據(jù):
# 打開新的終端,進入從庫容器 docker exec -it pg-slave bash # 進入從庫 Pgsql 客戶端 psql -U postgres # 查看從庫數(shù)據(jù)(確認是否同步主庫數(shù)據(jù)) SELECT * FROM test_repl;`
若從庫能查詢到主庫插入的測試數(shù)據(jù),說明主從復制正常生效。
6.3 驗證從庫只讀模式
從庫開啟熱備模式(hot\_standby = on)后,僅支持只讀操作,無法執(zhí)行寫操作(如插入、修改、刪除),驗證如下:
# 從庫 Pgsql 客戶端中,嘗試插入數(shù)據(jù)
INSERT INTO test_repl (name) VALUES ('從庫寫入測試');
# 預期結(jié)果:報錯,提示從庫處于只讀模式
# 錯誤信息示例:ERROR: cannot execute INSERT in a read-only transaction報錯說明從庫只讀模式生效,符合主從復制的設計(寫操作僅在主庫執(zhí)行,從庫負責讀和備份)。
三、進階拓展:優(yōu)化與故障處理
完成基礎主從復制配置后,結(jié)合實際生產(chǎn)場景,補充一些實用的拓展技巧,包括同步模式切換、故障轉(zhuǎn)移、性能優(yōu)化和常見問題排查,讓主從架構(gòu)更穩(wěn)定、更實用。
3.1 切換為同步復制(提升數(shù)據(jù)一致性)
默認配置為異步復制,若需要更高的數(shù)據(jù)一致性(如金融場景),可修改主庫配置,切換為同步復制:
# 1. 進入主庫容器,編輯 postgresql.conf docker exec -it pg-master bash vi /var/lib/postgresql/data/postgresql.conf # 2. 添加/修改以下配置 # 同步復制模式(on 表示同步,off 表示異步) synchronous_commit = on # 指定同步的從庫名稱(從庫容器名,可多個,用逗號分隔) synchronous_standby_names = 'pg-slave' # 3. 保存退出,重啟主庫容器 exit docker restart pg-master
切換后,主庫執(zhí)行寫操作時,會等待從庫確認接收 WAL 日志并寫入本地磁盤,才會返回成功,確保主從數(shù)據(jù)完全一致。但需注意:若從庫宕機,主庫的寫操作會被阻塞,因此同步復制建議搭配“一主多從”架構(gòu)。
3.2 主庫故障轉(zhuǎn)移(從庫提升為主庫)
當主庫宕機(如容器崩潰、服務器故障)時,需將從庫提升為主庫,保障業(yè)務正常運行,步驟如下:
# 1. 進入從庫容器,停止從庫的 standby 模式(提升為主庫) docker exec -it pg-slave bash psql -U postgres # 執(zhí)行提升命令(停止恢復模式,成為主庫) SELECT pg_promote(); # 驗證:查詢從庫是否已成為主庫(返回 false 表示不是從庫,即為主庫) SELECT pg_is_in_recovery();
提升成功后,從庫將成為新的主庫,可接收寫操作。此時需修改業(yè)務系統(tǒng)的數(shù)據(jù)庫連接地址,將原來的主庫地址(5432端口)改為新主庫地址(5433端口),待原主庫修復后,可將其配置為新主庫的從庫,恢復主從架構(gòu)。
3.3 性能優(yōu)化建議(生產(chǎn)環(huán)境必備)
- 優(yōu)化 WAL 日志配置:將
wal\_buffers設為 16MB(默認較?。?,減少 WAL 日志寫入磁盤的頻率,提升主庫寫性能; - 限制從庫讀壓力:從庫開啟熱備后,可通過
max\_connections限制只讀連接數(shù),避免從庫因讀壓力過大影響同步效率; - 數(shù)據(jù)掛載優(yōu)化:生產(chǎn)環(huán)境建議使用 SSD 磁盤掛載數(shù)據(jù)目錄,提升磁盤 I/O 速度,減少同步延遲;
- 定期清理 WAL 日志:主庫的 WAL 日志歸檔目錄會不斷增大,需定期清理過期日志(如保留最近7天的日志),避免磁盤占滿。
3.4 常見問題排查(避坑指南)
問題1:從庫無法連接主庫,日志提示“connection refused”
原因:主從容器未在同一網(wǎng)絡、主庫端口未開放、主庫 pg\_hba\.conf 配置錯誤。
解決:
- 確認主從容器都加入
pg\_network網(wǎng)絡(docker network inspect pg\_network); - 驗證主庫端口是否開放(
docker exec \-it pg\-master netstat \-tuln \| grep 5432); - 檢查主庫
pg\_hba\.conf中,復制用戶的訪問權(quán)限是否正確(網(wǎng)段是否匹配)。
問題2:從庫同步失敗,日志提示“could not receive data from WAL stream”
原因:主庫 WAL 日志被清理(wal\_keep\_segments 設置過?。?、主從版本不一致、復制用戶權(quán)限不足。
解決:
- 增大主庫
wal\_keep\_segments的值(如設為 128),重啟主庫; - 確保主從使用相同版本的 Pgsql 鏡像(本文均使用 14 版本);
- 驗證復制用戶(replica)是否具備
replication權(quán)限(\\du查看)。
問題3:主庫寫操作正常,從庫數(shù)據(jù)同步延遲過大
原因:網(wǎng)絡延遲過高、從庫性能不足、主庫寫壓力過大。
解決:
- 確保主從服務器在同一局域網(wǎng),減少網(wǎng)絡延遲;
- 提升從庫服務器配置(CPU、內(nèi)存),優(yōu)化從庫
postgresql\.conf配置; - 分擔主庫寫壓力,避免批量寫入操作集中執(zhí)行。
四、總結(jié):Docker + Pgsql 主從復制的核心價值與實踐建議
Docker 下配置 Pgsql 主從復制,核心優(yōu)勢在于“快速部署、環(huán)境隔離、配置靈活”,無需復雜的系統(tǒng)環(huán)境配置,通過 Docker Compose 即可快速搭建主從架構(gòu),大幅降低運維成本。主從復制不僅能解決 Pgsql 單點故障問題,還能實現(xiàn)數(shù)據(jù)備份和讀寫分離,提升系統(tǒng)可用性和并發(fā)處理能力,是生產(chǎn)環(huán)境中 Pgsql 部署的必備方案。
結(jié)合本文的實操步驟,總結(jié)以下實踐建議:
- 測試環(huán)境可使用本文的基礎配置(異步復制、trust 認證),生產(chǎn)環(huán)境需修改為復雜密碼、md5 認證、同步復制(或一主多從),提升安全性和數(shù)據(jù)一致性;
- 定期備份主庫數(shù)據(jù)(除了主從同步,建議每周執(zhí)行一次全量備份),避免極端情況下的數(shù)據(jù)丟失;
- 定期監(jiān)控主從復制狀態(tài)(通過
pg\_stat\_replication和容器日志),及時發(fā)現(xiàn)并解決同步異常; - 若業(yè)務量較大,可搭建“一主多從”架構(gòu),多個從庫分擔讀壓力,進一步提升系統(tǒng)并發(fā)能力。
本文從基礎配置到進階拓展,詳細講解了 Docker 下 Pgsql 主從復制的全過程,所有示例代碼均可直接實操,適合新手和運維人員參考。實際生產(chǎn)環(huán)境中,可根據(jù)業(yè)務需求靈活調(diào)整配置,讓 Pgsql 主從架構(gòu)更好地服務于業(yè)務,保障數(shù)據(jù)安全和系統(tǒng)穩(wěn)定。
到此這篇關于Docker 下配置 Pgsql 主從復制詳細步驟指南的文章就介紹到這了,更多相關Docker Pgsql 主從復制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

