基于备份的配置文件
主库
/postgresql.conf
listen_addresses = '*' '*' 将允许所有可用的 IP 接口(IPv4 和 IPv6)仅监听 IPv4 设置,0.0.0.0而 ' ::' 允许监听所有 IPv6 地址。
wal_level = replica #预写日志级别
fsync=on #确保更新已物理写入磁盘synchronous_commit #有效值为remote_apply、on(默认值)、remote_write、local和off。为了数据一致性,需要开启。为了性能可关闭。
#检查点checkpoint_timeout =5min
#自动 WAL 检查点之间的最大时间。
#存档
archive_mode=on #
archive_timeout = 60s #请注意,由于强制切换而提前关闭的存档文件的长度仍然与完全完整的文件相同。
/pg_hba.conf 添加额外的行,以允许使用用户进行备用服务器连接进行复制
host replication replicator <IP address of the standby> scram-sha-256
备库
/postgresql.conf
hot_standby = on
制作备库
过pg_basebackup
创建一个slave实例。实际上是连接到Master实例,并复制一份数据目录到本地。
pg_basebackup -Fp -Pv -R -c fast -U replication -h localhost -D /var/lib/pgsql/slave
#pg_basebackup -h <IP address of the main server> -D /var/lib/postgresql/14/main -U replicator -P -v -R
-h:主服务器的主机名或 IP 地址
-D:数据目录
-U:操作中要使用的用户
-P:开启进度报告
-v:启用详细模式
-R:创建standby.signal文件并将连接设置附加到postgresql.auto.conf
这里的关键是通过-R
选项,在备份的制作过程中自动将主机的连接信息填入recovery.conf
,这样使用pg_ctl
启动时,数据库会意识到自己是备机,并从主机自动拉取WAL追赶进度。
启动从库
pg_ctl -D /var/lib/pgsql/slave -o "-p 5433" start
从库与主库的唯一区别在于,数据目录中多了一个recovery.conf
文件。这个文件不仅仅可以用于标识从库的身份,而且在故障恢复时也需要用到。对于pg_basebackup
构造的从库,它默认包含两个参数:
standby_mode = 'on' primary_conninfo = 'user=replication passfile=''/Users/vonng/.pgpass'' host=localhost port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any'
standby_mode
指明是否将PostgreSQL作为从库启动。
在备份时,standby_mode
默认关闭,这样当所有的WAL拉取完毕后,就完成恢复,进入正常工作模式。
如果打开,那么数据库会意识到自己是备机,那么即使到达WAL末尾也不会停止,它会持续拉取主库的WAL,追赶主库的进度。
拉取WAL有两种办法,通过primary_conninfo
流式复制拉取(9.0后的新特性,推荐,默认),或者通过restore_command
来手工指明WAL的获取方式(老办法,恢复时使用)。
查看状态
主库的所有从库可以通过系统视图pg_stat_replication
查阅:
$ psql postgres -tzxc 'SELECT * FROM pg_stat_replication;' pid | 1947 usesysid | 16384 usename | replication application_name | walreceiver client_addr | ::1 client_hostname | client_port | 54124 backend_start | 2018-01-25 13:24:57.029203+08 backend_xmin | state | streaming sent_lsn | 0/5017F88 write_lsn | 0/5017F88 flush_lsn | 0/5017F88 replay_lsn | 0/5017F88 write_lag | flush_lag | replay_lag | sync_priority | 0 sync_state | async
检查主库和备库的状态可以使用函数pg_is_in_recovery
,备库会处于恢复状态:
$ psql postgres -Atzc 'SELECT pg_is_in_recovery()' && \ psql postgres -p 5433 -Atzc 'SELECT pg_is_in_recovery()' f t