WiredTiger的日志和检查点机制
2023-04-11 09:35 abce 阅读(603) 评论(0) 编辑 收藏 举报1.日志
·对于每个写操作,mongodb将改变写入日志文件,即事务日志文件。写入的频率收到storage.journal.commitIntervalMs参数的控制。默认是100毫秒,可取值的范围是1--500毫秒。
·WT缓存中的页数据也会被标记为脏数据
日志文件的格式示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | $ wt printlog -u -x { "lsn" : [15,256], "hdr_flags" : "" , "rec_len" : 256, "mem_len" : 256, "type" : "commit" , "txnid" : 3836082, "ops" : [ { "optype" : "row_put" , "fileid" : 14 0xe, "key" : "u00e8du001au0015bu00ffu00ffu00dfu00c1" , "key-hex" : "e8641a1562ffffdfc1" , "value" : "gu0000u0000u0000u0002o…., "value-hex" : "67000000026f7….." } ] }, { "lsn" : [15,512], "hdr_flags" : "" , "rec_len" : 128, "mem_len" : 128, "type" : "commit" , "txnid" : 3836083, "ops" : [ { "optype" : "row_modify" , "fileid" : 6 0x6, "key" : "u0081" , "key-hex" : "81" , "value" : "u0001u0000u0000u…." , "value-hex" : "010000000000000008000000000000003e0000000000000008000000000000000100000063151a64" } |
2.检查点
检查点在持久性和一致性方面的作用同样重要。检查点相当于日志,记录了上一次检查点之后相关数据文件的变化情况。
每个检查点由一个根页、三个指向磁盘上特定位置的页列表以及磁盘上的文件大小组成。
在每个检查点间隔(默认为60秒),MongoDB将缓存中标记为脏的已修改页面刷新到各自的数据文件(collection-*.Wt和index-*.Wt)。
使用相同的“wt”程序,我们可以列出检查点并查看它们包含的信息。下面显示的检查点信息是根据每个数据文件(集合和索引)存储的。这些检查点存储在WiredTiger中.wt文件。
上面的图显示了检查点中的信息,而下面的输出显示了使用“wt”程序列出检查点时的信息。
1 2 3 4 5 6 7 8 9 10 11 | $ wt list -c WiredTigerCheckpoint.33: Sun Mar 26 08:35:59 2022 (size 8 KB) file -size: 8 KB, checkpoint-size: 4 KB offset, size, checksum root : 8192, 4096, 3824871989 (0xe3faea35) alloc: 12288, 4096, 4074814944 (0xf2e0bde0) discard : 0, 0, 0 (0) available : 0, 0, 0 (0) WiredTigerCheckpoint.34: Sun Mar 26 08:35:59 2022 (size 8 KB) file -size: 8 KB, checkpoint-size: 4 KB offset, size, checksum root : 8192, 4096, 997122142 (0x3b6ee05e) alloc: 12288, 4096, 4074814944 (0xf8e0cde0) discard : 0, 0, 0 (0) available : 0, 0, 0 (0) |
检查点信息中的重要点:
·根页
包含了根页的大小,在文件中的偏移量,检查和。创建一个新的检查点就会创建一个根页
·内部页
只含有keys。WiredTiger遍历内部页面以查找相应的Leaf页面。
·叶子页
包含实际的key:value对
·分配的列表页
发生检查点后,wt引擎的块管理器记录了新分配的页已经他们的信息,比如大小、偏移量、检查和。
·丢弃的列表页
检查点结束后,相应的页会被丢弃。
·可用的列表页
当这个检查点被执行时,所有由WiredTiger块管理器分配但尚未使用的页面;当删除之前创建的检查点时,附加到该检查点的可用页面将被合并到该检查点的最新可用列表中,并且每个可用页面的大小、偏移量和校验和也将被记录。
·文件大小
文成检查点时,磁盘上数据文件的大小
检查点的触发机制:
·每60秒,除非有非常大的数据需要写,这样会因为io瓶颈生成backlog
·eviction_dirty_target或eviction_dirty_trigger分别达到5%和20%。一般不会达到,除非硬件真的无法处理写负载
如果发生了硬件故障或者不明原因的奔溃,会发什么呢?我们来看看mongodb的启动过程:
(1).mongodb尝试做奔溃恢复,查看事务日志是否有数据
以下是缩减过的日志:
1 2 3 4 5 6 7 8 9 10 | { "t" :{ "$date" : "2023-03-27T11:22:48.360+00:00" }, "s" : "I" , "c" : "STORAGE" , "id" :22430, "ctx" : "initandlisten" , "msg" : "WiredTiger message" , "attr" :{ "message" :"[1679916168:360670][9811:0x7f43b45d 7bc0], txn-recover: [WT_VERB_RECOVERY_PROGRESS] Recovering log 15 through 16"}} 7bc0], txn-recover: [WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS] Set global recovery timestamp: (1679916159, 1)"}} { "t" :{ "$date" : "2023-03-27T11:22:48.688+00:00" }, "s" : "I" , "c" : "STORAGE" , "id" :22430, "ctx" : "initandlisten" , "msg" : "WiredTiger message" , "attr" :{ "message" :"[1679916168:688481][9811:0x7f43b45d 7bc0], txn-recover: [WT_VERB_RECOVERY | WT_VERB_RECOVERY_PROGRESS] Set global oldest timestamp: (1679916154, 1)"}} { "t" :{ "$date" : "2023-03-27T11:22:48.695+00:00" }, "s" : "I" , "c" : "STORAGE" , "id" :22430, "ctx" : "initandlisten" , "msg" : "WiredTiger message" , "attr" :{ "message" :"[1679916168:695497][9811:0x7f43b45d 7bc0], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 10, snapshot max: 10 snapshot count: 0, oldest timestamp: (1679916154, 1) , meta checkpoint timest amp: (1679916159, 1) base write gen: 11982970"}} { "t" :{ "$date" : "2023-03-27T11:22:48.705+00:00" }, "s" : "I" , "c" : "RECOVERY" , "id" :23987, "ctx" : "initandlisten" , "msg" : "WiredTiger recoveryTimestamp" , "attr" :{ "recoveryTimestamp" :{ "$timestamp" :{" t ":1679916159," i":1}}}} |
(2).从数据文件找到上一次运行成功的检查点,从日志文件恢复未提交的脏数据到wt引擎的缓存中,缓存中的页一会被标记成脏页。
以下是缩减过的日志:
1 2 | file :demo /collection/108-2625234990440311433 .wt access_pattern_hint=none,allocation_size=4KB,app_metadata=(formatVersion=1),assert=(commit_timestamp=none,durable_timestamp=none,read_timestamp=none,write_timestamp=off),block_allocation=best,block_compressor=snappy………checkpoint=(WiredTigerCheckpoint.33=(addr= "018081e49e1d91ae9a81e4b44eefcd9b81e4be132c8a808080e30d3fc0e30c4fc0" ,order=33, time =1679897278,size=819200,newest_start_durable_ts=7215101747935576783,oldest_start_ts=0,......,checkpoint_backup_info=,checkpoint_lsn=(4294967295,2147483647) |
(3).刷脏页到对应的数据文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2022-04-11 /usr/bin/ld: warning: -z lazyload ignored
2020-04-11 postgresql中的money数据类型
2016-04-11 V$RECOVERY_PROGRESS