暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pg流复制

原创 七七 2021-12-31
1969

在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查看此参数的状态

 

 

 

流复制的几个参数:

 


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论