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

搭建PostgreSQL主从流复制

基础环境准备(多个实例)

master 10.0.0.51 1921
standby 10.0.0.52 1921
如果要实现自动切换,需要配合keepalived或者其他组件。
基础的主从流复制就是简单的异步复制。

过程
与MySQL主从复制很相似,它有三个进程walsender、walreceiver、startup
过程如下:
1.启动主节点和备节点
2.备节点启动startup进程
3.备节点启动walreceiver进程
4.walreceiver发送一个连接请求到主节点,如果主节点没有运行,walreceiver会周期性的发送请求
5.当主节点接受到一个连接的请求,就会启动一个walsender进程建立连接
6.walreceiver发送备节点最后的LSN,这个阶段在IT领域叫握手机制
7.如果备机点的LSN小于主节点的LSN,walsender发送wal数据,即从节点的LSN到主节点LSN的wal数据,wal数据由存储在主节点的pg_xlog(10版本以后叫pg_wal)目录下的wal segment提供,这个阶段就是备节点追赶主节点的阶段
8.流复制开始工作

具体参阅

https://zhuanlan.zhihu.com/p/481764715?utm_id=0
复制

设置配置文件

Master节点
创建复制用户:

create role replica with replication login password '123456';
alter user replica with password 'repl@123';
复制

修改pg_hba.conf

host replication replica 0.0.0.0/0 md5
复制

修改配置

wal_level = replica  # 这个是设置主为wal的主机  
max_wal_senders = 5  # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个  
wal_keep_segments = 128 # 设置流复制保留的最多的xlog数目,新版由wal_keep_size替代
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间  
max_connections = 200 # 一般查多于写的应用从库的最大连接数要比较大  
hot_standby = on   # 说明这台机器不仅仅是用于数据归档,也用于数据查询(热备)  
max_standby_streaming_delay = 30s  # 数据流备份的最大延迟时间  
wal_receiver_status_interval = 10s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间  
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈  
wal_log_hints = on # also do full page writes of non-critical updates
复制

Standby节点
首先需要清空数据和归档

rm -rf /pgdata/12/data/*
rm -rf /archive/*
复制

因为搭建流复制也需要将某个点的备份恢复过来,之后再开始进行复制。
因此之前的数据需要清空。

使用刚建的用户备份主库数据

pg_basebackup -D /pgdata/pg_backup/ -Ft -Pv -Ureplica -h 10.0.0.51 -p 1921 -R
复制

备份完成后,-R 参数自动创建 standby.signal 文件

解压数据

tar xf base.tar -C /pgdata/12/data/
tar xf pg_wal.tar -C /archive/
复制

注,如果有多个表空间需要在主库上查出表空间的oid及位置,将pg_basebackup出来的文件解压到对应位置:

select t.oid,
    t.spcname AS "Tablespace Name",
    t.spcacl AS "Access Privileges",
    pg_tablespace_location(t.oid) AS "Location"
FROM
    pg_tablespace t;
复制

修改数据目录下的standby.signal文件

standby_mode = 'on'
复制

修改postgresql.conf文件

primary_conninfo = 'host=10.0.0.51 port=1921 user=replica password=123456'
recovery_target_timeline = latest #默认
max_connections = 120 # 大于等于主节点,正式环境应当重新考虑此值的大小
hot_standby = on
max_standby_feedback = on
max_wal_senders = 15
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
复制

修改postgresql.auto.conf,只留如下两行即可:

restore_command = 'cp /archive/%f %p'
primary_conninfo = 'user=postgres password=123456 host=10.0.0.51 port=1921 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
复制

然后启动从库实例就直接启动主从了。

监控状态
主库:

select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
复制

备库:

psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"
复制

或在psql中执行:

SELECT status,last_msg_send_time FROM pg_stat_wal_receiver;
复制

参考:

https://www.bilibili.com/video/BV1WQ4y1f76h?p=19&vd_source=adbe4dade12efbb9aa6895c308f74a54
复制

维护操作

在 PostgreSQL 物理流复制架构中(例如一主一从),进行系统级维护时,通常推荐的停启顺序如下:

停止(关库)顺序:

  • 先停止从库(Standby):
    先关闭从库可确保从库不会在主库关闭后反复尝试连接,从而避免出现不必要的报错或等待。
    停止从库前最好确保其已同步到最新的WAL位置,减少维护结束后重启时的同步工作量。

  • 再停止主库(Primary):
    在从库停掉后,再正常关闭主库。
    此时主库不会再产生日志,也无需考虑流复制连接。

启动(开库)顺序:

  • 先启动主库(Primary):
    主库先启动后,可以正常接受新事务并生成WAL日志。
    同时为从库提供了一个可连接和追赶(replay)的起点。

  • 再启动从库(Standby):
    在主库已正常运行的情况下,从库连接主库并开始流复制回放WAL,从而快速恢复数据同步状态。

总结:

  • 停止时: 先从库 → 后主库
  • 启动时: 先主库 → 后从库

此顺序有助于确保数据一致性和流复制进程的平稳运行。

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

文章被以下合辑收录

评论