我刚刚开始我的PostgreSQL之旅,立刻已经对高可用性有了要求,本文简单记录PG的HA特性,个别图片摘自油管high performance programming,版权为原作者所有。PG的架构果然高度和Oracle单机版本类似,尤其与Oracle的Data Guard一样,PostgreSQL也有一个纯数据库解决方案,称为预写日志(WAL)传送或物理复制。和Data Guard一样,这个解决方案的好处是减少了网络上所需的带宽,而且对于PostgreSQL来说,这个备用服务器也可以免费用于只读查询。
在PostgreSQL中,有两种复制特性:流式复制(物理复制)统一复制一个数据库集群,以及以表和数据库为单位进行复制的逻辑复制。
什么是流复制?
流式复制是PostgreSQL的标准特性,可以将主服务器上的更新信息实时传输到备服务器上,使主服务器和备服务器的数据库保持同步。下面的流复制功能为您的系统带来了巨大的HA收益。
故障转移:当主服务器发生故障时,备用服务器可以接管操作。PG是支持swtichover和failover的模式的,和ADG一样。

只读负载均衡:只读SQL处理可以分布在多台服务器上。

但这个特性需要利用一些3rd的插件

流复制机制
要了解流式复制的工作原理,让我们仔细看看要传输什么以及如何传输。
运送的是什么
PostgreSQL 将主服务器的更新信息保存为称为预写日志或 WAL 的事务日志,以准备崩溃恢复或回滚。流复制的工作原理是将WAL 实时传输或运送到备用服务器,并将其应用到备用服务器上。

WAL 如何传送和应用
WAL类似Oracle的redo日志。主服务器和备用服务器之间的 WAL 传送由主服务器上的WAL 发送进程执行到备用服务器上的WAL 接收进程。这些进程通过设置 postgresql.conf 和 pg_hba.conf 参数启动。

多机设置和级联设置
流式复制可以构建为 1:N 配置,其中只能配置一个主服务器,但可以设置多个备用服务器。将主服务器连接(从中传送 WAL)到所有备用服务器的配置称为多备用设置。您还可以构建一个级联设置,其中备用服务器连接(传送 WAL)到另一个备用服务器。

同步复制和异步复制
对于流复制,您可以为每个备用服务器选择同步或异步复制。本节描述每个的特征和配置的要点。
同步和异步复制的特点
同步复制和异步复制的区别是在主服务器上完成处理之前是否等待备用服务器的响应。根据您的操作选择配置,因为这会影响 SQL 处理的响应时间和高可用性。
同步复制
主服务器在完成进程之前等待备用服务器的响应。
因此,总响应时间包括日志传送时间。
由于 WAL 传送到备用服务器没有延迟,因此提高了备用服务器的数据新鲜度(可靠性)。
适用于故障转移和只读负载平衡操作。
异步复制(默认)
主服务器完成一个过程而不等待备用服务器的响应。
因此,总体响应时间与不使用流复制时的响应时间大致相同。
由于 WAL 传送及其在备用服务器上的应用(数据更新)是异步完成的,因此主服务器上的更新结果可能不会立即在备用服务器上可用。
根据故障转移的时间,数据可能会丢失。
适合复制到偏远地区进行灾难恢复。
同步/异步设置(synchronous_standby_names)
同步设置由主服务器上 postgresql.conf 中的 synchronous_standby_names 配置。如果有多个备用服务器,您可以指定要同步的服务器和COMMIT 的优先级顺序。未在此参数中指定的备用服务器将是异步的。
如下图,可以为同一个机房的主从设置为同步模式,来避免存储级的故障,跨机房则采用异步模式。这个和Oracle DG的设计思路是一样的。

同步模式不会丢数据,更长的延时
异步模式则可能在failover的情况下丢失数据库,但响应时间更好,应用程序不用等待备库的ack

当备库丢失了WAL日志,导致数据延迟后,PG甚至也支持从增量中去恢复备库,这一点非常管用。
总之PostgreSQL的复制机制和功能和Oracle dataguard高度类似,能够实现可靠的HA特性,但在可管理性,易用性,可追踪性,多样的功能上,和19c,23c等新版本存在着较大的差异。如果您只需要它实现一个HA复制系统,同时备库可读,根据业务场景也可以方便的应对灾难场景,进行快速failover或者switch over,PG它是可以实现的。
Oracle的ADG已经不再只是一个纯粹HA子系统了,在Oracle多租户架构下的PDB switchover,直接已经把Oracle的ADG的定位上升到云动力基座的地位,它和PG的复制功能实际已经有了理念上的代差。
但是PG的依然扮演着一个可靠的HA卫士,低调,可靠,且实用。
2022年12月24日





