同步传输
来自 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 备用服务器。
对性能的影响
待办事项
- 目前,此补丁仅支持一个故障回退安全备用。它可以是同步的,也可以是异步的。关于支持多个故障安全备用,还需要进行更多讨论。