12.PG主备搭建(物理复制)

1.环境

  主库:172.16.191.133(pg16)

  备库:172.16.191.136(pg16)

2.主库配置

  要使用流复制,需要允许主库接受流复制的连接,这就需要在pg_hba.conf中做如下配置: 

  host    replication     all             0/0             md5

  修改配置参数文件postgresql.conf

 listen_addresses = '*'
 max_wal_senders = 10
 wal_level = replica

3.备库配置

  3.1 首先在配置中生成基础备份(pg_basebackup) 

 pg_basebackup -h172.16.191.133   -U postgres -F p -P -X stream -R -D $PGDATA -l   osdbabackup20240101

  3.2 执行完了之后就能在备库的数据目录(PGDATA)下面看到已经被复制过来的文件(主库的)

       因为使用pg_basebackup命令时使用了“-R”参数,所以也会生成standby.signal文件,同时在postgresql.auto.conf中生成如下内容

primary_conninfo = 'user=postgres password=1234 channel_binding=disable host=172.16.191.133 port=5432 sslmode=disable sslcompression=0 sslcertmode=disable sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'

  如果没有加“-R”参数,我们也可以手动添加上面的内容,如果是PostgreSQL 12版本之前的数据库,使用了“-R”参数会生成recovery.conf文件:

  standby_mode = 'on'primary_conninfo = 'user=postgres password=XXXXXX host=10.0.3.101port=5432 sslmode=disable sslcompression=1'

  3.3启动standby

    启动完成之后,检查备库的参数hot_standby是不是on

4.验证

  在主库中通过pg_stat_replication视图查看

postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 23494
usesysid         | 10
usename          | postgres
application_name | walreceiver
client_addr      | 172.16.191.136
client_hostname  | 
client_port      | 56870
backend_start    | 2024-01-02 10:37:16.749607+08
backend_xmin     | 
state            | streaming
sent_lsn         | 0/70003C8
write_lsn        | 0/70003C8
flush_lsn        | 0/70003C8
replay_lsn       | 0/70003C8
write_lag        | 
flush_lag        | 
replay_lag       | 
sync_priority    | 0
sync_state       | async
reply_time       | 2024-01-02 10:37:36.778821+08

这里就解释一下上面各个字段

pid: WAL发送进程的进程号。
usename: WAL发送进程的数据库用户名。
application_name:连接WAL发送进程的应用别名,此参数显示值为备库
recovery.conf配置文件中primary_conninfo参数application_name选项的值。
client_addr:连接到WAL发送进程的客户端IP地址,也就是备库的IP。
backend start: WAL发送进程的启动时间。
state:显示WAL发送进程的状态,startup表示WAL进程在启动过程中;catchup表示备库正在追赶主库;streaming表示备库已经追赶上了主库,并且主库向备库发送WAL日志流,这个状态是流复制的常规状态;backup表示通过pg_basebackup正在进行备份;stopping表示WAL发送进程正在关闭。
sentlsn: WAL发送进程最近发送的WAL日志位置。
write lsn:备库最近写人的WAL日志位置,这时WAL日志流还在操作系统缓存中,还没写人备库WAL日志文件。
flush lsn:备库最近写人的WAL日志位置,这时WAL日志流已写入备库WAL日志文件。
replay lsn:备库最近应用的WAL日志位置。
write_lag:主库上WAL日志落盘后等待备库接收WAL日志(这时WAL日志流还没写人备库WAL日志文件,还在操作系统缓存中)并返回确认信息的时间。
flush_lag:主库上WAL日志落盘后等待备库接收WAL日志(这时WAL日志流已写人备库WAL日志文件,但还没有应用WAL日志)井返回确认信息的时间。
replay_lag:主库上WAL日志落盘后等待备库接收WAL日志(这时WAL日志流已写入备库WAL日志文件,并且己应用WAL日志)并返回确认信息的时间。
sync _priority:基于优先级的模式中备库被选中成为同步备库的优先级,对于基于quorum的选举模式此字段则无影响。
sync_state:同步状态,有以下状态值,async表示备库为异步同步模式;potential表示备库当前为异步同步模式,如果当前的同步备库岩机,异步备库可升级成为同步备库;sync表示当前备库为同步模式;quorum表示备库为quorumstandbys的候选,其中write_lag、flush一lag、replay_lag三个字段为PostgreSQL10版本新特性,是衡量主备延迟的重要指标

 

   在从库中可以通过pg_stat_wal_receiver查看

postgres=# select * from pg_stat_wal_receiver;
-[ RECORD 1 ]---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid                   | 2674
status                | streaming
receive_start_lsn     | 0/6000000
receive_start_tli     | 1
written_lsn           | 0/6001A78
flushed_lsn           | 0/6001A78
received_tli          | 1
last_msg_send_time    | 2024-01-15 20:39:56.77295-08
last_msg_receipt_time | 2024-01-15 20:39:56.77054-08
latest_end_lsn        | 0/6001A78
latest_end_time       | 2024-01-15 20:30:56.546183-08
slot_name             | 
sender_host           | 192.168.2.140
sender_port           | 5432
conninfo              | user=postgres password=******** channel_binding=disable dbname=replication host=192.168.2.140 port=5432 fallback_application_name=walreceiver sslmode=disable sslcompression=0 sslcertmode=disable sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable

 

 -- 查看pg是主库还是从库可以通过

  select pg_is_in_recovery();

  如果该值返回的是t,说明是从库,如果该值返回的是f,说明该库是主库。

  

posted on 2024-01-01 22:02  太白金星有点烦  阅读(134)  评论(0编辑  收藏  举报

导航