在PG中能提供读写全功能的服务器,称为primary database或Master database;若备份数据库在接收主数据库同步数据和应用同步数据时,不能提供只读服务,则该备份数据库称为warm standby server;而如果在接收同步数据和应用同步数据时也能提供只读操作,则称该备库为Hot standby server. hot standby是pg 9.x版本以后提供的新功能。
把WAL日志传送到另一台机器上的方法:1.通过WAL归档日志实现 2.流复制
开启WAL归档的方法:
设置参数achive_command=on
archive_command='cp %p /backup/pgarch/%f' 或'scp %p pg@192.168.10.100:/backup/pgarch/%f'
使用上面拷贝wal文件的方法来同步主、备数据库间数据时,备库会落后主库一个WAL日志文件。
流复制:
只要primary一产生日志,就会马上传递到standby数据库。
流复制有两种日志传递方式:异步和同步。
同步:在主库提交事务时,一定等到WAL日志传递到standby后才会返回,这样主和备间的数据同步没有一点落后
异步:事务提交后不必等到日志传递到standby就可返回,所以standby比primary落后很少的时间
搭建standby的步骤:
1.生成一个基础备份 2.把备份拷贝到异机上,配置recover.conf并把备库启动到standby模式
同步流复制搭建:
在实际应用中,同步流复制,总是有1个主库和2个以上的standby库。
1.环境信息:
数据库版本:pg13.2
|
主机名 |
IP |
数据目录 |
角色 |
|
upright91 |
192.168.0.91 |
/home/pg/pgdata/data |
主库 |
|
upright92 |
192.168.0.92 |
/home/pg/pgdata |
备库 |
2.主库配置
vi pg_hba.conf
host replication all 192.168.0.0/24 md5
vi postgresql.conf
wal_level = replica
synchronous_commit = on
max_wal_senders = 10 要使用流复制一定要把此值设置成一个大于零的值
wal_keep_segments = 1024 在主库上保留多少个WAL日志文件,供STANDBY用
synchronous_standby_names = 'standby_node' 这个参数指定多个standby的名称,各个名称通过逗号分隔
hot_standby = on
hot_standby_feedback = on
logging_collector = on
重启数据库
pg_ctl start -D /home/pg/pgdata/data
3.在standby上生成基础备份
[pg@upright92 pgdata]$pg_basebackup -R -X stream -Fp -D /home/pg/pgdata -h 192.168.0.91 -p 6632 -U pg
执行完上面的命令后,就会在upright92机器上的/home/pg/pgdata目录下看到各种数据文件和配置文件
[pg@upright92 pgdata]$ ls -l
total 300
-rw------- 1 pg pg 226 Jun 28 15:59 backup_label.old
-rw------- 1 pg pg 236217 Jun 28 15:59 backup_manifest
drwx------ 7 pg pg 67 Jun 28 15:59 base
-rw------- 1 pg pg 53 Jun 28 16:08 current_logfiles
drwx------ 2 pg pg 4096 Jun 28 16:12 global
drwx------ 2 pg pg 6 Jun 28 15:59 pg_commit_ts
drwx------ 2 pg pg 6 Jun 28 15:59 pg_dynshmem
-rw------- 1 pg pg 4892 Jun 28 15:59 pg_hba.conf
-rw------- 1 pg pg 1636 Jun 28 15:59 pg_ident.conf
drwx------ 4 pg pg 68 Jun 28 16:13 pg_logical
drwx------ 4 pg pg 36 Jun 28 15:59 pg_multixact
drwx------ 2 pg pg 6 Jun 28 15:59 pg_notify
drwx------ 2 pg pg 6 Jun 28 15:59 pg_replslot
drwx------ 2 pg pg 6 Jun 28 15:59 pg_serial
drwx------ 2 pg pg 6 Jun 28 15:59 pg_snapshots
drwx------ 2 pg pg 6 Jun 28 15:59 pg_stat
drwx------ 2 pg pg 6 Jun 28 15:59 pg_stat_tmp
drwx------ 2 pg pg 18 Jun 28 16:13 pg_subtrans
drwx------ 2 pg pg 6 Jun 28 15:59 pg_tblspc
drwx------ 2 pg pg 6 Jun 28 15:59 pg_twophase
-rw------- 1 pg pg 3 Jun 28 15:59 PG_VERSION
drwx------ 3 pg pg 92 Jun 28 16:13 pg_wal
drwx------ 2 pg pg 18 Jun 28 15:59 pg_xact
-rw------- 1 pg pg 311 Jun 28 15:59 postgresql.auto.conf
-rw------- 1 pg pg 28121 Jun 28 16:07 postgresql.conf
-rw------- 1 pg pg 50 Jun 28 16:08 postmaster.opts
-rw------- 1 pg pg 85 Jun 28 16:08 postmaster.pid
-rw------- 1 pg pg 0 Jun 28 15:59 standby.signal
修改配置文件
vi postgresql.conf
recovery_target_timeline = 'latest'
primary_conninfo = 'application_name=standby_node host=192.168.0.91 port=6632 user=pg password=pg'
promote_trigger_file = '/home/pg/pgdata/promote_trigger_file'
重启备库
pg_ctl start -D /home/pg/pgdata
4.数据同步测试
主库:
[pg@upright91 ~]$ psql -p 6632
psql (13.2)
Type "help" for help.
pg=# create table td(id int);
CREATE TABLE
pg=# insert into td values(10);
INSERT 0 1
备库:
[pg@upright92 bin]$ psql -p 6632
psql (13.2)
Type "help" for help.
pg=# select * from td;
id
----
10
(1 row)
检查备库及流复制情况:
主库中查询,发现是异步复制,application_name没有生效
pg=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 865
usesysid | 10
usename | pg
application_name | walreceiver
client_addr | 192.168.0.92
client_hostname |
client_port | 64538
backend_start | 2021-06-28 16:08:52.540515+08
backend_xmin |
state | streaming
sent_lsn | 0/E5010910
write_lsn | 0/E5010910
flush_lsn | 0/E5010910
replay_lsn | 0/E5010910
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async 如果为async则表示是异步的流复制
reply_time | 2021-06-28 16:15:59.224562+08
进一步排查,发现从节点是在postgresql.auto.conf中有自动生成的primary_conninfo配置,里面没有application_name配置,而postgresql.auto.conf文件的优先级高于postgresql.conf文件。在里面添加节点名称:
[pg@upright92 pgdata]$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'application_name=standby_node user=pg password=pg channel_binding=disable host=192.168.0.91 port=6632 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
从reload是不会生效的,必须重启从节点
pg_ctl restart -D /home/pg/pgdata
再次查看,发现同步生效
pg=# select * from pg_stat_replication
pg-# ;
-[ RECORD 1 ]----+------------------------------
pid | 17128
usesysid | 10
usename | pg
application_name | standby_node
client_addr | 192.168.0.92
client_hostname |
client_port | 52621
backend_start | 2021-06-29 10:38:04.96947+08
backend_xmin |
state | streaming
sent_lsn | 0/E5010CB0
write_lsn | 0/E5010CB0
flush_lsn | 0/E5010CB0
replay_lsn | 0/E5010CB0
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2021-06-29 10:55:07.964575+08
将主库的synchronous_standby_names 配置成any的方式,reload即可将复制方式改成同步方式
vi postgresql.conf
synchronous_standby_names = 'any 1 (standby_node,node1)'
pg_ctl reload
pg=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 17128
usesysid | 10
usename | pg
application_name | standby_node
client_addr | 192.168.0.92
client_hostname |
client_port | 52621
backend_start | 2021-06-29 10:38:04.96947+08
backend_xmin |
state | streaming
sent_lsn | 0/E5010BC8
write_lsn | 0/E5010BC8
flush_lsn | 0/E5010BC8
replay_lsn | 0/E5010BC8
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | quorum
reply_time | 2021-06-29 10:39:01.606243+08
查看备库的状态:
pg=# select * from pg_is_in_recovery(); 如果是主库上,则返回的是false,如果是在备库上返回的是TRUE
pg_is_in_recovery
-------------------
t
(1 row)
在hot standby中,参数transaction_read_only总被设置为”ON",而且不能改变,可以使用 show transaction_read_only查看此参数的状态
流复制的几个参数:




