pg流复制强同步1主2从

PostgreSQL主从流复制与强同步配置详解

一、前言

主从的流复制,可以根据

synchronous_commit

synchronous_standby_names

这俩参数来设置强同步。

首先搭建了3台虚拟机,1主、2从

搭库安装这写我就懒得写了。

二、主库配置

1、用户

需要设置一个用户用来流复制

create user replica with password 'replica';(用superuser也可以)
alter user replica replication;

2、pg_hba.conf

host    replication     all             192.168.79.111/24       trust
host    replication     all             192.168.79.112/24       trust

 

3、postgresql.conf
    listen_addresses = '*' 
    wal_level = replica
    port = 5434 
    archive_mode=on
    archive_command='cp %p //usr/local/postgresql/archive/%f'
    archive_timeout=1800
    max_wal_senders = 10
    wal_sender_timeout = 60s
    max_replication_slots = 10
    logging_collector = on 
    log_directory = '/usr/local/postgresql/log' 
    synchronous_commit=on
    synchronous_standby_names = 'FIRST 1(S1,S2)' --这一行先写好,但是需要注释掉。

这样主库的配置就完成了,需要去从库pg_basebackup来备份过去

三、从库配置

3.1、从库配置

pg_basebackup -D /usr/local/postgresql/data -h 192.168.79.110 -p 5432 -U replica -X stream -Pv -R
从库先备份,备份完了之后需要去修改

pg_recovery.conf

在primary_conninfo参数里面加:

application_name=S1

S1就是我设置的强同步node

S2就是预备库

然后启动即可。

3.2、查看:

主:

select * from pg_stat_replication ;

可见图内sync就是强同步节点。

从:

select * from pg_stat_wal_receiver;

 

3.3、测试

zcjcs表试试

主:

S1:

S2:

 

 

四、强同步参数理解 

4.1、参数synchronous_standby_names:


(同步备库的名字)
    控制事务提交时是否需要等待wal recard 被复制到standby servers。
    默认为空,如果为空的话,则下面前4项都为'无备库等wal刷盘'状态)

语法:
~~[FIRST] num_sync (standby_name[,....]
~~ANY num_sync (standby_name[,....])
~~standby_name[,...]        这种等于FIRST1
    如:FIRST 3(s1,s2,s3,s4)    这样就会优先从前往后算3个,同步数据库(强一致sync状态)
                            S4就是潜在备库(potential状态),当sync的备库断掉的话,会自动补上。
                            (平时是async异步状态)
                            sync_state里有分别
                            (select usename,application_name,client_addr,sync_state from pg_stat_replication;)
       ANY 任意几个


4.2、参数synchronous_commit


向客户端返回success信息的参数

    on            (默认):两种情况:
                                无备库,则等主库wal刷到磁盘后,主库才可以向客户端提交
                                有备库,则需要备库从os cache缓存,刷到磁盘,主库才可以向客户端提交
                                       有两份持久化wal日志
    local               :保证本机wal日志刷新到磁盘,主库才可以向客户端提交
                                不管备库状态,
                                至少可以保证有一份wal持久化日志
    remote_write        :等主库wal刷到磁盘后,
                                同时日志传递到备库的os cache缓存中,
                                (但是还未刷盘),主库才可以向客户端提交
                                不能避免操作系统崩溃,因为在os cache中,没有真正进入磁盘
    remote_apply        :完全同步,
                                等主库wal刷到磁盘后,
                                备库启动startup一个进程,在内存里重放,
                                并且到os cache缓存,且刷盘,主库才可以向客户端提交
                                有两份持久化wal日志
                                也就是说remote_apply的情况下,
                                    主库做了insert,客户端收到信息后,并且可以在从库查询到,因为已经回放
                        (前4种都是缺保本地WAL刷盘)
    off                    :异步模式
                                数据只写到wal buffer里面,不写到磁盘,主库就向客户端提交
                                数据库忽然崩溃的话,会丢失数据,因为没写到磁盘里。
                                但是能保证数据一致

 

五、强同步从库挂掉时状态

从库如果挂了主库就没法增删改
    此时看锁状态
    select pid,query,wait_event,wait_event_type from pg_stat_activity;
                (wait_event :Syncrep             等待返回  )
                (            walsendermain        流复制发送)

5.1、测试1、:

我先把node S1 模拟宕机。

 

可见此时备库从potential 潜在备库变为sync强同步状态。

这是因为我配置的是 FIRST 1 (S1,S2)

当S1挂掉,备用库就会去充当S1的角色。

5.2、测试2、:

 我将主库的 FIRST 1 (S1,S2)

改为  FIRST 2(S1,S2)

查看参数为pg_ctl reload就可以生效

 此时两个节点都为sync强同步状态

于是我模拟挂掉一个节点

再次执行插入就一直在等待

此时我再打开一个窗口 去主库查看锁状态。

 

 

可见此时状态为:wait_event :Syncrep             等待返回

 等我再次开启从库时,立刻插入完毕。

本次实验完成。

<think>好的,用户问的是关于PostgreSQL的级联流复制配置。首先,我需要确认用户的需求是什么。级联流复制通常用于构建多层复制结构,可能用户需要扩展读取能力或者实现更复杂的高可用架构。接下来,我得回想下级联复制的基本概念,从结构中的中间节点作为级联节点,既接收来自节点的复制,又将数据传递给下游节点。 用户可能已经了解基本的流复制配置,现在想进步设置级联。我需要分步骤说明配置过程,包括节点、级联节点和下游节点的设置。需要调关键配置文件如postgresql.conf和recovery.conf的修改,比如wal_level、max_wal_senders、hot_standby等参数。 还要考虑权限和用户设置,比如复制用户的权限,确保节点允许级联节点连接,级联节点也要允许下游节点连接。可能用户会遇到连接问题,所以需要提醒pg_hba.conf的配置,添加正确的条目允许复制连接。 另外,需要解释级联复制的工作流程,节点发送WAL到级联节点,级联节点再转发到下游节点。可能还需要提到监控和故障转移的注意事项,比如使用repmgr或Patroni工具来管理级联结构,确保高可用性。 用户可能对配置步骤的具体细节有疑问,比如如何设置recovery.conf中的primary_conninfo和standby_mode。需要给出示例配置,确保用户能正确填写连接信息。同时,要提醒测试步骤,比如检查复制状态、验证数据致性,以及常见问题的排查方法,比如日志检查和网络配置验证。 最后,用户可能需要了解级联复制的优点和潜在风险,比如延迟增加或故障影响范围。相关问题部分需要涵盖配置验证、故障处理、性能优化等方面,帮助用户全面掌握级联复制的配置和管理。</think>PostgreSQL级联流复制(Cascading Replication)通过多级复制链实现高效的数据同步,以下是完整配置步骤: --- ### 、架构说明 ``` 节点(Primary) → 级联节点(Cascade Standby) → 下游节点(Downstream Standby) ``` - 级联节点既作为节点的从库,又作为下游节点的库 - 降低节点直接连接压力,适合跨地域部署场景 --- ### 二、节点配置(Primary) 1. **修改postgresql.conf** ```conf wal_level = replica # 启用WAL归档 max_wal_senders = 10 # 根据级联层级调整 max_replication_slots = 5 # 预留复制槽 hot_standby = on # 允许只读查询 ``` 2. **配置pg_hba.conf** ```conf # 允许级联节点进行复制连接 host replication replica_user 192.168.1.100/32 scram-sha-256 ``` 3. **创建复制用户** ```sql CREATE USER replica_user REPLICATION LOGIN ENCRYPTED PASSWORD 'secure_pass'; ``` --- ### 三、级联节点配置(Cascade Standby) 1. **基础备份创建** ```bash pg_basebackup -h primary_ip -D /data/cascade -U replica_user -P -R -X stream ``` - `-R` 自动生成recovery.conf - `-X stream` 启用流复制 2. **修改recovery.conf**(自动生成后调整) ```conf standby_mode = 'on' primary_conninfo = 'host=primary_ip port=5432 user=replica_user password=secure_pass' primary_slot_name = 'cascade_slot' # 可选:绑定复制槽 trigger_file = '/failover_trigger' # 可选:故障切换触发文件 ``` 3. **新增级联转发配置** ```conf # 启用WAL流转发 max_wal_senders = 5 wal_keep_segments = 512 # 确保足够WAL日志保留 ``` --- ### 四、下游节点配置(Downstream Standby) 1. **基础备份来源级联节点** ```bash pg_basebackup -h cascade_ip -D /data/downstream -U replica_user -P -R -X stream ``` 2. **下游recovery.conf** ```conf standby_mode = 'on' primary_conninfo = 'host=cascade_ip port=5432 user=replica_user password=secure_pass' recovery_min_apply_delay = 300 # 可选:延迟复制 ``` --- ### 五、关键验证步骤 1. **检查复制链状态** ```sql -- 节点查询 SELECT * FROM pg_stat_replication; -- 级联节点查询 SELECT * FROM pg_stat_wal_receiver; ``` 2. **验证级联转发能力** ```bash # 在级联节点查看连接 SELECT application_name, state FROM pg_stat_replication; ``` 3. **测试故障转移** ```bash # 触发级联节点切换 touch /failover_trigger # 验证下游节点是否自动连接新库 ``` --- ### 六、优化建议 | 参数 | 优化方向 | 说明 | |------|----------|------| | `wal_sender_timeout` | 调整超时阈值 | 避免网络波动导致连接中断 | | `max_logical_replication_workers` | 支持逻辑复制 | 需配合逻辑解码 | | `archive_mode` | 启用归档 | 防止WAL文件丢失导致断链 | | `synchronous_commit` | 设置同步级别 | 影响数据致性与性能 | --- ### 七、故障处理要点 1. **断链恢复** - 检查WAL日志断点:`pg_waldump` - 重建断链节点:`pg_rewind`或重新basebackup 2. **复制延迟优化** - 增加`wal_keep_segments` - 使用SSD提升IO性能 - 启用压缩:`wal_compression = on` 3. **拓扑调整** - 动态切换上游:修改`primary_conninfo`并重启 - 拆分级联节点:升级为独立库(需执行`promote`) --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值