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,说明该库是主库。