搭建PostgreSQL主从架构
简介
PostgreSQL是一个开源对象关系型数据库管理系统,并侧重于可扩展性和标准的符合性。PostgreSQL面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore),支持GIS地理信息处理,在可靠性、数据完整性方面有良好声誉,适用于互联网网站、位置应用系统、复杂数据对象处理等应用场景。
本文指导您使用华为云弹性云服务器搭建PostgreSQL主从架构。
前提条件
- 已创建两台弹性云服务器,分别作为主节点和从节点。创建过程请参考自定义购买ECS。
本示例使用的操作系统为Ubuntu 20.04 64位、Debian 12.0.0 64位。
主节点IP示例:192.168.1.10
从节点IP示例:192.168.1.11
- 弹性云服务器所在安全组添加了如下表所示的安全组规则,具体步骤参见为安全组添加安全组规则。
表1 安全组规则 方向
优先级
策略
类型
协议端口
源地址
入方向
1
允许
IPv4
TCP: 22
0.0.0.0/0
入方向
1
允许
IPv4
TCP: 5432
0.0.0.0/0
步骤一:配置PostgreSQL主节点
请根据当前的操作系统,查看并执行对应的操作步骤。
- 执行以下命令,添加华为云加速的PostgreSQL官方源。
echo "deb [signed-by=/etc/apt/trusted.gpg.d/postgresql.gpg] https://mirrors.huaweicloud.com/postgresql/repos/apt focal-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
- 执行以下命令,导入PostgreSQL官方签名密钥。
wget -qO - https://mirrors.huaweicloud.com/postgresql/repos/apt/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
- 执行以下命令,更新源并安装PostgreSQL 14。
sudo apt update sudo apt install -y postgresql-14 postgresql-client-14 postgresql-contrib-14
- 执行以下命令,启动PostgreSQL并设置开机自启。
sudo systemctl enable --now postgresql@14-main
- 执行以下命令,验证PostgreSQL的安装版本。
psql --version
回显如下类似信息,表示安装成功。

- 依次执行以下命令,编辑/etc/postgresql/14/main/postgresql.conf文件。
# 允许所有地址访问 sudo sed -i "s/^#listen_addresses =.*/listen_addresses = '*'/" /etc/postgresql/14/main/postgresql.conf # 开启WAL复制模式 sudo sed -i "s/^#wal_level =.*/wal_level = replica/" /etc/postgresql/14/main/postgresql.conf # 最大WAL发送进程 sudo sed -i "s/^#max_wal_senders =.*/max_wal_senders = 5/" /etc/postgresql/14/main/postgresql.conf # 开启复制槽 sudo sed -i "s/^#max_replication_slots =.*/max_replication_slots = 5/" /etc/postgresql/14/main/postgresql.conf # WAL日志保留大小 sudo sed -i "s/^#wal_keep_size =.*/wal_keep_size = 128MB/" /etc/postgresql/14/main/postgresql.conf # 开启WAL归档 sudo sed -i "s/^#archive_mode =.*/archive_mode = on/" /etc/postgresql/14/main/postgresql.conf # 归档路径配置 sudo sed -i "s|^#archive_command = ''|archive_command = 'cp %p /var/lib/postgresql/14/main/wal_archive/%f'|" /etc/postgresql/14/main/postgresql.conf # 创建WAL归档目录并授权 sudo mkdir -p /var/lib/postgresql/14/main/wal_archive sudo chown postgres:postgres /var/lib/postgresql/14/main/wal_archive sudo chmod 700 /var/lib/postgresql/14/main/wal_archive
- 执行以下命令,修改/var/lib/pgsql/11/data/pg_hba.conf配置文件。
# 末尾添加从节点IP复制权限,采用scram-sha-256加密(Ubuntu20.04默认认证方式) echo "host replication replica_user 192.168.1.11/32 scram-sha-256" | sudo tee -a /etc/postgresql/14/main/pg_hba.conf
- 执行以下命令,创建账号并授权。
# 创建复制用户 sudo -u postgres psql -c "CREATE ROLE replica_user WITH REPLICATION LOGIN PASSWORD '密码';" # 创建物理复制槽(防止WAL日志被清理,断线自动追数) sudo -u postgres psql -c "SELECT pg_create_physical_replication_slot('pg_slot01');" - 执行以下命令,重启服务。
sudo systemctl restart postgresql@14-main sudo systemctl status postgresql@14-main
- 执行以下命令,更新源并安装PostgreSQL 15。
apt update apt install -y postgresql postgresql-contrib
- 执行以下命令,启动PostgreSQL并设置开机自启。
systemctl enable postgresql systemctl start postgresql
- 执行以下命令,验证PostgreSQL的安装版本。
psql --version
回显如下类似信息,表示安装成功。

- 依次执行以下命令,编辑/etc/postgresql/15/main/postgresql.conf文件。
# 主节点配置 sed -i "s/^#listen_addresses =.*/listen_addresses = '*'/" /etc/postgresql/15/main/postgresql.conf sed -i "s/^wal_level =.*/wal_level = replica/" /etc/postgresql/15/main/postgresql.conf sed -i "s/^max_wal_senders =.*/max_wal_senders = 10/" /etc/postgresql/15/main/postgresql.conf sed -i "s/^max_replication_slots =.*/max_replication_slots = 10/" /etc/postgresql/15/main/postgresql.conf
- 执行以下命令,修改/etc/postgresql/15/main/pg_hba.conf配置文件。
# 允许从库复制 echo "host replication replica_user 0.0.0.0/0 trust" >> /etc/postgresql/15/main/pg_hba.conf
- 执行以下命令,创建账号并授权。
sudo -u postgres psql -c "CREATE ROLE replica_user WITH REPLICATION LOGIN;"
- 执行以下命令,重启服务。
systemctl restart postgresql
步骤二:配置PostgreSQL从节点
请根据当前的操作系统,查看并执行对应的操作步骤。
- 执行以下命令,添加华为云加速的PostgreSQL官方源。
echo "deb [signed-by=/etc/apt/trusted.gpg.d/postgresql.gpg] https://mirrors.huaweicloud.com/postgresql/repos/apt focal-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
- 执行以下命令,导入PostgreSQL官方签名密钥。
wget -qO - https://mirrors.huaweicloud.com/postgresql/repos/apt/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
- 执行以下命令,更新源并安装PostgreSQL 14。
sudo apt update sudo apt install -y postgresql-14 postgresql-client-14 postgresql-contrib-14
- 执行以下命令,启动PostgreSQL并设置开机自启。
sudo systemctl enable --now postgresql@14-main
- 执行以下命令,验证PostgreSQL的安装版本。
psql --version
回显如下类似信息,表示安装成功。

- 执行以下命令,停止从库服务,清空数据目录。
sudo systemctl stop postgresql@14-main sudo rm -rf /var/lib/postgresql/14/main/*
- 执行以下命令,配置免密认证 .pgpass。
echo "192.168.1.10:5432:replication:replica_user:密码" | sudo tee /var/lib/postgresql/.pgpass sudo chown postgres:postgres /var/lib/postgresql/.pgpass sudo chmod 600 /var/lib/postgresql/.pgpass
- 执行以下命令,全量克隆主库数据。
sudo -u postgres pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/14/main/ \ -U replica_user -P -v --wal-method=stream
- 执行以下命令,配置备库参数和备库标识文件。
# 开启热备只读 sudo sed -i "s/^#hot_standby =.*/hot_standby = on/" /etc/postgresql/14/main/postgresql.conf # 配置主库连接信息+绑定复制槽 echo "primary_conninfo = 'host=192.168.1.10 port=5432 user=replica_user password=Pg@Huawei@123'" | sudo tee -a /etc/postgresql/14/main/postgresql.conf echo "primary_slot_name = 'pg_slot01'" | sudo tee -a /etc/postgresql/14/main/postgresql.conf # 创建备库标识文件 standby.signal(PG12+新版,替代旧版recovery.conf) sudo touch /var/lib/postgresql/14/main/standby.signal sudo chown postgres:postgres /var/lib/postgresql/14/main/standby.signal
- 执行以下命令,启动从库服务。
sudo systemctl enable --now postgresql@14-main sudo systemctl status postgresql@14-main
- 执行以下命令,更新源并安装PostgreSQL 15。
apt update apt install -y postgresql postgresql-contrib
- 执行以下命令,启动PostgreSQL并设置开机自启。
systemctl enable postgresql systemctl start postgresql
- 执行以下命令,验证PostgreSQL的安装版本。
psql --version
回显如下类似信息,表示安装成功。

- 执行以下命令,停止从库服务,清空数据目录。
systemctl stop postgresql rm -rf /var/lib/postgresql/15/main/*
- 执行以下命令,全量克隆主库数据。
mkdir -p /var/lib/postgresql/15/main chown postgres:postgres /var/lib/postgresql/15/main chmod 700 /var/lib/postgresql/15/main cd /tmp && sudo -u postgres pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/15/main -U replica_user -P -X stream
- 执行以下命令,配置备库参数和备库标识文件。
# 备库配置 echo "primary_conninfo = 'host=192.168.1.10 port=5432 user=replica_user'" >> /etc/postgresql/15/main/postgresql.conf echo "hot_standby = on" >> /etc/postgresql/15/main/postgresql.conf # 备库标识 touch /var/lib/postgresql/15/main/standby.signal chown postgres:postgres /var/lib/postgresql/15/main/standby.signal
- 执行以下命令,启动从库服务。
systemctl start postgresql
步骤三:验证部署完成
请根据当前的操作系统,查看并执行对应的操作步骤。
- 执行以下命令,在主节点查看复制状态。
sudo -u postgres psql -c "SELECT pid,usename,application_name,state,sync_state FROM pg_stat_replication;"
- 执行以下命令,在从节点查看WAL接收状态。
sudo -u postgres psql -c "SELECT * FROM pg_stat_wal_receiver;" sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
- 数据同步测试。
- 在主节点上创建一个测试表并插入数据。
sudo -u postgres psql -c "CREATE TABLE test_huawei(id INT PRIMARY KEY, info TEXT);" sudo -u postgres psql -c "INSERT INTO test_huawei VALUES(1,'华为云Ubuntu20.04 PG主从');"
- 在从节点上查询该表,验证数据是否已同步。
sudo -u postgres psql -c "SELECT * FROM test_huawei;"
如果能查询到已插入的数据,则表示主从复制已成功建立。
- 在主节点上创建一个测试表并插入数据。
- 执行以下命令,主节点查看复制状态。
sudo -u postgres psql -c "SELECT pid, usename, state, sync_state FROM pg_stat_replication;"
- 执行以下命令,从节点查看WAL接收状态
sudo -u postgres psql -c "SELECT * FROM pg_stat_wal_receiver;" sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
- 数据同步测试。
- 在主节点上创建一个测试表并插入数据。
sudo -u postgres psql -c "CREATE TABLE test_sync(id int);" sudo -u postgres psql -c "INSERT INTO test_sync VALUES(1);"
- 在从节点上查询该表,验证数据是否已同步。
sudo -u postgres psql -c "SELECT * FROM test_sync;"
如果能查询到已插入的数据,则表示主从复制已成功建立。
- 在主节点上创建一个测试表并插入数据。