PostgreSQL主从复制是一种常见的数据库高可用架构,通过将主节点的数据同步到从节点,可以实现数据冗余、负载均衡和故障恢复等功能。本文将详细介绍如何搭建PostgreSQL的主从复制环境,包括配置步骤、关键参数解析以及可能遇到的问题及解决方案。
在PostgreSQL中,主从复制通常指的是流复制(Streaming Replication)。主节点(Primary)负责处理所有的写操作,并将这些更改以WAL(Write-Ahead Logging)的形式发送给从节点(Standby)。从节点会应用这些日志,从而保持与主节点的数据一致。
确保两台服务器上均已安装PostgreSQL。可以通过以下命令安装:
sudo apt update
sudo apt install postgresql postgresql-contrib
确保主节点和从节点之间可以通过IP地址互相访问。例如,主节点IP为192.168.1.100
,从节点IP为192.168.1.101
。
postgresql.conf
编辑主节点的/etc/postgresql/14/main/postgresql.conf
文件,添加或修改以下参数:
listen_addresses = '*' # 允许外部连接
wal_level = replica # 设置WAL级别为replica
max_wal_senders = 3 # 最大并发复制连接数
wal_keep_size = 1GB # 保留的WAL文件大小
archive_mode = on # 开启归档模式
archive_command = 'cp %p /var/lib/postgresql/wals/%f' # 归档命令
pg_hba.conf
编辑主节点的/etc/postgresql/14/main/pg_hba.conf
文件,允许从节点进行复制连接:
host replication all 192.168.1.101/32 md5
登录PostgreSQL并创建一个用于复制的用户:
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';
sudo systemctl stop postgresql
从主节点备份数据到从节点:
pg_basebackup -h 192.168.1.100 -U replicator -D /var/lib/postgresql/14/main -P --xlog-method=stream
recovery.conf
在从节点的/var/lib/postgresql/14/main
目录下创建standby.signal
文件,并编写recovery.conf
内容(PostgreSQL 12及以上版本无需recovery.conf
,直接使用standby.signal
):
primary_conninfo = 'host=192.168.1.100 port=5432 user=replicator password=your_password'
sudo systemctl start postgresql
CREATE TABLE test(id serial, data text);
INSERT INTO test(data) VALUES('Hello, World!');
登录从节点并查询表数据:
SELECT * FROM test;
如果数据一致,则说明主从复制成功。
如果从节点无法追上主节点,可能需要重新初始化从节点数据目录。
检查主节点的防火墙设置,确保端口5432开放。
max_wal_senders
和wal_keep_size
参数。可以配置多级复制架构,即从节点再作为其他从节点的主节点,适用于大规模分布式场景。
graph TD; A[主节点] --> B[从节点1]; A --> C[从节点2]; B --> D[从节点3];