关键字:
WAL、流复制
WAL日志
预写式日志(Write-Ahead Logging(WAL))是保证数据完整性、实现事务日志的一种标准方法。当发生故障时,数据库服务器能够通过重放事务日志中的变更与行为来恢复数据库集群。
从数据安全角度来说,当集群节点宕机时,可通过WAL日志尽最大努力恢复节点数据;
从数据库性能角度来说,wal日志先行,先写日志再将数据落盘达到提高数据库整体性能的目的。
如下图所示,为wal日志的变更逻辑
- 当需要更新数据时,先将变更后的内容写入WAL Buffer、再将更新后的数据写入Data Buffer
- 当提交变更时(commit),会将WAL Buffer刷新到Disk,Data Buffer写磁盘会推迟
- 当checkpoint时,会将Data Buffer刷新到Disk
WAL流复制启动
如何在主备节点中实现wal日志同步?主要是通过以下组件:
Walsender(WAL发送器)进程将WAL数据发送到备库
Walreceiver(WAL接收器)接收这些数据,在备库上的startup进程重放这些数据
- 启动主、备服务器
- 备库服务器启动startup进程
- 备库服务器启动walreceiver进程
- Walreceiver向主库服务器发送连接请求。如果主库尚未启动,walreceiver会定期重发该请求
- 当主库服务器接收到连接请求时,将启动walsender进程,建立walsender和walreceiver之间的TCP连接
- walreceiver 发送备节点最新的 LSN
- 如果备库最新 LSN 小于主库最新 LSN(落后),walsender 会将前一个 LSN 到后一个 LSN 之间 的 wal 数据发送到 walreceiver。这个阶段就是备库追赶主库的阶段
- 流复制开始工作
通过重启备节点,查看数据库实例当中的sys_stat_replication()中的sync_state字段可以看到三种流复制状态的转变也就是启动、追赶、流复制。