MongoDB检查点机制 MongoDB检查点机制为什么要理解Checkpoint总的来说Checkpoint主要有两个目的一是将内存里面发生修改的数据写到数据文件进行持久化保存确保数据一致性二是实现数据库在某个时刻意外发生故障再次启动时缩短数据库的恢复时间WiredTiger存储引擎中的Checkpoint模块就是来实现这个功能的。Checkpoint包含的关键信息本质上来说Checkpoint相当于一个日志记录了上次Checkpoint后相关数据文件的变化。每个checkpoint包含一个root page、三个指向磁盘具体位置上pages的列表以及磁盘上文件的大小。我们可以通过WiredTiger提供的wt命令工具工具需要单独编译下一篇会讲解如何编译安装wt工具查看每个checkpoints具体信息。例如在dbPath指定的data目录下执行如下命令wt list -c 输出集合对应数据文件和索引文件的checkpoints信息 如数据文件file:collection-7-16963667508695721.wt的checkpoint信息 WiredTigerCheckpoint.1:Sat Apr 11 08:35:59 2020 (size 8 KB) file-size: 16 KB, checkpoint-size: 4 KB offset, size, checksum root : 8192, 4096, 3824871989 (0xe3faea35) alloc : 12288, 4096, 4074814944 (0xf2e0bde0) discard : 0, 0, 0 (0) avail : 0, 0, 0 (0) 如索引文件file:index-8-16963667508695721.wt的checkpoint信息 WiredTigerCheckpoint.1:Sat Apr 11 08:35:59 2020 (size 8 KB) file-size: 16 KB, checkpoint-size: 4 KB offset, size, checksum root : 8192, 4096, 997122142 (0x3b6ee05e) alloc : 12288, 4096, 4074814944 (0xf2e0bde0) discard : 0, 0, 0 (0) avail : 0, 0, 0 (0) 详细字段信息描述如下* **root page** 包含rootpage的大小size在文件中的位置offset校验和checksum创建一个checkpoint时会生成一个新root page。* **allocated list pages** 用于记录最后一次checkpoint之后在这次checkpoint执行时由WiredTiger块管理器新分配的pages会记录每个新分配page的sizeoffset和checksum。* **discarded list pages** 用于记录最后一次checkpoint之后在这次checkpoint执行时丢弃的不在使用的pages会记录每个丢弃page的sizeoffset和checksum。* **available list pages** 在这次checkpoint执行时所有由WiredTiger块管理器分配但还没有被使用的pages当删除一个之前创建的checkpoint时它所附带的可用pages将合并到最新的这个checkpoint的可用列表上也会记录每个可用page的sizeoffset和checksum。* **file size** 在这次checkpoint执行后磁盘上数据文件的大小。## Checkpoint执行的完整流程 Checkpoint是数据库中一个比较耗资源的操作何时触发执行以及以什么样的流程执行是本节要研究的内容如下所述 执行流程 **流程描述如下** * 查询集合数据时会打开集合对应的数据文件并读取其最新checkpoint数据 * 集合文件会按checkponit信息指定的大小file size被truncate掉所以系统发生意外故障恢复时可能会丢失checkponit之后的数据如果没有开启Journal * 在内存构造一棵包含root page的live tree表示这是当前可以修改的checkpoint结构用来跟踪后面写操作引起的文件变化其它历史的checkpoint信息只能读可以被删除 * 内存里面的page随着增删改查被修改后写入并需分配新的磁盘page时将会从livetree中的available列表中选取可用的page供其使用。随后这个新的page被加入到checkpoint的allocated列表中 * 如果一个checkpoint被删除时它所包含的allocated和discarded两个列表信息将被合并到最新checkpoint的对应列表上任何不再需要的磁盘pages也会将其引用添加到live tree的available列表中 * 当新的checkpoint生成时会重新刷新其allocated、available、discard三个列表中的信息并计算此时集合文件的大小以及rootpage的位置、大小、checksum等信息将这些信息作checkpoint元信息写入文件 * 生成的checkpoint默认名称为WiredTigerCheckpoint如果不明确指定其它名称则新check point将自动取代上一次生成的checkpoint。## Checkpoint执行的触发时机 触发checkpoint执行通常有如下几种情况* 按一定时间周期默认60s执行一次checkpoint * 按一定日志文件大小当Journal日志文件大小达到2GB如果已开启执行一次checkpoint * 任何打开的数据文件被修改关闭时将自动执行一次checkpoint。注意checkpoint是一个相当重量级的操作当对集合文件执行checkpoint时会在文件上获得一个排它锁其它需要等待此锁的操作可能会出现EBUSY的错误。