|
通常我们建立的PG主从复制是异常复制,昨晚在看墨天轮看李老师的文章时,里面介绍可以将异步模式改成同步,这个以前没做过实验,今天在自己的虚拟机试一下。李老师是云和恩墨的大佬,在墨天轮社区发布不少的关于PG数据库的文章。今天是高考首日,决定着天下众多学子们的人生道路和抉择。在此祝各位考生旗开得胜,心想事成。本次修改主从配置的重点和思路,先要添加修改主节点的配置文件的参数,重启主节点后,再在从节点数据库命令行下修改参数,然后重启从节点。总体看来,步骤并不复杂,但是还是要仔细小心地检查参数和命令行,在生产环境更要如此。
我的主备服务器配置如下
192.168.200.17 master
192.168.200.145 slave1
操作系统是CENTOS7。数据库版本主备相同如下所示
scott=# select version();
-[ RECORD 1 ]-----------------------------------------------------------------------------------------------------
version | PostgreSQL 14.18 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
我们检查一下主节点数据库复制情况
scott=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 61686
usesysid | 16384
usename | replica
application_name | walreceiver
client_addr | 192.168.200.145
client_hostname |
client_port | 50450
backend_start | 2025-06-06 21:13:59.378097-04
backend_xmin |
state | streaming
sent_lsn | 0/3023B88
write_lsn | 0/3023B88
flush_lsn | 0/3023B88
replay_lsn | 0/3023B88
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2025-06-06 21:24:50.089698-04
从上面的提示信息,同步状态模式为异步方式。通常我们建立的PG主从复制是异步的。
scott=# select pg_is_in_recovery();
-[ RECORD 1 ]-----+--
pg_is_in_recovery | f
登录从节点,检查一下数据WAL日志的接收情况。
scott=# select * from pg_stat_wal_receiver ;
-[ RECORD 1 ]---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 23079
status | streaming
receive_start_lsn | 0/3000000
receive_start_tli | 1
written_lsn | 0/3023B88
flushed_lsn | 0/3023B88
received_tli | 1
last_msg_send_time | 2025-06-06 21:27:40.406779-04
last_msg_receipt_time | 2025-06-06 21:27:40.397869-04
latest_end_lsn | 0/3023B88
latest_end_time | 2025-06-06 21:22:39.82881-04
slot_name |
sender_host | 192.168.200.17
sender_port | 5432
conninfo | user=replica password=******** channel_binding=prefer dbname=replication host=192.168.200.17 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any
登录主节点,检查要配置的同步参数信息。
scott=# select name,setting from pg_settings where name in('synchronous_commit','synchronous_standby_names');
-[ RECORD 1 ]----------------------
name | synchronous_commit
setting | on
-[ RECORD 2 ]----------------------
name | synchronous_standby_names
setting |
从上面的信息看,第一个参数是不用配置的。我们要在主节点配置一下第二个参数synchronous_standby_names。这个比较简单,我们编辑一下postgresql.conf文件,写入synchronous_standby_names=slave1。要注意的是一定要是主机名,不能是IP地址,否则重启数据库时识别不了。添加好同步参数后,我们重启一下主节点的数据库服务。
接着我们登录从节点,使用命令行在线修改备节点的参数,命令行如下:
postgres=# alter system set primary_conninfo = 'application_name=slave1 user=replica password=replica channel_binding=disable host=192.168.200.17 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any';
application_name写入备节点的主机名,host写入主节点的IP地址,同时也要写入主从复制主节点建立的复制用户名和密码,然后重启从节点的数据库服务。
检查一下主节点的复制情况
scott=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 65098
usesysid | 16384
usename | replica
application_name | slave1
client_addr | 192.168.200.145
client_hostname |
client_port | 50562
backend_start | 2025-06-06 22:04:05.871699-04
backend_xmin |
state | streaming
sent_lsn | 0/3023D20
write_lsn | 0/3023D20
flush_lsn | 0/3023D20
replay_lsn | 0/3023D20
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2025-06-06 22:05:36.158371-04
上面的提示信息显示主从复制改成了同步方式。
登录从节点检查WAL日志接收情况,如下所示
postgres=# select * from pg_stat_wal_receiver ;
-[ RECORD 1 ]---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 23333
status | streaming
receive_start_lsn | 0/3000000
receive_start_tli | 1
written_lsn | 0/3023D20
flushed_lsn | 0/3000000
received_tli | 1
last_msg_send_time | 2025-06-06 22:06:36.281047-04
last_msg_receipt_time | 2025-06-06 22:06:36.277496-04
latest_end_lsn | 0/3023D20
latest_end_time | 2025-06-06 22:04:05.900122-04
slot_name |
sender_host | 192.168.200.17
sender_port | 5432
conninfo | user=replica password=******** channel_binding=disable dbname=replication host=192.168.200.17 port=5432 application_name=slave1 fallback_application_name=walreceiver sslmode=disable sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any
发现primary_conninfo的连接信息里面写入了从节点的主机名。
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com