PostgreSQL WAL 日志发展史 - pg7

文章目录

一、pg7.1 开天辟地

7.1 是 PostgreSQL 国际社区文档中提供详细资料的第一个版本,因为够完整也够简单,所以选择从 pg7.1 开始介绍

上图描述了 wal 日志的本职工作,PostgreSQL 在执行数据修改操作时,修改的数据在写入磁盘前要先将修改的内容写入 wal 日志,如此就可以不必时时地将共享缓存中的数据刷新到磁盘中,这样做的目的是以 wal 日志的顺序写入代替数据文件的随机写入来提升性能,如果数据库发生崩溃,可以从 wal 日志获取共享缓存中未写入磁盘的数据

1、WAL_BUFFERS

wal 日志缓冲区大小,用于减少磁盘 I/O 次数,提升性能

注意:

  • COMMIT 操作会触发一次对 wal_buffers 的强制刷盘,为了保证 ACID 中的 "D"(Durability,持久性),确保数据不会因系统崩溃而丢失,而且这还是一个同步(synchronous_commit)操作,会短暂阻塞事务直到 I/O 完成
  • XLOG_BLCKSZ(wal 日志基本单位)不是一个 GUC 参数,一般是编译数据库时通过 configure 命令指定,pg11(包含)之后,可以通过 initdb 命令指定

2、FSYNC

确保 wal 日志,或者其他数据文件安全写入磁盘

3、WAL_SYNC_METHOD

这个参数是对fsync参数的补全,它指定了保证数据写入持久化存储的方法。

4、COMMIT_DELAY & COMMIT_SIBLINGS

我们知道 COMMIT 操作会触发一次对 wal_buffers 的强制刷盘,期间 PostgreSQL 又做了一点小动作来提升性能:

  • commit_delay:事务提交后允许 wal 缓存延迟刷写的时间,这个延迟的目的是想等一下并行执行的兄弟事务,等兄弟事务完成提交后,一起将 wal 日志刷盘,如果兄弟事务超过 commit_delay 时间还未提交,那么当前进程就完成 wal 日志刷写
  • commit_siblings:当前事务做这个等待的条件,如果并行执行的兄弟事务小于 commit_siblings,那当前事务就不做等待了

可能文字描述比较难懂,举个例子:小明(事务)放学(提交)要打车回家(刷盘),他发现有顺路的其他班级的同学(兄弟事务)没有放学,就想等几个人一起平摊打车的费用,结果发现在上课的同学太少了(commit_siblings),就想等这么长时间省这么点钱不划算,就自己走了(刷磁);发现还在上课的同学很多,就想等一段时间(commit_delay)吧,等到这个时间长度带上下课的同学就走

注意:pg8.3 增加了可以定时刷写 wal 日志的进程 walwriter,该策略也因此改变

5、WAL_DEBUG

开启 wal debug 的参数,可以不用关注它

6、WAL_FILES

  • > 0:做检查点时会预先创建 wal_files 数量的 wal 段备用
  • = 0:会一个一个地创建 wal 段

注意:pg7.3 删除了该参数,改为另一种 wal 日志的预生成方法

7、CHECKPOINT_TIMEOUT

PostgreSQL 执行一次 checkpoint 的时间间隔,该参数跟 wal 关系没那么大,因为与下面的参数 checkpoint_segment 有相似的功能,都是触发 checopint 的时机,所以也写到了这里

8、CHECKPOINT_SEGMENT

PostgreSQL 执行一次 checkpoint 的 wal 段间隔,从上一次 checkpoint 开始,PostgreSQL 在写了一定数量的 wa l段后,会再次触发 checkpoint

二、pg7.3 改变 wal 预生成方式

此版本在 pg7.1 基础上做了微小的改变,主要是改变了预生成 wal 段的方法

checkpoint 时不再预生成 wal 段,改为了新的策略维护 wal 生成目录中的 wal 段:

  1. wal 段的数量原则上不超过 2 * checkpoint_segments + 1
  2. 一个流量高峰可能会导致 backend 极速生成 wal 日志,可能会将 wal 段数量增加到 2 * checkpoint_segments + 1 以上
  3. 做检查点时,如果 wal 段数量超限,会将超限的 wal 段删除, 如果 wal 段数量不超限,会将旧的 wal 段改名为将来的 wal 段。

因此参数 wal_files 不再使用,在该版本中被移除了,当然这个 wal 段的管理方式在 pg9.5 又有所变化

三、pg7.4 增加便利性 warning

此版本没有功能性的变化,只是增加了一个 warning 参数 checkpoint_warning

CHECKPOINT_WARNING

如果两次因为参数 checkpoint_segmet 产生的 checkpoint 的时间间隔小于 checkpoint_warning 值,会报一个 warning,用于提醒用户增大 checkpoint_segmet 值

相关推荐
故乡dee云1 小时前
AWS 产品太多不会选?按“网站、数据库、文件、日志”4 类需求快速匹配
数据库·云计算·aws
曹牧3 小时前
C#:问号
前端·数据库·c#
奇树谦3 小时前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第五篇:现代数据库横向对比
数据库·lsm-tree
李白客3 小时前
分布式集群与数据库产业:从单机到集群的架构跃迁与市场重构
数据库·分布式·架构
福大大架构师每日一题4 小时前
Redis 8.10.0 正式发布:紧凑哈希、批量导入、备份恢复、流与时序能力全面升级
数据库·redis·哈希算法
雨晨源码(同名B站)4 小时前
基于深度学习YoloV11农业病害虫害检测系统 智慧农业信息化综合管理平台 (附源码+lw文档+ppt)
数据库·人工智能·深度学习·yolo·信息可视化
DBA小马哥5 小时前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语
数据库·算法·embedding
云和数据.ChenGuang5 小时前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
祈禾5 小时前
Redis三大特殊数据类型
运维·服务器·数据库·redis·笔记·缓存
东方护航数据恢复(深圳)5 小时前
MySQL_Oracle数据库崩溃修复全攻略_东方护航数据恢复深圳店
数据库·mysql·oracle