PostgreSQL WAL 日志发展史 - pg7
文章目录
- 一、pg7.1 开天辟地
- 1、WAL_BUFFERS
- 注意:
- 2、FSYNC
- 3、WAL_SYNC_METHOD
- 4、COMMIT_DELAY && COMMIT_SIBLINGS
- 5、WAL_DEBUG
- 6、WAL_FILES
- 7、CHECKPOINT_TIMEOUT
- 8、CHECKPOINT_SEGMENT
- 二、pg7.3 改变 wal 预生成方式
- 三、pg7.4 增加便利性 warning
- CHECKPOINT_WARNING
一、pg7.1 开天辟地
7.1 是 PostgreSQL 国际社区文档中提供详细资料的第一个版本,因为够完整也够简单,所以选择从 pg7.1 开始介绍
上图描述了 wal 日志的本职工作,PostgreSQL 在执行数据修改操作时,修改的数据在写入磁盘前要先将修改的内容写入 wal 日志,如此就可以不必时时地将共享缓存中的数据刷新到磁盘中,这样做的目的是以 wal 日志的顺序写入代替数据文件的随机写入来提升性能,如果数据库发生崩溃,可以从 wal 日志获取共享缓存中未写入磁盘的数据
1、WAL_BUFFERS
wal 日志缓冲区大小,用于减少磁盘 I/O 次数,提升性能
注意:
- COMMIT 操作会触发一次对 wal_buffers 的强制刷盘,为了保证 ACID 中的 “D”(Durability,持久性),确保数据不会因系统崩溃而丢失,而且这还是一个同步操作,会短暂阻塞事务直到 I/O 完成
- XLOG_BLCKSZ(wal 日志基本单位)不是一个 GUC 参数,一般是编译数据库时通过 configure 命令指定,pg11(包含)之后,可以通过 initdb 命令指定
2、FSYNC
确保 wal 日志,或者其他数据文件安全写入磁盘
3、WAL_SYNC_METHOD
这个参数是对fsync参数的补全,它指定了保证数据写入持久化存储的方法。
4、COMMIT_DELAY && COMMIT_SIBLINGS
前面提到刷写wal缓存的策略注,在这里描述一下
①在wal缓存写满时,会触发刷写wal缓存。
②在事务提交时会触发刷写wal缓存。在事务提交刷写缓存时,PostgreSQL又做了一点小动作,来提升性能:commit_delay指事务提交之后允许wal缓存延迟刷写的时间,这个延迟的目的是想等一下并行执行的兄弟事务,等兄弟事务完成提交后,一起将wal日志刷写入磁盘,如果兄弟事务超过这个commit_delay时间还未提交,那么当前进程就完成wal刷写。commit_siblings意义是当前事务做这个等待的条件,如果并行执行的兄弟事务小于commit_siblings,那当前事务就不做等待了。
注:在8.3版本增加了walwriter进程可以定时刷写wal日志,这个策略也因此改变
可能文字描述后比较难懂,举个例子:小明(事务)放学(提交)要打车(刷写)回家,他发现有顺路的其他班级的同学(兄弟事务)没有放学,就想等几个人一起平摊打车的费用。发现在上课的同学太少了(commit_siblings),就想等这么长的时间省一点点钱不划算,就自己走了(刷写磁盘);发现还在上课的同学很多,就想等一段时间吧(commit_delay),等到这个时间长度带上下课的同学就走。
5、WAL_DEBUG
开启wal debug的参数,可以不用关注它。
PostgreSQL通常使用checkpoint进程来清理一些废弃的文件,对于wal文件来说,会在checkpoint时生成一些备用的wal文件或者清理旧的不使用的wal文件,且看相关配置[GUC2]。注意此处描述的为7.1版本的情况,一些参数已经不适用于最新的PostgreSQL版本。
6、WAL_FILES
在7.1版本的PostgreSQL中,wal_files参数如果大于0,在做检查点时会预先创建wal_files数量的wal段备用,wal_files参数等于0时,会一个一个的创建wal段。这个参数在7.3版本就删除了,换为另一种wal日志的预生成方法。
7、CHECKPOINT_TIMEOUT
PostgreSQL执行一次checkpoint的时间间隔,此处这个参数跟wal关系没有那么大,因为这个参数预下面的checkpoint_segment有相似的功用,他们都是触发checopint的时机,所以也写到了这里。
8、CHECKPOINT_SEGMENT
PostgreSQL执行一次checkpoint的wal段间隔,从上一次checkpoint开始,PostgreSQL在写了一定数量的wal段后,会再次触发checkpoint。
二、pg7.3 改变 wal 预生成方式
此版本在 7.1 版本基础上做了微小的改变,主要是改变了预生成 wal 段的方法
在checkpoint时不再预生成wal段,改为了新的策略维护wal生成目录中的wal段:
- wal段的数量原则上不超过2 * checkpoint_segments + 1
- 一个流量高峰可能会导致backend极速生成wal日志,可能会将wal段数量增加到2 * checkpoint_segments + 1以上
- 做检查点时,如果wal段数量超限,会将超限的wal段删除, 如果wal段数量不超限,会将旧的wal段改名为将来的wal段。
因此 WAL_FILES 参数不再使用,在这个版本中被移除了。当然这个 wal 段的管理方式在 pg9.5 又有所变化
三、pg7.4 增加便利性 warning
此版本没有功能性的变化,只是增加了一个 warning 参数 checkpoint_warning
CHECKPOINT_WARNING
如果两次因为CHECKPOINT_SEGMENT参数产生的checkpoint的时间间隔小于checkpoint_warning值,会报一个warning,提醒用户增加CHECKPOINT_SEGMENT的数值