同步传输

来自 PostgreSQL 维基
跳转到导航跳转到搜索

同步传输负责维护主服务器和备用服务器之间的文件系统级一致性。在流式复制中,当发生崩溃时,主服务器上存在的 WAL 文件可能无法到达备用服务器。因此,在故障转移时,需要从新主服务器上获取新的备份到新的备用服务器上。

对于大型数据库,获取新的备份可能需要很长时间。在许多情况下,如此长的恢复时间是不可接受的,可能会破坏服务线协议的恢复时间。

通过使用 `synchronous_transfer` 参数,用户可以配置故障回退安全备用,以避免这种情况。

用法

用户概述

`synchronous_transfer` 指定主服务器在将相应的 WAL 记录复制到备用服务器之前,是否要等待数据页修改和/或事务提交。

`synchronous_transfer` 参数的有效值为 `all`、`data_flush` 和 `commit`。

  • commit
    • 此值指定事务提交等待事务的 WAL 记录复制到备用服务器。此设置与将 `synchronous_commit` 设置为 `on` 相同。
    • 如果不需要防止 WAL 不一致,请将 `synchronous_transfer` 设置为此值。
    • 备用服务器将不会表现为故障回退安全备用。
  • data_flush
    • 此值指定主服务器在将相应的 WAL 记录复制到备用服务器之前要等待数据页修改,但事务提交将不等待事务的 WAL 记录复制到备用服务器。
    • 备用服务器将不会表现为异步故障回退安全备用。
  • all
    • 此值指定主服务器在将相应的 WAL 记录复制到备用服务器之前,要等待数据页修改和事务提交。
    • 备用服务器将不会表现为同步故障回退安全备用。

故障回退安全备用类型

使用 `synchronous_transfer` 参数,现在可以使用两种新的备用设置类型:异步故障回退安全备用和同步故障回退安全备用。因此,有 4 种不同的方式可以配置备用服务器。

  • 同步故障回退安全备用
    • `synchronous_standby_names = <服务器名称>`
    • `synchronous_transfer = all`
  • 异步故障回退安全备用
    • `synchronous_standby_names = <服务器名称>`
    • `synchronous_transfer = data_flush`
  • 纯同步备用
    • `synchronous_standby_names = <服务器名称>`
    • `synchronous_transfer = commit`
  • 纯异步备用
    • 不需要任何设置

如何使用

  • 1.第一步是设置流式复制,以下链接是关于此的:流式复制
  • 2.在主服务器上将 `synchronous_transfer` 参数设置为 `all`
$ $EDITOER postgresql.conf

synchronous_transfer = all

(以上设置将配置同步故障回退安全备用,要配置异步故障回退安全备用,请将 `synchronous_transfer` 参数设置为 `data_flush`)

就是这样!故障回退安全备用的配置已完成。

您可以通过以下步骤测试故障回退安全备用的设置

  • 3.在主服务器上运行生成大量 WAL 的事务,并使主服务器崩溃。
#For example : Kill the postmaster process of the primary server which is 'AAA' server, whose pid is 16764.
$ ps x | grep postgres
16764 pts/4    S      0:00 /home/postgres/pgsql/AAA/bin/postgres -D data
16768 ?        Ss     0:00 postgres: checkpointer process
16769 ?        Ss     0:00 postgres: writer process
16770 ?        Ss     0:00 postgres: wal writer process
16771 ?        Ss     0:00 postgres: autovacuum launcher process
16772 ?        Ss     0:00 postgres: stats collector process
16780 pts/4    S      0:00 /home/postgres/pgsql/BBB/bin/postgres -D data
16783 ?        Ss     0:03 postgres: startup process   recovering 00000001000000000000000B
16784 ?        Ss     0:00 postgres: checkpointer process
16785 ?        Ss     0:00 postgres: writer process
16786 ?        Ss     0:00 postgres: stats collector process
16787 ?        Ss     0:00 postgres: wal receiver process   streaming 0/BD4C080
16788 ?        Ss     0:00 postgres: wal sender process postgres [local] streaming 0/BD4C080
$ kill -s SIGKILL 16764
  • 4.将备用服务器提升为主服务器。
$ pg_ctl promote
  • 5.使用 rsync 命令同步主服务器和备用服务器之间的 WAL 文件。
$ rsync -r 192.168.1.100:/home/postgres/pgsql/BBB/pg_xlog/ /home/postgres/pgsql/AAA/pg_xlog
  • 6.为旧的主服务器创建 `recovery.conf`。
$ $EDITOR recovery.conf

recovery_target_timeline = 'latest'

standby_mode = on

primary_conninfo = 'application_name=AAA port=5432 user=postgres'
  • 7.将旧的主服务器启动为新的备用服务器。
# The new standby server try to fetch WAL file which from latest checkpoint location, from pg_xlog directory at first.
# But we removed the all WAL file on the pg_xlog firectory of new standby server.
# So the new standby server will request to fetch WAL file from the new primary server.
$ pg_ctl start 

限制

  • 目前只支持一个具有 SYNC 复制的故障回退安全备用。
    • 例如:如果有 2 个连接到主服务器的备用服务器(一个是 SYNC,另一个是 ASYNC),并且 `synchronous_transfer` 设置为 `all`。那么主服务器将只等待 SYNC 备用服务器。

对性能的影响

待办事项

  • 目前,此补丁仅支持一个故障回退安全备用。它可以是同步的,也可以是异步的。关于支持多个故障安全备用,还需要进行更多讨论。