PostgreSQL主从复制搭建教程

2025-06发布10次浏览

PostgreSQL主从复制是一种常见的数据库高可用架构,通过将主节点的数据同步到从节点,可以实现数据冗余、负载均衡和故障恢复等功能。本文将详细介绍如何搭建PostgreSQL的主从复制环境,包括配置步骤、关键参数解析以及可能遇到的问题及解决方案。


1. 主从复制的基本概念

在PostgreSQL中,主从复制通常指的是流复制(Streaming Replication)。主节点(Primary)负责处理所有的写操作,并将这些更改以WAL(Write-Ahead Logging)的形式发送给从节点(Standby)。从节点会应用这些日志,从而保持与主节点的数据一致。

  • 主节点(Primary):负责写入操作,并生成WAL日志。
  • 从节点(Standby):只读节点,通过应用WAL日志保持与主节点同步。
  • 同步模式:支持异步、半同步和同步三种模式。

2. 环境准备

2.1 系统要求

  • 操作系统:Linux(如Ubuntu、CentOS)
  • PostgreSQL版本:建议使用14及以上版本(本文以PostgreSQL 14为例)

2.2 软件安装

确保两台服务器上均已安装PostgreSQL。可以通过以下命令安装:

sudo apt update
sudo apt install postgresql postgresql-contrib

2.3 配置网络连接

确保主节点和从节点之间可以通过IP地址互相访问。例如,主节点IP为192.168.1.100,从节点IP为192.168.1.101


3. 配置主节点

3.1 修改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'  # 归档命令

3.2 修改pg_hba.conf

编辑主节点的/etc/postgresql/14/main/pg_hba.conf文件,允许从节点进行复制连接:

host    replication     all             192.168.1.101/32        md5

3.3 创建复制用户

登录PostgreSQL并创建一个用于复制的用户:

CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';

4. 配置从节点

4.1 停止从节点服务

sudo systemctl stop postgresql

4.2 初始化从节点数据目录

从主节点备份数据到从节点:

pg_basebackup -h 192.168.1.100 -U replicator -D /var/lib/postgresql/14/main -P --xlog-method=stream

4.3 创建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'

4.4 启动从节点服务

sudo systemctl start postgresql

5. 测试主从复制

5.1 在主节点插入数据

CREATE TABLE test(id serial, data text);
INSERT INTO test(data) VALUES('Hello, World!');

5.2 查看从节点数据

登录从节点并查询表数据:

SELECT * FROM test;

如果数据一致,则说明主从复制成功。


6. 故障处理

6.1 WAL日志丢失

如果从节点无法追上主节点,可能需要重新初始化从节点数据目录。

6.2 连接问题

检查主节点的防火墙设置,确保端口5432开放。

6.3 性能优化

  • 调整max_wal_senderswal_keep_size参数。
  • 使用更快的存储介质(如SSD)存储WAL日志。

7. 扩展讨论

7.1 同步模式的选择

  • 异步复制:延迟较低,但可能存在数据丢失风险。
  • 半同步复制:至少一个从节点确认后提交事务,兼顾性能和可靠性。
  • 同步复制:所有从节点确认后提交事务,可靠性最高但性能最低。

7.2 多级复制

可以配置多级复制架构,即从节点再作为其他从节点的主节点,适用于大规模分布式场景。

graph TD;
    A[主节点] --> B[从节点1];
    A --> C[从节点2];
    B --> D[从节点3];