基于Bash自動化實現(xiàn)PostgreSQL主從復(fù)制的實戰(zhàn)指南
基于 Bash 自動化實現(xiàn) PostgreSQL 主從復(fù)制
支持 Ubuntu / Debian 系統(tǒng)(APT)
適用于 PostgreSQL 16 / 17 最新版本
一、PostgreSQL 主從架構(gòu)原理
PostgreSQL 主從復(fù)制(Streaming Replication)工作流程:
- 主庫寫入數(shù)據(jù)
- 生成 WAL 日志
- 從庫實時拉取 WAL
- 重放日志實現(xiàn)數(shù)據(jù)同步
簡單理解:
主庫負責(zé)寫入
從庫負責(zé)讀取 + 數(shù)據(jù)備份
適合:
- 讀寫分離
- 數(shù)據(jù)容災(zāi)
- 高可用架構(gòu)基礎(chǔ)
二、架構(gòu)流程圖(Mermaid)
flowchart LR
A[Client 寫入] --> B[Primary 主庫]
B --> C[生成 WAL 日志]
C --> D[Replica 從庫]
D --> E[重放 WAL 同步數(shù)據(jù)]
三、自動化部署腳本
#!/bin/bash
PRIMARY_IP="192.168.1.10"
REPLICA_IP="192.168.1.11"
REPL_USER="repl_user"
REPL_PASS="YourStrongPassword"
set -e
echo "=== PostgreSQL 一主一從自動化部署腳本 ==="
echo "1. 安裝并配置為主庫 (Primary)"
echo "2. 安裝并配置為從庫 (Replica)"
read -p "請選擇模式 (1/2): " MODE
sudo apt update
sudo apt install -y postgresql postgresql-contrib
PG_VER=$(psql --version | grep -oE '[0-9]+' | head -1)
DATA_DIR="/var/lib/postgresql/$PG_VER/main"
CONF_DIR="/etc/postgresql/$PG_VER/main"
if [ "$MODE" == "1" ]; then
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/ " $CONF_DIR/postgresql.conf
sudo -u postgres psql -c "CREATE ROLE $REPL_USER WITH REPLICATION LOGIN ENCRYPTED PASSWORD '$REPL_PASS';"
echo "host replication $REPL_USER $REPLICA_IP/32 md5" | sudo tee -a $CONF_DIR/pg_hba.conf
sudo systemctl restart postgresql
elif [ "$MODE" == "2" ]; then
sudo systemctl stop postgresql
sudo rm -rf $DATA_DIR/*
sudo -u postgres PGPASSWORD=$REPL_PASS pg_basebackup \
-h $PRIMARY_IP \
-D $DATA_DIR \
-U $REPL_USER \
-v -P -R \
--slot=replica_slot_1 -C
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/ " $CONF_DIR/postgresql.conf
sudo systemctl start postgresql
else
echo "無效選項"
exit 1
fi
sudo systemctl status postgresql --no-pager
四、腳本邏輯逐步解析
1?? set -e 的作用
set -e
作用:
一旦有命令執(zhí)行失敗,腳本立即退出
防止錯誤被忽略。
2?? 自動識別 PostgreSQL 版本
PG_VER=$(psql --version | grep -oE '[0-9]+' | head -1)
作用:
自動匹配安裝版本路徑,例如:
/var/lib/postgresql/16/main
避免寫死版本號。
3?? 主庫模式做了什么?
? 開啟監(jiān)聽所有 IP
? 創(chuàng)建復(fù)制賬號
? 修改 pg_hba.conf 允許從庫連接
? 重啟數(shù)據(jù)庫
核心:
CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'xxx';
4?? 從庫模式做了什么?
? 停止數(shù)據(jù)庫
? 刪除舊數(shù)據(jù)目錄
? 執(zhí)行 pg_basebackup 拉取數(shù)據(jù)
? 自動生成 standby.signal 文件
五、pg_basebackup 參數(shù)詳解
pg_basebackup -h 主庫IP -D 數(shù)據(jù)目錄 -U 用戶 -v -P -R --slot=replica_slot_1 -C
| 參數(shù) | 作用 |
|---|---|
| -h | 主庫地址 |
| -D | 數(shù)據(jù)存放目錄 |
| -U | 復(fù)制賬號 |
| -v | 顯示詳細日志 |
| -P | 顯示進度條 |
| -R | 自動生成恢復(fù)配置 |
| --slot | 使用復(fù)制槽 |
| -C | 自動創(chuàng)建復(fù)制槽 |
六、生產(chǎn)環(huán)境注意事項
1. 必須放通 5432 端口
檢查:
ufw status
2. 復(fù)制槽風(fēng)險
如果從庫長期宕機:
主庫 WAL 會堆積
可能導(dǎo)致磁盤爆滿。
建議:
定期檢查:
SELECT * FROM pg_replication_slots;
3. 主庫參數(shù)建議調(diào)整
在 postgresql.conf 中增加:
wal_level = replica max_wal_senders = 10 max_replication_slots = 10
七、驗證主從是否成功
主庫執(zhí)行:
SELECT * FROM pg_stat_replication;
看到狀態(tài)為:
streaming
說明正常。
從庫執(zhí)行:
SELECT pg_is_in_recovery();
返回:
t
說明當(dāng)前為從庫狀態(tài)。
總結(jié)
這套腳本適用于:
- 內(nèi)網(wǎng)雙機部署
- 實驗環(huán)境
- 小型生產(chǎn)環(huán)境
以上就是基于Bash自動化實現(xiàn)PostgreSQL主從復(fù)制的實戰(zhàn)指南的詳細內(nèi)容,更多關(guān)于Bash PostgreSQL主從復(fù)制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
查看postgresql數(shù)據(jù)庫用戶系統(tǒng)權(quán)限、對象權(quán)限的方法
這篇文章主要介紹了查看postgresql數(shù)據(jù)庫用戶系統(tǒng)權(quán)限、對象權(quán)限的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
navicat連接postgresql、人大金倉等數(shù)據(jù)庫報錯解決辦法
在使用Navicat操作數(shù)據(jù)庫時,遇到數(shù)據(jù)報錯是一個常見的問題,這類問題可能涉及多個方面,下面這篇文章主要給大家介紹了關(guān)于navicat連接postgresql、人大金倉等數(shù)據(jù)庫報錯的解決辦法,需要的朋友可以參考下2024-08-08
postgresql 賦權(quán)語句 grant的正確使用說明
這篇文章主要介紹了postgresql 賦權(quán)語句 grant的正確使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
postgresql 中的幾個 timeout參數(shù) 用法說明
這篇文章主要介紹了postgresql中的幾個timeout參數(shù)用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
在Ubuntu中安裝Postgresql數(shù)據(jù)庫的步驟詳解
PostgreSQL 是一款強大的,開源的,對象關(guān)系型數(shù)據(jù)庫系統(tǒng)。它支持所有的主流操作系統(tǒng),包括 Linux、Unix(AIX、BSD、HP-UX,SGI IRIX、Mac OS、Solaris、Tru64) 以及 Windows 操作系統(tǒng)。本文給大家介紹了在Ubuntu中安裝Postgresql數(shù)據(jù)庫的步驟,需要的朋友可以參考下。2017-09-09
postgreSQL數(shù)據(jù)庫默認用戶postgres常用命令分享
這篇文章主要介紹了postgreSQL數(shù)據(jù)庫默認用戶postgres常用命令分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

