在PostgreSQL的逻辑复制中,尤其是当使用PGReplicationStream
相关的接口或者概念时,LastReceiveLSN
、AppliedLSN
和FlushedLSN
这几个术语代表了复制过程中的不同阶段和状态,它们反映了WAL(Write-Ahead Log)在从库上的处理进度。下面分别解释这三个概念及其区别与联系:
- LastReceiveLSN(最近接收LSN):
- 这个LSN表示从主库接收到的最新的WAL记录的位置。换句话说,这是复制流中最后一个被从库成功接收的日志条目的LSN。它体现了网络传输层面的最新进度,即复制客户端已经读取到的日志位置。
- FlushedLSN(已刷盘LSN):
- 它指的是从库上已经写入并被刷到磁盘上的WAL记录的位置。在PostgreSQL中,为了确保数据的持久性,WAL记录不仅被写入内存缓冲区,还会定期刷盘(flush)到持久存储中。一旦数据被刷盘,即使系统发生崩溃,这部分数据也不会丢失。因此,
FlushedLSN
标志着在灾难恢复场景下能确保安全恢复的点。
- AppliedLSN(已应用LSN):
- 这个LSN表示从库上已经被实际应用到数据库状态中的WAL记录的位置。换句话说,它是数据变更已经被反映到数据库的实际数据页上的日志位置。在逻辑复制中,这意味着所有在此LSN之前的数据更改都已经在从库上执行完毕,数据库状态与主库在这个LSN时刻保持一致。
联系与区别:
- 这三个LSN共同描述了WAL记录从主库到从库的整个处理流程,从接收、安全存储到实际应用,形成了一个递进的序列:
LastReceiveLSN
<=FlushedLSN
<=AppliedLSN
- 它们反映了复制的异步特性,其中
LastReceiveLSN
是最先变化的,表示数据流动的前沿;AppliedLSN
则是最终状态,表示数据已经完全被处理并应用,中间的FlushedLSN
是确保数据安全性的关键点。 - 在监控复制延迟或者健康状况时,比较这些LSN与主库的当前LSN可以提供关于复制延迟时间、潜在数据丢失风险等重要信息。
综上所述,这三个LSN指标紧密相关,共同确保了复制过程的可靠性和数据的一致性,同时也为性能调优和故障排查提供了关键依据。