一、PostgreSQL 主从架构原理 PostgreSQL 主从复制(Streaming Replication)的工作流程其实很直白:主库写入数据,生成WAL日志;从库实时拉取这些WAL日志,然后重放日志完成数据同步。简单说就是主库负责写,从库负责读和备份,典型的读写分离场景。这套架构不仅能做数
PostgreSQL 主从复制(Streaming Replication)的工作流程其实很直白:主库写入数据,生成WAL日志;从库实时拉取这些WAL日志,然后重放日志完成数据同步。简单说就是主库负责写,从库负责读和备份,典型的读写分离场景。这套架构不仅能做数据容灾,也是高可用架构的基础。
换个角度看,整个过程就像流水线作业:主库是生产端,从库是消费端,WAL日志就是传送带上的货物。只要传送带不断,数据就能保持同步。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
flowchart LR
A[Client 写入] --> B[Primary 主库]
B --> C[生成 WAL 日志]
C --> D[Replica 从库]
D --> E[重放 WAL 同步数据]

支持 Ubuntu / Debian 系统(APT),适用于 PostgreSQL 16 / 17 最新版本。
#!/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
set -e
这个命令的作用是:一旦有命令执行失败,脚本立即退出,防止错误被忽略。生产环境里这一步非常重要,避免因为某个步骤失败导致后面操作在错误状态下进行。
PG_VER=$(psql --version | grep -oE '[0-9]+' | head -1)
自动匹配安装版本的路径,比如 /var/lib/postgresql/16/main,这样就不用把版本号写死在脚本里,后续升级也更方便。
核心就是那条SQL:
CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'xxx';
pg_basebackup -h 主库IP -D 数据目录 -U 用户 -v -P -R --slot=replica_slot_1 -C
| 参数 | 作用 |
|---|---|
| -h | 主库地址 |
| -D | 数据存放目录 |
| -U | 复制账号 |
| -v | 显示详细日志 |
| -P | 显示进度条 |
| -R | 自动生成恢复配置 |
| --slot | 使用复制槽 |
| -C | 自动创建复制槽 |
检查:
ufw status
如果从库长期宕机,主库的 WAL 会堆积,可能导致磁盘爆满。建议定期检查:
SELECT * FROM pg_replication_slots;
在 postgresql.conf 中增加:
wal_level = replica max_wal_senders = 10 max_replication_slots = 10
SELECT * FROM pg_stat_replication;
看到状态为 streaming,说明正常。
SELECT pg_is_in_recovery();
返回 t,说明当前为从库状态。
这套脚本适用于内网双机部署、实验环境,小型生产环境也没问题。核心思路就是把主从复制的配置步骤自动化,减少人为操作失误。从架构原理到参数细节,再到验证方法,一整套流程都覆盖了。实际部署时,记得根据网络和安全要求调整IP和密码,复制槽和WAL清理策略也要提前规划好。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述