GreatSQL社区

搜索

reddey

如何将PG主从复制从异步改成同步

reddey 已有 63 次阅读2025-6-7 13:46 |系统分类:运维实战


通常我们建立的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的连接信息里面写入了从节点的主机名。


评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-6-15 09:14 , Processed in 0.015219 second(s), 9 queries , Redis On.
返回顶部