1、checkpoint是什么?
又名检查点,其实可以看成是个时间戳,在这个时间戳之前的所有脏数据都已经写盘。
2、checkpoint的目的或者好处是什么?
为了缩短崩溃恢复时间。
3、怎么理解缩短数据库崩溃恢复的时间?
在pg中,用户进行更新操作,并不会直接对磁盘上的数据文件进行io操作,而是先修改内存中的数据,然后写入wal文件,所以内存中就有会未刷到磁盘上的脏页,如果这个时候数据库突然宕机,这部分数据就会丢失了。
那么数据库在重新启动时,就需要利用wal文件里的数据,对数据进行恢复,但是真正从哪个位置开始恢复,就需要借助checkpoint的机制。
因为上面我们提到,checkpoint之前的所有脏数据都已经写盘。基于这个原则,那么做实例恢复的时候,只需要重演检查点之后的wal日志记录即可。
4、能不能详细介绍下checkpoint的具体过程?
checkpoint被触发后,它会经历以下几个过程。
将共享内存中的脏页刷出到磁盘。
生成checkpoint记录到xlog中(注意看这里,Checkpoint 本身也会被记录到XLOG)
更新pg_control文件,其中有checkpoint的lsn信息(后期恢复可以从这个文件读取checkpoint的lsn)
5、checkpoint的触发时机是什么?
超级用户(其他用户不可)执行CHECKPOINT命令
数据库shutdown
数据库recovery完成
XLOG日志量达到了触发checkpoint阈值
周期性地进行checkpoint
需要刷新所有脏页
备注:其中周期性地进行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,推荐RAM的1/2
min_wa_size:WAL磁盘使用率低于这个设置,旧的WAL文件就会被回收,而不是删除,确保预留足够的WAL空间处理WAL使用中的峰值,推荐RAM的1/8
7、checkpoint带来的影响是什么?
前面我们提到checkpoint的好处是缩短数据库崩溃恢复的时间。
其实还有个好处是标示检查点之前的wal的日志可以被回收。
那么它有没有坏处呢?
答案是有。
因为频繁地冲刷脏数据页到磁盘所带来的系统开销是很大的,尤其是在业务高峰期,可能会引起I/O峰值,导致“卡死”的现象。
8、我们应该怎么合理设置checkpoint的调度频率?
大部分的checkpoint是基于时间的 checkpoint_timeout,取15 ~ 30min比较常见。
选定好时间间隔后,选择max_wal_size来估计wal大小。
设置checkpoint_completion_target,这样内核有足够的时间来刷盘。
修改系统参数vm.dirty_background_bytes,这样OS不会将大部分的脏页一次写盘。(注:这一点不是很懂,后面再看看)
https://mp.weixin.qq.com/s/4goZkXEIv1MGBNZvVA-z1g