PostgreSQL流复制是一种高可用性和灾难恢复的解决方案,它通过主从架构将主数据库(Primary)上的事务日志(WAL,Write-Ahead Logging)实时传输到备数据库(Standby),从而实现数据的同步和备份。以下是配置PostgreSQL流复制的详细步骤解析。
在开始配置之前,确保以下条件已满足:
postgresql.conf
和 pg_hba.conf
postgresql.conf
和 recovery.conf
主库负责生成WAL日志并将其发送给备库。
postgresql.conf
编辑主库的postgresql.conf
文件,添加或修改以下参数:
wal_level = replica # 设置WAL级别为replica(支持流复制)
max_wal_senders = 3 # 允许的最大并发WAL发送进程数
wal_keep_segments = 32 # 保留的WAL段数量(根据实际需求调整)
archive_mode = on # 开启归档模式(可选)
archive_command = 'cd .' # 归档命令(可选)
hot_standby = on # 允许热备查询
pg_hba.conf
为了让备库能够连接到主库,需要在pg_hba.conf
中添加如下记录:
host replication replicator <standby_ip>/32 md5
其中:
replication
表示允许进行复制连接。replicator
是用于复制的用户名。<standby_ip>
是备库的IP地址。在主库上创建一个专门用于复制的用户:
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';
备库接收来自主库的WAL日志,并应用这些日志以保持与主库的数据一致性。
使用pg_basebackup
工具从主库复制数据到备库:
pg_basebackup -h <primary_ip> -D /path/to/standby/data -U replicator -v -P --xlog-method=stream
说明:
-h
指定主库IP地址。-D
指定备库数据目录。-U
指定复制用户。--xlog-method=stream
表示通过流复制获取WAL日志。recovery.conf
在备库的数据目录下创建recovery.conf
文件,内容如下:
standby_mode = 'on'
primary_conninfo = 'host=<primary_ip> port=5432 user=replicator password=your_password'
trigger_file = '/path/to/trigger_file'
restore_command = 'cp /path/to/archive/%f %p'
说明:
primary_conninfo
是主库的连接信息。trigger_file
用于触发备库切换为主库(仅适用于手动故障转移)。restore_command
是从归档中恢复WAL文件的命令(如果启用了归档模式)。确保主库正常启动:
pg_ctl start -D /path/to/primary/data
启动备库后,它会自动连接到主库并开始同步数据:
pg_ctl start -D /path/to/standby/data
在主库上执行以下SQL查询,检查WAL发送进程的状态:
SELECT * FROM pg_stat_replication;
输出结果应显示备库的连接信息。
在备库上执行以下SQL查询,检查WAL接收进程的状态:
SELECT * FROM pg_stat_wal_receiver;
输出结果应显示主库的连接信息以及同步延迟。
如果主库发生故障,可以通过创建trigger_file
文件将备库提升为主库。例如:
touch /path/to/trigger_file
备库检测到该文件后会自动切换为主库。