目录
PostgreSQL 流复制(Streaming Replication)是一种常见的主备复制(Master-Slave Replication)模式。它通过将主数据库(Primary)的WAL(Write-Ahead Logging)日志实时传输给备数据库(Standby),来保持主备之间的数据同步。流复制的实现不需要第三方工具,主要通过 PostgreSQL 自身的 WAL 日志传输机制来实现。
1. 流复制的关键参数
在设置 PostgreSQL 流复制时,涉及到一些重要的配置参数。这些参数需要在主数据库和备数据库的配置文件中正确设置,保证复制过程的正常运行。
(1) 主数据库(Primary)的参数
主数据库的配置文件位于 postgresql.conf
中,以下是流复制的关键参数:
-
wal_level
:- 定义WAL日志的记录级别。在流复制中,
wal_level
需要设置为replica
或更高(如logical
)。 - 设置:
wal_level = replica
- 定义WAL日志的记录级别。在流复制中,
-
max_wal_senders
:- 表示主数据库可以启动的 WAL 发送进程的最大数量,这决定了可以同时支持的备数据库数量。
- 设置:
max_wal_senders = 5
-
wal_keep_size
:- 指定 PostgreSQL 在主数据库上保留的 WAL 日志的最小大小,以MB为单位。该参数确保在流复制过程中,不会因为WAL日志过早删除而导致备数据库不同步。
- 设置:
wal_keep_size = 128
-
archive_mode
和archive_command
:- 如果设置了
archive_mode
,PostgreSQL 会将 WAL 日志归档,防止其被删除。通常用于确保在备数据库连接断开时,仍然能通过归档日志来同步数据。 - 设置:
archive_mode = on archive_command = 'cp %p /path_to_archive/%f'
- 如果设置了
-
hot_standby
:- 在备数据库上,
hot_standby
参数启用后,允许在备库上执行只读查询。主数据库上可以不设置该参数,但如果需要备库也支持只读查询,则在备库启用该参数。
hot_standby = on
- 在备数据库上,
(2) 备数据库(Standby)的参数
备库的主要参数也在 postgresql.conf
中配置,以下是关键设置:
-
hot_standby
:- 启用后,备库允许处理只读查询。在流复制中,通常备库设置为只读模式。
- 设置:
hot_standby = on
-
primary_conninfo
:- 备库连接主库所需的参数信息。包括主库的IP地址、端口、用户等。
- 设置:
primary_conninfo = 'host=primary_ip port=5432 user=replication_user password=replication_password'
-
primary_slot_name
:- 如果启用了逻辑复制槽(replication slot),可以在备库上配置
primary_slot_name
来确保 WAL 日志不会过早被删除。 - 设置:
primary_slot_name = 'replication_slot'
- 如果启用了逻辑复制槽(replication slot),可以在备库上配置
(3) 认证与权限设置
为了确保主库和备库之间能够顺利通信,必须在主库的 pg_hba.conf
文件中配置权限,允许备库连接:
# 允许replication用户从备库的IP连接进行流复制
host replication replication_user standby_ip/32 md5
需要创建一个具有复制权限的用户,用于备库连接主库:
CREATE ROLE replication_user REPLICATION LOGIN PASSWORD 'replication_password';
2. 流复制的部署步骤
步骤 1:配置主数据库
-
修改
postgresql.conf
文件,配置关键参数:wal_level = replica max_wal_senders = 5 wal_keep_size = 128 archive_mode = on archive_command = 'cp %p /path_to_archive/%f'
-
修改
pg_hba.conf
文件,允许备库通过流复制连接:host replication replication_user standby_ip/32 md5
-
重启 PostgreSQL 使配置生效:
systemctl restart postgresql
步骤 2:初始化备数据库
- 将主库的数据同步到备库,确保两者的初始数据一致。可以使用
pg_basebackup
工具完成这一步。
pg_basebackup -h primary_ip -D /path_to_standby_data_dir -U replication_user -P -v --wal-method=stream
-D
指定数据目录。-U
指定用于备库的复制用户。--wal-method=stream
用于直接流式复制WAL日志。
-
配置备库的
postgresql.conf
文件:hot_standby = on primary_conninfo = 'host=primary_ip port=5432 user=replication_user password=replication_password'
-
在备库数据目录下创建
recovery.conf
文件(或在 PostgreSQL 12 及以后的版本直接在postgresql.conf
中配置):standby_mode = 'on' primary_conninfo = 'host=primary_ip port=5432 user=replication_user password=replication_password' trigger_file = '/tmp/pg_failover_trigger' # 用于故障转移
-
启动备库:
systemctl start postgresql
步骤 3:验证流复制
- 在主库上检查
pg_stat_replication
视图,确认备库已连接并接收 WAL 日志:
SELECT * FROM pg_stat_replication;
- 可以尝试在主库上执行一些数据插入、更新或删除操作,观察备库是否同步。
步骤 4:故障转移
在备库上可以通过创建 trigger_file
来触发故障转移,使备库成为主库:
touch /tmp/pg_failover_trigger
创建该文件后,备库会脱离流复制模式,并提升为主数据库。
3. 使用复制槽(Replication Slots)
复制槽的作用是防止WAL日志在备库还没完全接收的情况下被删除,确保备库有机会完整地接收WAL日志,特别是在备库与主库连接断开一段时间的情况下。
创建逻辑复制槽
在主库上创建复制槽:
SELECT * FROM pg_create_physical_replication_slot('replication_slot');
然后在备库的 postgresql.conf
文件中指定:
primary_slot_name = 'replication_slot'
归纳
PostgreSQL 的流复制通过 WAL 日志传输和备库实时应用的方式,实现了主备数据库的数据同步。关键配置参数主要包括 wal_level
、max_wal_senders
、primary_conninfo
等,部署时需要配置主库和备库,并通过 pg_basebackup
进行数据同步。流复制可以通过设置复制槽和热备库支持的只读查询来增强数据同步的稳定性和灵活性。
流复制与逻辑复制的对比总结
特性 | 流复制(Streaming Replication) | 逻辑复制(Logical Replication) |
---|---|---|
复制机制 | 基于 WAL 日志的物理级复制 | 基于 SQL 变更的行级复制 |
复制内容 | 整个数据库实例 | 可以选择特定的表或数据 |
备库的用途 | 只读备库(Hot Standby),用于故障转移 | 可以是独立的数据库,允许读写操作 |
延迟 | 低延迟 | 可能会有延迟,特别是在高负载下 |
适用场景 | 高可用性、故障转移 | 数据分发、选择性同步、双向复制 |
故障转移 | 支持快速故障转移 | 不适合用于故障转移 |
双向复制 | 不支持 | 可以实现双向复制(通过逻辑复制槽) |
配置复杂性 | 简单,直接同步整个实例 | 配置灵活,需定义发布-订阅模型 |
选择流复制还是逻辑复制?
- 如果需要 高可用性、主备切换 和 只读备库,则流复制是最佳选择。
- 如果需要 分布式数据库、数据分发、选择性同步 或 双向同步,则逻辑复制更适合。