预写式日志 Write Ahead Log、WAL,又称 WAL 日 志。WAL 日志是PostgreSQL 中十分重要的部分,相当于 Oracle 中的 redo 日志。PostgreSQL 使用 WAL 日志保存每一次的数据修改,这样保证了数据库即使意外宕机,也能利用它准确地恢复数据。
WAL 机制实际是在写数据的过程中加入了对应的写 WAL 的过程,步骤是先到 Buffer,再刷新到 Disk,具体如下:
Change 发生时:
● 先将变更后的内容记入WAL Buffer。
● 再将更新后的数据写入Data Buffer。
Commit 发生时:
● WAL Buffer刷新到Disk。
● Data Buffer写磁盘推迟。
Checkpoint 发生时。
● 将所有Data Buffer刷新到磁盘,如图6-5所示。
图 6-5 Daba Buffer 刷盘结构图
PostgreSQL 在 9.x 版本之后引入了主从的流复制机制,所谓流复制,就是备服务器通过 tcp 流从主服务器中同步相应的数据,主服务器在 WAL 记录产生时即将它们以流式传送给备服务器,而不必等到 WAL 文件被应用。
默认情况下流复制是异步的,在主服务器上提交一个事务与该变化在备 服务器上变得可见之间客观上存在短暂的延迟,但这种延迟相比基于文件的日志传送方式依然要小得多,在备服务器的能力满足负载的前提下延迟通常低于一秒。
在流复制中,备服务器比使用基于文件的日志传送具有更小的数据丢失窗口,不需要采用 archive_timeout 来缩减数据丢失窗口。
将一个备服务器从基于文件日志传送转变为基于流复制的步骤:把recovery.conf 文件中的 primary_conninfo 设置指向主服务器;设置主服务器配置文件的 listen_addresses 参数与认证文件即可。
PostgreSQL 物理流复制按照同步方式分为两类:
● 异步流复制。
● 同步流复制。
物理流复制具有以下特点:
● 延迟极低,不怕大事务。
● 支持断点续传。
● 支持多副本。
● 配置简单。
● 备库与主库物理完全一致,并支持只读。