标签
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 等待信号(针对当前处于等待中的进程)。<