PostgreSQL——流复制


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
      
  • max_wal_senders

    • 表示主数据库可以启动的 WAL 发送进程的最大数量,这决定了可以同时支持的备数据库数量。
    • 设置:
      max_wal_senders = 5
      
  • wal_keep_size

    • 指定 PostgreSQL 在主数据库上保留的 WAL 日志的最小大小,以MB为单位。该参数确保在流复制过程中,不会因为WAL日志过早删除而导致备数据库不同步。
    • 设置:
      wal_keep_size = 128
      
  • archive_modearchive_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'
      
(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:配置主数据库
  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'
    
  2. 修改 pg_hba.conf 文件,允许备库通过流复制连接:

    host replication replication_user standby_ip/32 md5
    
  3. 重启 PostgreSQL 使配置生效:

    systemctl restart postgresql
    
步骤 2:初始化备数据库
  1. 将主库的数据同步到备库,确保两者的初始数据一致。可以使用 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日志。
  1. 配置备库的 postgresql.conf 文件:

    hot_standby = on
    primary_conninfo = 'host=primary_ip port=5432 user=replication_user password=replication_password'
    
  2. 在备库数据目录下创建 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'  # 用于故障转移
    
  3. 启动备库:

systemctl start postgresql
步骤 3:验证流复制
  1. 在主库上检查 pg_stat_replication 视图,确认备库已连接并接收 WAL 日志:
SELECT * FROM pg_stat_replication;
  1. 可以尝试在主库上执行一些数据插入、更新或删除操作,观察备库是否同步。
步骤 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_levelmax_wal_sendersprimary_conninfo 等,部署时需要配置主库和备库,并通过 pg_basebackup 进行数据同步。流复制可以通过设置复制槽和热备库支持的只读查询来增强数据同步的稳定性和灵活性。

流复制与逻辑复制的对比总结

特性流复制(Streaming Replication)逻辑复制(Logical Replication)
复制机制基于 WAL 日志的物理级复制基于 SQL 变更的行级复制
复制内容整个数据库实例可以选择特定的表或数据
备库的用途只读备库(Hot Standby),用于故障转移可以是独立的数据库,允许读写操作
延迟低延迟可能会有延迟,特别是在高负载下
适用场景高可用性、故障转移数据分发、选择性同步、双向复制
故障转移支持快速故障转移不适合用于故障转移
双向复制不支持可以实现双向复制(通过逻辑复制槽)
配置复杂性简单,直接同步整个实例配置灵活,需定义发布-订阅模型

选择流复制还是逻辑复制?

  • 如果需要 高可用性、主备切换只读备库,则流复制是最佳选择。
  • 如果需要 分布式数据库、数据分发、选择性同步双向同步,则逻辑复制更适合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值