3. 归档(archive)

3.1. 归档配置

归档日志是定时把wal日志拷贝到其他地方保存起来

需要至少在postgresql.conf中增加以下配置项 1 :

archive_mode :

OFF: 不对日志归档

ON: 打开归档,但是不在recovery模式下归档

ALWAYS: 打开归档,在recovery模式下也归档

archive_command:

这里配置归档命令,比如只配置个简单的cp命令把wal日志拷贝到其他地方

:: archive_mode = on archive_command = ‘cp %p /home/zhouhj/archive/%f’

其中archive_command,在postgresql调用命令时,%f和%p会被替换为具体的文件, %f替换为文件名,比如: 000000010000000000000002, 而%p会替换为带上相对目录的文件名, 比如: pg_wal/000000010000000000000002, 这个路径是相对data目录的,pg调用脚本时时当前路径就是在data目录,所以在脚本中可以使用%p 访问到文件,而%f不能访问到文件。

这个命令要确保有效,如果归档失败(脚本返回非0),则wal日志会一直保留,导致日志堆积

archive_timeout:

日志只有在写满的时候才进行归档,如果在日志未满的情况下,系统发生故障,则归档日志会缺少一部分。另外如果数据库服务器写入请求较少,日志会长时间不归档。 这个时候可以使用archive_timeout进行归档。

3.2. 归档状态

有两个地方可以查看归档状态: 在pg_wal/archive_status目录中对每个wal日志文件有一个状态文件,当一个日志文件写完切到下一个日志的时候,会在pg_wal/archive_status目录下创建一个日志文件同名的xxx.ready文件。

日志归档进程会监控pg_wal/archive_status目录,发现有ready文件,则按照日志编号顺序依次对对应文件进行处理,在处理完成后,会将ready文件改成done文件, 比如000000010000000000000007.ready 重命名为 000000010000000000000007.done。

3.3. 归档恢复(Archive Recovery)

归档恢复有两种: standby和targeted recovery, 其中standby用于高可用或者扩展读能力。 targeted recovery则用于数据恢复, 比如误删数据的恢复。

如果要让数据库进入standby模式,则在data目录下创建standby.signal文件,则数据库会使用restore_command持续恢复,并且会根据 primary_coninfo配置连接主数据库进行流恢复。 此时要配置以下相关参数: https://www.postgresql.org/docs/current/runtime-config-replication.html#RUNTIME-CONFIG-REPLICATION-STANDBY

如果要进入targetd recovery模式,则在data目录下创建recovery.signal文件。 如果standby.signal和recovery.signal同时存在,则standby.signal同时存在,则standby优先。 在targeted recovery模式,需要配置以下参数: https://www.postgresql.org/docs/current/runtime-config-wal.html#RUNTIME-CONFIG-WAL-RECOVERY-TARGET

3.4. standby模式配置

  1. 首先要创建一个基础备份

lt_basebackup -h 10.19.36.23  -D /home/lightdb/lightdb-2762/data -p 5432

# 或者
pg_start_backup();
拷贝data目录
pg_stop_backup();
  1. 在基础备份的postgresql.conf中配置以下参数

restore_command = 'cp /home/zhouhj/archive/%f %p'

primary_conninfo = 'host=localhost port=5433 connect_timeout=10'

其中 restore_command 是为了获取已经归档的wal日志进行重放。 在wal日志重放完成后,会使用 primary_conninfo 连接主数据库进行流复制。

  1. 物理赋值槽

    在主上可以创建物理赋值槽

# primary
max_replication_slots=10

select pg_create_physical_replication_slot("standby1_slot");
select * from pg_replication_slots;

# standby
primary_slot_name = 'standby1_slot'

Footnotes

1

https://www.postgresql.org/docs/current/runtime-config-wal.html#RUNTIME-CONFIG-WAL-ARCHIVING

3.5. 查看状态

通过 pg_stat_archiver 视图可以查看当前归档的状态 https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ARCHIVER-VIEW