在不支持流复制的时期,PostgreSQL 数据库通过同步插件、物理文件复制、归档日志同步的方式实现主从集群搭建。其中,基于归档日志回放的方式类似 Oracle DG 的archive原理,现在也都是支持的,在某些特殊的应用场景中非常实用。
PostgreSQL自从2010年推出的9.0版本开始,支持流式物理复制。用户可以通过流式物理、复制构建只读备库(主备物理复制,块级别一致)。流式物理复制可以实现极低的延迟(通常在1ms以内)。
2011年推出的PostgreSQL 9.1支持同步复制,当时只支持一个同步流复制备节点(例如配置了3个备节点,只有一个是同步模式的,其他都是异步模式的)。
在同步复制模式下,当用户提交事务时,需要等待这笔事务的WAL日志复制到同步流复制备节点,才会给客户端返回提交成功的ACK。
在同步模式下,可以确保数据零丢失(只要客户端收到了事务提交成功的 ACK,这笔事务的WAL就有两份)。
2012年推出的PostgreSQL 9.2支持级联流复制,即备库还可以再连接备库。
级联流复制特别适合跨机房使用,例如主库在A机房,备库在B机房,当B机房需要建立多个备库时,其只需要建立一个直连主库的备库,其他备库可以通过 B 机房的备库级联产生,从而减少网络开销。
PostgreSQL 9.2除了支持级联流复制,还支持虚拟备库。什么是虚拟备库呢?就是只有WAL,没有数据文件的备库。
通过虚拟备库,可以流式地接收WAL,进行实时的流式WAL归档,提高备份或归档的实时性。
2014年推出的PostgreSQL 9.4在WAL中增加了逻辑复制需要的基础信息,通过插件可以实现逻辑复制。
逻辑复制可以做到对主库的部分复制,例如表级复制,而不是整个集群的块级一致复制。
逻辑复制的备库不仅是只读的,而且可以执行写操作。
2016年推出的PostgreSQL 9.6通过synchronous_commit参数,可以配置事务的同步级别。