1、checkpoint是什么?

又名检查点,其实可以看成是个时间戳,这个时间戳之前的所有脏数据都已经写盘。


2、checkpoint的目的或者好处是什么?

为了缩短崩溃恢复时间。


3、怎么理解缩短数据库崩溃恢复的时间?

在pg中,用户进行更新操作,并不会直接对磁盘上的数据文件进行io操作,而是先修改内存中的数据,然后写入wal文件,所以内存中就有会未刷到磁盘上的脏页,如果这个时候数据库突然宕机,这部分数据就会丢失了。

那么数据库在重新启动时,就需要利用wal文件里的数据,对数据进行恢复,但是真正从哪个位置开始恢复,就需要借助checkpoint的机制。


因为上面我们提到,checkpoint之前的所有脏数据都已经写盘。基于这个原则,那么做实例恢复的时候,只需要重演检查点之后的wal日志记录即可。


4、能不能详细介绍下checkpoint的具体过程?

checkpoint被触发后,它会经历以下几个过程。

  1. 将共享内存中的脏页刷出到磁盘。

  2. 生成checkpoint记录到xlog中(注意看这里,Checkpoint 本身也会被记录到XLOG)

  3. 更新pg_control文件,其中有checkpoint的lsn信息(后期恢复可以从这个文件读取checkpoint的lsn)


5、checkpoint的触发时机是什么?


  1. 超级用户(其他用户不可)执行CHECKPOINT命令

  2. 数据库shutdown

  3. 数据库recovery完成

  4. XLOG日志量达到了触发checkpoint阈值

  5. 周期性地进行checkpoint

  6. 需要刷新所有脏页


备注:其中周期性地进行checkpoint是由pg的辅助进程checkpointer进程完成的,它会对不断检测周期时间以及上面的XLOG日志量阈值是否达到,而周期时间以及XLOG日志量阈值可以通过参数来设置大小。


6、与checkpoint相关的系统参数(最新版)有哪些?

可参考官网:https://www.postgresql.org/docs/11/runtime-config-wal.html


checkpoint_timeout系统自动执行checkpoint之间的最大时间间隔。系统默认值是5分钟。

checkpoint_completion_target该参数表示checkpoint的完成时间占两次checkpoint时间间隔的比例,系统默认值是0.5,也就是说每个checkpoint需要在checkpoints间隔时间的50%内完成。


checkpoint_flush_after:默认256KB。在执行检查点时,只要写入的数据量超过此,就强制刷盘。这样做将限制os page cache的脏数据量,从而减少在检查点最后执行fsync或操作系统在后台大批量写回数据时出现io性能的问题


max_wal_size:WAL日志超过max_wal_size就触发检查点开始工作。这是个软限制,PostgreSQL尽量不超过此值,但会在比如高负载和wal_keep_segments值较大的时候超过,默认1GB,推荐RAM1/2


min_wa_size:WAL磁盘使用率低于这个设置,旧的WAL文件就会被回收,而不是删除,确保预留足够的WAL空间处理WAL使用中的峰值,推荐RAM的1/8


7、checkpoint带来的影响是什么?

前面我们提到checkpoint的好处是缩短数据库崩溃恢复的时间。

其实还有个好处是标示检查点之前的wal的日志可以被回收。

那么它有没有坏处呢?

答案是有。


因为频繁地冲刷脏数据页到磁盘所带来的系统开销是很大的,尤其是在业务高峰期,可能会引起I/O峰值,导致“卡死”的现象



8、我们应该怎么合理设置checkpoint的调度频率?


  1. 大部分的checkpoint是基于时间的 checkpoint_timeout,取15 ~ 30min比较常见。

  2. 选定好时间间隔后,选择max_wal_size来估计wal大小。

  3. 设置checkpoint_completion_target,这样内核有足够的时间来刷盘。

  4. 修改系统参数vm.dirty_background_bytes,这样OS不会将大部分的脏页一次写盘。(注:这一点不是很懂,后面再看看)

https://mp.weixin.qq.com/s/4goZkXEIv1MGBNZvVA-z1g