pg_standby - supports the creation of a PostgreSQL warm standby server
支持创建热备份数据库服务器,pg_standby被设计成一个等待restore_command,将标准的存档恢复变成一个热备份操作。
要将备用服务器配置为使用pg_standby,需要将其放入recovery.conf配置文件:
restore_command = 'pg_standby archiveDir %f %p %r'
其中archivedir是应该从中恢复wal段文件的目录。
如果指定了restartwalfile(通常使用%r宏),则逻辑上位于该文件前面的所有wal文件都将从archivelocation中删除。这样可以最小化需要保留的文件数量,同时保留崩溃重启功能。如果archivelocation是此特定备用服务器的临时区域,则使用此参数是合适的,但如果archivelocation是长期的wal归档区域,则不使用此参数。
pg_standby假定archivelocation是服务器拥有用户可读取的目录。如果指定了restartwalfile(或-k),则archivelocation目录也必须是可写的。
当主服务器发生故障时,有两种方法可以故障转移到“热备用”数据库服务器:
Smart Failover
服务器在应用存档中所有可用的wal文件之后启动。这将导致零数据丢失,即使备用服务器落后,但如果有大量未应用的wal,则备用服务器可能需要很长时间才能准备就绪。要触发smart failover,请创建包含单词smart的触发器文件,或者只创建它并将其保留为空。
Fast Failover
在快速故障转移中,服务器会立即启动。存档中任何尚未应用的wal文件都将被忽略,这些文件中的所有事务都将丢失。要触发快速故障转移,需要创建一个触发器文件并将单词fast写入其中。如果在定义的时间间隔内没有新的wal文件出现,pg_standby也可以配置为自动执行快速故障转移。
PG_Standby设计用于PostgreSQL 8.2及更高版本。
PostgreSQL 8.3提供了%r宏,旨在让pg_standby知道它需要保存的最后一个文件。对于PostgreSQL 8.2,如果需要清除存档,则必须使用-k选项。此选项在8.3中仍然可用,但不推荐使用。
PostgreSQL 8.4提供了 recovery_end_command 命令选项。没有这个选项,剩下的触发文件可能是危险的。
PGYStand是用C编写的,有一个易于修改的源代码,具体指定的部分可以根据自己的需要进行修改。
其中,archive目录物理上位于备用服务器上,因此archive_命令正在通过NFS访问它,但这些文件是备用服务器的本地文件(允许使用ln)。这将:
archive_command = 'cp %p .../archive/%f'
restore_command = 'pg_standby -d -s 2 -t /tmp/pgsql.trigger.5432 .../archive %f %p %r 2>>standby.log' recovery_end_command = 'rm -f /tmp/pgsql.trigger.5432'
在standby.log中生成调试输出
在检查下一个WAL文件可用性之间休眠2秒钟
仅当出现名为/tmp/pgsql.trigger.5442的触发器文件时停止等待,并根据其内容执行故障转移
恢复结束时删除触发器文件
从存档目录中删除不再需要的文件
实验
===========
环境:CentOS 7 + PG 11
1. 在主库建立 /data/archive文件夹,并做成NFS,备库挂载。(或备库建,主库挂载)
2. 改主库参数。
vim postgresql.conf
archive_command = 'test ! -f /data/archive/%f && cp %p /data/archive/%f' # comma
3. 修改备库recovery.conf
standby_mode=on
restore_command='/usr/local/pgsql/bin/pg_standby -d -s 2 -t /tmp/pgsql.trigger.5432 /data/arch
ive %f %p 2>>standby.log'
recovery_end_command='rm -f /tmp/pgsql.trigger.5432'
recovery_target_timeline = 'latest'
4. 重启主备库