标签

PostgreSQL , 同步 , 半同步 , 流复制

背景

两节点HA架构,如何做到跨机房RPO=0(可靠性维度)?同时RTO可控(可用性维度)?

半同步是一个不错的选择。

1、当只挂掉一个节点时,可以保证RPO=0。如下:

主 -> 从(挂)

主(挂) -> 从

2、当一个节点挂掉后,在另一个节点恢复并开启同步模式前,如果在此期间(当前)主节点也挂掉,(虽然此时从库活了(但由于还未开启同步模式)),则RPO>0。 如下:

主(挂) -> 从(OPEN,但是之前从挂过,并且还还未转换为同步模式)

与两个节点同时挂掉一样,RPO>0

3、如何保证RTO时间可控?

我们知道,在同步模式下,事务提交时需要等待sync STANDBY的WAL复制反馈,确保事务wal落多个副本再反馈客户端(从动作上来说,先持久化主,然后同步给sync从,并等待sync从的WAL 同步位点的反馈),当STANDBY挂掉时,等待是无限期的,所以两节点的同步复制,无法兼顾可用性(RTO)。那么怎么兼顾可用性呢?

可以对(pg_stat_activity)等待事件的状态进行监测,如果发现同步事务等待超过一定阈值(RTO阈值),则降级为异步模式。

降级不需要重启数据库。

3.1 改配置

3.2 reload (对已有连接和新建连接都会立即生效)。

3.3 cancel 等待信号(针对当前处于等待中的进程)。

4、降级后,什么情况下恢复为同步模式?(升级)

同样可以对(pg_stat_replication)状态进行监测,当sync standby处于streaming状态时,则可以转换为同步模式。

升级不需要重启数据库。

4.1 改配置

4.2 reload。立即生效 (对已有连接和新建连接都会立即生效)。

涉及技术点

1、事务提交参数

synchronous_commit

on, remote_apply, remote_write, local

2、同步配置参数

synchronous_standby_names

[FIRST] num_sync ( standby_name [, ...] )

ANY num_sync ( standby_name [, ...] )

standby_name [, ...]

ANY 3 (s1, s2, s3, s4)

FIRST 3 (s1, s2, s3, s4)

* 表示所有节点

3、活跃会话,查看事务提交时,等待事件状态

pg_stat_activity

等待事件

wait_event='SyncRep'

4、流状态,pg_stat_replication

sync_state='sync'

state

text

Current WAL sender state. Possible values are:

startup: This WAL sender is starting up.

catchup: This WAL sender's connected standby is catching up with the primary.

streaming: This WAL sender is streaming changes after its connected standby server has caught up with the primary.

backup: This WAL sender is sending a backup.

stopping: This WAL sender is stopping.

实践

环境

1、主

postgresql.conf

synchronous_commit = remote_write

wal_level = replica

max_wal_senders = 8

synchronous_standby_names = '*'

2、从

recovery.conf

restore_command = 'cp /data01/digoal/wal/%f %p'

primary_conninfo = 'host=localhost port=8001 user=postgres'

同步降级、升级 - 实践

关闭standby,模拟备库异常。看如何实现半同步。

模拟STANDBY恢复,看如何模拟升级为同步模式。

1、监测 pg_stat_activity,如果发现事务提交等待超过一定阈值(RTO保障),降级

select max(now()-query_start) from pg_stat_activity where wait_event='SyncRep';

2、查看以上结果等待时间(RTO保障)

当大于某个阈值时,开始降级。

注意NULL保护,NULL表示没有事务处于 SyncRep 等待状态。

3、降级步骤1,修改synchronous_commit参数。改成WAL本地持久化(异步流复制)。

alter system set synchronous_commit=local;

4、降级步骤2,生效参数,RELOAD

select pg_reload_conf();

5、降级步骤3,清空当前等待队列(处于SyncRep等待状态的进程在收到CANCEL信号后,从队列清空,并提示客户端,当前事务本地WAL已持久化,事务正常结束。)

select pg_cancel_backend(pid) from pg_stat_activity where wait_event='SyncRep';

6、收到清空信号的客户端返回正常(客户端可以看到事务正常提交)

postgres=# end;

WARNING: 01000: canceling wait for synchronous replication due to user request

DETAIL: The transaction has already committed locally, but might not have been replicated to the standby.

LOCATION: SyncRepWaitForLSN, syncrep.c:264

COMMIT

事务的redo信息已在本地WAL持久化,提交状态正常。

当前会话后续的请求会变成异步流复制模式(WAL本地持久化模式(synchronous_commit=local))。

如何升级?:

7、升级步骤1,监测standby状态,sync_state='sync'状态的standby进入streaming状态后,表示该standby与primary的wal已完全同步。

select * from pg_stat_replication where sync_state='sync' and state='streaming';

有结果返回,表示standby已经接收完primary的wal,可以进入同步模式。

8、升级步骤2,将事务提交模式改回同步模式( synchronous_commit=remote_write ,事务提交时,等sync standby接收到wal,并write。)

alter system set synchronous_commit=remote_write;

9、升级步骤3,生效参数,RELOAD (所有会话重置synchronous_commit=remote_write,包括已有连接,新建的连接)

select pg_reload_conf();

小结

1、在不修改PG内核的情况下,通过外部辅助监测和操纵(例如5秒监控间隔)),实现了两节点的半同步模式,在双节点或单节点正常的情况下,保证RPO=0,同时RTO可控(例如最长wait_event='SyncRep'等待时间超过10秒)。

2、内核修改建议,

降级:可以在等待队列中加HOOK,wait_event='SyncRep'等待超时后降级为异步。

升级:在wal_sender代码中加hook,监测到standby恢复后,改回同步模式。

参考

mysql半同步 rpo_PostgreSQL 双节点流复制如何同时保证可用性、可靠性(rpo,rto) - (半同步,自动降级方法实践)-阿里云开发者社区...相关推荐

  1. 海明距离mysql查询_海量数据,海明距离高效检索(smlar) - 阿里云RDS PosgreSQL最佳实践-阿里云开发者社区...

    标签 PostgreSQL , 海明距离 , smlar , GiST索引 背景 SimHash的应用 通过上面的步骤,我们可以利用SimHash算法为每一个网页生成一个向量指纹,那么问题来了,如何判 ...

  2. 物联网 mysql数据库优化_MySQL数据库优化大全方法汇总-阿里云开发者社区

    随着数据和负载增加,MySQL数据库会日渐缓慢,性能越来越差,用户体验也随之变差,所以数据库性能优化十分紧迫,云吞铺子分享MySQL数据库优化大全: MySQL数据库优化 云吞铺子先模拟一下数据库访问 ...

  3. mysql cluster 宕机 恢复_mysql cluster 集群恢复不起来,还请大神赐教?报错-问答-阿里云开发者社区-阿里云...

    mysql cluster 集群原本使用的几乎全是内存表,后来随着数据的增长,把大的内存表迁移到磁盘表了,之后集群出现6050错误,整个集群挂掉:之后重新启动集群一直启动不起来... ----以下是集 ...

  4. 博客同步至阿里云开发者社区,快来帮我涨人气吧

    博客同步至阿里云开发者社区,快来帮我涨人气吧! 直达链接! 直达链接! 直达链接! 直达链接! 直达链接! https://developer.aliyun.com/profile/sijaicxpx ...

  5. freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区

    Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...

  6. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...

    ORACLE MYSQL中join 字段类型不同索引失效的情况 重庆八怪 2016-12-29 780浏览量 简介: 关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACL ...

  7. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区

    关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...

  8. 阿里mysql数据库同步_如何对MySQL数据库中的数据进行实时同步-阿里云开发者社区...

    数据传输(Data Transmission) 支持以数据库为核心的结构化存储产品之间的数据传输. 它是一种集数据迁移.数据订阅及数据实时同步于一体的数据传输服务.数据传输致力于在公有云.混合云场景下 ...

  9. mysql数据漂移_数据库漂移-和数据库漂移相关的内容-阿里云开发者社区

    MySQL双主一致性架构优化 | 架构师之路 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点. 在一个My ...

最新文章

  1. msyql主从同步实践
  2. 【Linux学习】Linux系统管理2—作业调度
  3. LoadRunner学习第四天——检查点学习(转载)
  4. android http pos 请求和gson解析处理head头信息
  5. 普里姆(Prim)求最小生成树
  6. php dedecms 记录访问者ip,dedecms实现显示访问者ip地址的办法
  7. 三、 UIView封装的简单动画
  8. Enterprise Services (COM+)服务组件开发异常分析
  9. qwt的安装和移植-
  10. .NET Core 中读取appsettings.json配置文件的方法
  11. electron打包失败在下载nsis的地方
  12. 列生成(Column Generation)算法
  13. 智慧城市网络安全建设框架及实践
  14. 使用百度开发者工具 4.0 搭建专属的小程序 IDE
  15. 未能对git remote进行身份验证
  16. winrar破解注册
  17. 部分设计模式案例代码
  18. php聊天室发送表情,聊天室之表情发送
  19. PTA 7-1 奇偶数判断
  20. 面试总结+感悟+分享

热门文章

  1. Apache的三种MPM模式比较:prefork,worker,event
  2. 图解词嵌入、语言模型、Word2Vec
  3. 淘宝镜像使用 镜像切换
  4. 新书推荐 | 陈山枝博士团队力作《蜂窝车联网(C-V2X)》
  5. 用Hadoop,还是不用Hadoop?
  6. SylixOS 设备树
  7. yjk计算书_yjk计算书
  8. kc705 万兆以太网 ip 用法
  9. EMS企业微电网能效管理解决方案为工业能效提升行动计划提供助力
  10. 做职业监理师(九)——监理方如何审核《需求规格说明书》