基于备份的配置文件

主库

/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

 

posted @ 2024-06-22 00:43  wongchaofan  阅读(5)  评论(0编辑  收藏  举报