基于Bash自动化实现PostgreSQL主从复制的实战指南

来源:这里教程网 时间:2026-03-06 09:12:19 作者:
一、PostgreSQL 主从架构原理二、架构流程图(Mermaid)三、自动化部署脚本四、脚本逻辑逐步解析1️⃣ set -e 的作用2️⃣ 自动识别 PostgreSQL 版本3️⃣ 主库模式做了什么?4️⃣ 从库模式做了什么?五、pg_basebackup 参数详解六、生产环境注意事项1. 必须放通 5432 端口2. 复制槽风险3. 主库参数建议调整主库执行:从库执行:七、验证主从是否成功总结

基于 Bash 自动化实现 PostgreSQL 主从复制
支持 Ubuntu / Debian 系统(APT)
适用于 PostgreSQL 16 / 17 最新版本

一、PostgreSQL 主从架构原理

PostgreSQL 主从复制(Streaming Replication)工作流程:

    主库写入数据生成 WAL 日志从库实时拉取 WAL重放日志实现数据同步

简单理解:

主库负责写入
从库负责读取 + 数据备份

适合:

读写分离数据容灾高可用架构基础

二、架构流程图(Mermaid)

flowchart LR A[Client 写入] --> B[Primary 主库] B --> C[生成 WAL 日志] C --> D[Replica 从库] D --> E[重放 WAL 同步数据]

三、自动化部署脚本

#!/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

作用:

一旦有命令执行失败,脚本立即退出

防止错误被忽略。

2️⃣ 自动识别 PostgreSQL 版本

PG_VER=$(psql --version | grep -oE '[0-9]+' | head -1)

作用:

自动匹配安装版本路径,例如:

/var/lib/postgresql/16/main

避免写死版本号。

3️⃣ 主库模式做了什么?

✔ 开启监听所有 IP
✔ 创建复制账号
✔ 修改 pg_hba.conf 允许从库连接
✔ 重启数据库

核心:

CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'xxx';

4️⃣ 从库模式做了什么?

✔ 停止数据库
✔ 删除旧数据目录
✔ 执行 pg_basebackup 拉取数据
✔ 自动生成 standby.signal 文件

五、pg_basebackup 参数详解

pg_basebackup -h 主库IP -D 数据目录 -U 用户 -v -P -R --slot=replica_slot_1 -C 参数作用-h主库地址-D数据存放目录-U复制账号-v显示详细日志-P显示进度条-R自动生成恢复配置--slot使用复制槽-C自动创建复制槽

六、生产环境注意事项

1. 必须放通 5432 端口

检查:

ufw status

2. 复制槽风险

如果从库长期宕机:

主库 WAL 会堆积

可能导致磁盘爆满。

建议:

定期检查:

SELECT * FROM pg_replication_slots;

3. 主库参数建议调整

在 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

说明当前为从库状态。

总结

这套脚本适用于:

内网双机部署实验环境小型生产环境

以上就是基于Bash自动化实现PostgreSQL主从复制的实战指南的详细内容,更多关于Bash PostgreSQL主从复制的资料请关注其它相关文章!

相关推荐

热文推荐