Postgresql 的Checkpoint

本文深入解析了数据库Checkpoint机制,解释了Checkpoint如何通过确保数据一致性与完整性来缩短崩溃恢复时间。文章详细介绍了PostgreSQL中Checkpoint的触发条件,包括数据库关闭、恢复完成、超级用户命令、XLOG日志阈值及周期性触发。此外,还探讨了与Checkpoint相关的参数设置,如checkpoint_segments、checkpoint_timeout等,及其对系统性能的影响。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

Checkpoint是什么?

checkpoint又名检查点,一般checkpoint会将某个时间点之前的dirty data全部写出到磁盘,以实现数据的一致性与完整性。目前各个流行的关系型数据库都具备checkpoint功能,其主要目的是为了缩短crash recovery time,以Oracle为例,在进行数据恢复时,会以最近的checkpoint为参考点执行事务roll forward,然后对没有commit的事务进行roll back。而在WAL机制的浅析中,也提过PostgreSQL在崩溃恢复时会以最近的checkpoint为基础,不断应用这之后的WAL日志。机制大致相同。


PG的检查点种类:

在xlog.h文件中,有如下代码对checkpoint进行了相应的分类:

/*

* OR-able request flag bits for checkpoints. The "cause" bits are used only

* for logging purposes. Note: the flags must be defined so that it's

* sensible to OR together request flags arising from different requestors.

*/

/* These directly affect the behavior of CreateCheckPoint and subsidiaries */

#define CHECKPOINT_IS_SHUTDOWN 0x0001 /* Checkpoint is for shutdown */

#define CHECKPOINT_END_OF_RECOVERY 0x0002 /* Like shutdown checkpoint,

* but issued at end of WAL

* recovery */

#define CHECKPOINT_IMMEDIATE 0x0004 /* Do it without delays */

#define CHECKPOINT_FORCE 0x0008 /* Force even if no activity */

/* These are important to RequestCheckpoint */

#define CHECKPOINT_WAIT 0x0010 /* Wait for completion */

/* These indicate the cause of a checkpoint request */

#define CHECKPOINT_CAUSE_XLOG 0x0020 /* XLOG consumption */

#define CHECKPOINT_CAUSE_TIME 0x0040 /* Elapsed time */

#define CHECKPOINT_FLUSH_ALL 0x0080 /* Flush all pages, including those

也就是说,以下几种情况会触发数据库操作系统做检查点操作:


数据库shutdown

数据库recovery完成

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

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

周期性地进行checkpoint


触发checkpoint时,需要刷新所有脏页,为了能够周期性的创建检查点,减少崩溃恢复时间,同时合并I/O,PostgreSQL提供了辅助进程checkpointer。它会 周期性 检测时间以及上面的XLOG日志量阈值是否达到,而周期时间以及XLOG日志量阈值可以通过参数来设置大小,接下来介绍下与checkpoints相关的参数。


checkpoints相关的参数

checkpoint_segments

       当前最大的WAL日志文件段的数量,或者说,当系统的日志量达到这么多的时触发一个检查点,其缺省值为3, 每个段的大小是16M,因此大概64M日志触发一个检查点。调大这个数将延长系统崩溃后恢复的时间。

checkpoint_timeout

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

checkpoint_completion_target

       手册上原文为“Specifies the target of checkpoint completion, asa fraction of total time between checkpoints”,完成检查点所需要的时间/检查点之间总时间的目标比例*100%,它要求系统在恰当的时间内完成检查点,不要太快也不要太慢,过快将导致过于密集的IO, 形成IO风暴影响系统的平稳运行,过慢则可能引发持续性的IO, 降低系统性能。


checkpoint_warning

       系统默认值是30秒,如果checkpoints的实际发生间隔小于该参数,将会在server log中写入写入一条相关信息。可以通过设置为禁用。


checkpoint相关的计算:

checkpoint_completion_target对计算起着决定性的作用

假如参数这样配置:

shared_buffers = 128GB # 1/4 内存

checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0

checkpoint_timeout = 30min

max_wal_size = 256GB # 2*shared_buffers

min_wal_size = 64GB # shared_buffers * 1/2

1:极端假设128G全是脏数据

(128*1024)/(30*60*0.9)= 80.90864198 MB/s

要求磁盘的平均离散IO至少在这个之上,否则存在瓶颈,因为触发时刻,压力更大。

当然前提假设,128G都是脏的,如果脏数据不多,压力更小

2:假设周期内产生256G的WAL

那么

(256*1024)/ (30*60)= 145.6355556 MB/s

WAL为顺序IO

3:bgWriter

业务上写操作除了产生WAL,还有bgwriter周期性地写出脏块,因为一个块可能被多次修改,但是writer此时可能更少

(256*1024)/ (30*60)= 145.6355556 MB/s

综上,数据库写操作吞吐均值可能是 80.9 MB/s + 145.6 MB/s+ 145.6 MB/s=372MB/s

出发瞬间的压力可能超过此值。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29497382/viewspace-2636778/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29497382/viewspace-2636778/

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值