关于流复制的相关,可参考 27.2. 日志传送后备服务器

在实际的生产环境中,为避免备库出现问题时,导致主库被 hang 住的情况发生,一般是启动两个备库。两个备库中,只要有一个正常运行,就不会让主库 hang 住。

1 主库配置

这里需要注意的是,主库安装postgresql,备库安装完成postgresql后,不"初始化"; 备库在安装完成后,有必要也配置一下环境变量,以便后续使用。

1.1 流复制用户创建

# 创建流复制用户 lfz_u01 同时授权 replication
create user lfz_u01 replication;

# 修改流复制用户 lfz_u1 的密码
alter user lfz_u01 password 'pgccc';

PostgreSQL-流复制 多机同(异)步 一主一备_pg_hba.conf

1.2 配置 pg_hba.conf

修改主库pg_hba.conf,配置接收流复制的连接。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# Allow replication connections from localhost, by a user with the
# replication privilege.

host    replication     lfz_u01         192.168.8.129/32        trust

PostgreSQL-流复制 多机同(异)步 一主一备_postgresql_02

1.3 配置 postgresql.conf

同步流复制,主要是在主库的 postgresql.conf,配置参数 synchronous_standby_names 此参数用于指定哪些备库为强同步。异步流复制,不配置此参数。

该参数指定多个 standby 的名称,各个名称用逗号分隔,standby 的名称,是由 standby 连接到主库时由连接参数 "application_name" 指定的。

同步的优先级,是以各个备库在 synchronous_standby_names 中的配置顺序决定的。

其,支持:

1.[FIRST]num_sync(standby_name[, ...])
2.ANY num_sync(standby_name[, ...])
3.standby_name[, ...]

此,三种写法,其中 num_sync 是指事务需要等待多少个同步备库回复的数量。

FIRST和ANY,则是从列出的服务器中选出同步备库的方法。

关键字FIRST与num_sync一起时,指定基于优先级的同步复制。例如,设置FIRST 3(s1,s3,s3,s4)会等待来自s1,s2,s3和s4的三个优先级较高的备库的答复,名字在列表中越靠前的备库,具有更高的优先级,并被视为同步库,即我们熟知的强一致同步 sync;出现在列表后面的其他备库,则是潜在备库,即 potential。如果,sync 状态的备库因为某种原因断开连接后,potentail 状态的备库将立即替换为次高优先级的备库。

关键字ANY与num_sync一起时,指定基于仲裁的同步复制。事务提交等待其WAL日志复制到至少num_sync数据的备库。例如,设置为 ANY 3(s1,s2,s3,s4)会等待s1,s2,s3和s4的任意三个备库的答复,并且这个参数,在备库上设置是不生效的。在某些HA上,会提升合适的备库为新的master,为同步做准备。

# 一般情况下优先级,一个同步库,一个潜在同步库
synchronous_standby_names = 's129'

# 配置2个同步节点
synchronous_standby_names = '2(S129,S130)'
# 本测试配置参数
synchronous_standby_names = 's129'  --异步流复制不配置此项
listen_addresses = '*'
port = 5432
max_wal_senders = 10  --修改此参数,需要重启数据库
wal_level = replica  --修改此参数,需要重启数据库

PostgreSQL-流复制 多机同(异)步 一主一备_postgresql_03

2 备库配置  

2.1 创建基础备库

这里,使用了 -R 参数,将会生成 standby.signal 文件;

pg_basebackup -D /pgccc/pgdata_standby01 -Fp -R -P -v -h 192.168.8.128 -U lfz_u01

PostgreSQL-流复制 多机同(异)步 一主一备_流复制_04

2.2 配置参数 application_name

创建基础备份时,同时在 postgresql.auto.conf 中生成如下内容(不包括 application_name=s129)与异步流复制的区别就是,在 postgresql.auto.conf 中不配置 application_name

这里配置 application_name=s129 是响应主库的 synchronous_standby_names。

[postgres@pgccc02 pgdata_standby01]$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=lfz_u01 passfile=''/home/postgres/.pgpass'' channel_binding=disable host=192.168.8.128 port=1521 sslmode=disable sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
[postgres@pgccc02 pgdata_standby01]$
#如果,是PostgreSQL12之前的版本,使用 -R 参数,会生成 recovery.conf 文件,内容如下:
standby_mode = 'on'
primary_conninfo = 'user=lfz_u1 password=XXXXXXXX host=192.168.8.128 port=5432 sslmode=disable sslcompression=1'

在 postgresql.auto.conf 中增加连接参数"application_name=s129"

primary_conninfo = 'application_name=s129 user= ... ...'

PostgreSQL-流复制 多机同(异)步 一主一备_synchronous_standby__05

2.3 配置参数 hot_standby

设置该参数,是为了让备库是 Hot Standby ,即可以对外提供只读服务。

该参数在较新版本的postgresql中默认被设置成 "on"

hot_standby = on

PostgreSQL-流复制 多机同(异)步 一主一备_synchronous_standby__06

3 启动备库

pg_ctl -D /pgccc/pgdata_standby01 start

4 测试流复制

主库更新表结构并插入数据。

PostgreSQL-流复制 多机同(异)步 一主一备_postgresql_07

备库查询更新数据。

PostgreSQL-流复制 多机同(异)步 一主一备_pg_basebackup_08

5 相关视图

pg_stat_replication

pg_stat_replication 是PostgreSQL数据库中的一个系统视图,用于监控和报告数据库复制的状态信息。通过查询 pg_stat_replication 视图,可以获取当前数据库复制的状态信息,包括复制进程的连接信息、复制进程的状态、WAL日志位置等。这些信息对于监控和管理数据库复制非常有用,可以帮助管理员了解复制的健康状况和性能情况。

PostgreSQL-流复制 多机同(异)步 一主一备_postgresql_09

PostgreSQL-流复制 多机同(异)步 一主一备_postgresql_10

pg_stat_wal_receiver

pg_stat_wal_receiver是一个系统视图,用于监视和管理 PostgreSQL 中的 WAL(Write-Ahead Log)接收器进程的状态。WAL接收器进程是用于流复制的一部分,它接收主服务器上的WAL日志,并将其应用到备用服务器上。通过查询pg_stat_wal_receiver视图,可以获取有关WAL接收器进程的状态信息,包括接收的WAL日志位置、复制槽名称、连接信息等。这些信息对于监控和管理流复制非常有用,可以帮助管理员了解复制的健康状况和性能情况。

PostgreSQL-流复制 多机同(异)步 一主一备_流复制_11

PostgreSQL-流复制 多机同(异)步 一主一备_synchronous_standby__12

6 pg_basebackup工具命令行

pg_basebackup工具,是把整个数据库实例的数据都物理地复制出来,而不是也不能只把数据库实例中的部分内容,如某些表,单独备份出来。它用来完成数据库的基础备份。

# 选项解释
pg_basebackup工具
pg_basebackup [option ...]
-D :指定备份的目标目录,即备份到哪儿
-F :指定输出的格式
-Fp:原样输出,即把主数据库中的各个数据文件、配置文件、目录结构都完全一样地写到备份目录中,这种情况下"format"指定为"p"或"plain";
-Ft:tar格式输出,相当于把输出的备份文件打包到一个tar文件中,这种情况下"format"指定为"t"或"tar";
-R :--write-recovery-conf: 是否生成 recovery.conf 文件;
-P :允许在备份过程中实时地打印备份进度;打印的进度不是百分之百准确的,因为在备份的过程中,数据库的数据还在发生变化,还会不断的产生WAL日志;
-v : 或 --verbose 详细模式;当使用了 -P 参数时,还会打印出正在备份哪个具体文件的详细信息;
-h : 或 --host 指定连接的服务器主机名或IP地址;
-p : 或 --port 指定连接的端口;
-U :或 --username 指定连接的用户名
注:
其他一般不常用的参数,不在此列出。有 -r -X -z -Z -c -l -V -w -W;
在同一台机器上 pg_basebackup命令行参数的示例
pg_basebackup -D /pgccc/pgdata_standby -Fp -R -P -v -U lfz_u1
在另一台机器上 pg_basebackup命令行参数的示例 把 10.10.10.10 上的数据备份到本地
pg_basebackup -D $pgdata_standby -Fp -R -P -v -h 10.10.10.10 -p 5432 -U lfz_u1 -l logfile