首页 > 其他分享 >WiredTiger引擎的日志和检查点机制

WiredTiger引擎的日志和检查点机制

时间:2023-07-14 14:11:34浏览次数:32  
标签:timestamp WiredTiger checkpoint wt 检查点 日志 size

每个数据库系统都要确保持久性和可靠性。MongoDB使用journal和检查点来

每个数据库系统都必须确保持久性和可靠性。MongoDB使用Journals和Checkpoints完成WAL(Write-Ahead-Logging)。

从最基本的开始,为什么首先需要WAL?这是为了确保我们的数据在每次写操作之后都是持久的,并且在不影响性能的情况下使其持久化和一致。

就MongoDB而言,它通过结合使用Journals和Checkpoints来实现WAL和数据持久性。让我们来了解一下这两种方法。

 

1.Journal

在这个过程中,每个写操作都会从内存写入(附加)到一个Journal文件,就是众所周知的事务日志,根据配置按指定间隔写入磁盘。配置选项为journalCommitIntervalMs,默认是100毫秒。

在检查点之间发生崩溃、电源和硬件故障时,可从日志文件恢复丢失的数据,从而确保持久性。

 

下面是对整个过程的描述:

·对于每次写操作,MongoDB都会将修改写入Journal文件,即事务日志文件,就是上文讨论的MongoDB使用的WAL机制。这发生在每个journalCommitIntervalMs。

·在Wiredtiger缓存中的数据页会被标记为脏页。

 

以下是使用wt(WiredTiger Binary)工具分析出的journal日志的内容:

$ 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.Checkpoint

每个检查点包括一个根页,三个指向磁盘上特定位置的列表页,以及磁盘上的文件大小。

在每个检查点间隔(默认60秒),MongoDB会将缓存中被标记为脏的修改页刷新到各自的数据文件中(collection-*.wt和index-*.wt)。

使用"wt"工具,我们可以列出检查点并查看它们所包含的信息。下图所示的是与每个数据文件(集合和索引)相关的检查点信息。这些检查点存储在WiredTiger.wt文件中。

 

$ 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。wt引擎通过遍历内部页来找对应的叶子页

·叶子页:包含实际的keys:value值对

·分配的页列表:在最近的检查点之后,wt引擎的块管理器会记录新创建的页和相关信息,比如大小,偏移量,检查和

·丢弃的页列表:检查点完成后,相关的页会被丢弃。但是其相关信息还会被存储

可用的页列表:执行检查点时,wt引擎的块管理器分配的页中,还没有被使用的页。当删除之前的检查点,其对应的可用的页会被合并到最新检查点的可用列表。

·文件大小:检查点完成时候,磁盘上文件系统的大小。

 

尽管事务日志和检查点这两个过程看起来有点类似,但是他们的目的不同。一方面,日志是在事务日志的追加(append)操作;检查点处理的数据文件,由于其复杂性,开销更大,特别是对磁盘的随机操作。

 

一般来说,检查点的出发条件是:

·每60秒。

·eviction_dirty_target或eviction_dirty_trigger达到了5%和20%。通常很少遇到,只是发生在写的负载超过了硬件的处理能力。

 

如果发生了意外崩溃或者硬件故障,会发生什么呢?让我们来看看我们启动mongod的过程。

1.mongod尝试进入崩溃恢复过程,查看Journal日志文件中的内容

{"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:0x7f43b45d7bc0], 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:0x7f43b45d7bc0], 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:0x7f43b45d7bc0], WT_SESSION.checkpoint: [WT_VERB_CHECKPOINT_PROGRESS] saving checkpoint snapshot min: 10, snapshot max: 10 snapshot count: 0, oldest timestamp: (1679916154, 1) , meta checkpoint timestamp: (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.从数据文件中找出最后一个成功的检查点,根据事务日志恢复未提交的脏数据。对应数据页就会变成脏页。

file:demo/collection/108-2625234990440311433.wtaccess_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.下一个检查点,会将脏页刷新到磁盘。不需要的juournal日志条目将在检查点执行后进行相应清理。

标签:timestamp,WiredTiger,checkpoint,wt,检查点,日志,size
From: https://www.cnblogs.com/abclife/p/17549033.html

相关文章

  • 日志
    目录日志轮转访问权限日志轮转1、项目的日志需要考虑日志轮转,不然可能会把磁盘空间打爆。设置单个文件大小100MB,最大文件数量10个,每小时转储一次等等。访问权限linux/unix系统上的文件和文件夹需要设置相应的访问权限,符合安全规范:程序文件目录-------550(r-xr-x---)配置文......
  • 遇到问题一定要学会看日志
    如果你生病了到医院,医生首先会问你哪里不舒服,然后通过你的描述来确认病情,如果还无法确认就得让你去验血或者拍片。最后根据结果来进一步确认你到底有什么病。这个道理大家都明白,其实作为一个运维人,服务器在我们眼里就是我们的病人,而我们就是给它看病的医生。如何确认病情?我们自然......
  • 发送请求忘记指定协议方式,日志com.jcraft.jsch.JSchException: java.net.ConnectExcep
      2023-07-1319:06:51.487-ERROR17629---[http-nio-192.168.2.206-36093-exec-8]c.t.b.p.b.c.common.util.sftp.SftpPool:com.jcraft.jsch.JSchException:java.net.ConnectException:拒绝连接(Connectionrefused)_atcom.jcraft.jsch.Util.createSocket(......
  • Kubernetes轻量级日志工具Loki安装及踩坑记录
    Loki简介Loki是Grafana出品的一个轻量级日志系统,熟悉ELK的都知道ELK使用起来的成本,而且仅仅是日志检索使用ELK的话有点大材小用了。Loki8技术栈中使用了以下组件。Promtail用来将容器日志发送到Loki或者Grafana服务上的日志收集工具,该工具主要包括发现采集目标以及给日志......
  • expect 保存日志文件
    1.$expect_out(buffer)这种方式需要注意不能在shell嵌套expect的情况下使用,因为在这种情况下expect脚本中的$xx变量会被解析成shell部分传入的参数,无法起到原本在expect脚本下的作用。其次,$expect_out(buffer)需要和send内容在两个不同的expect循环中出现。#!/bin/expectse......
  • 如何实现怎样实时监测Android系统打印的日志信息的具体操作步骤
    怎样实时监测Android系统打印的日志信息在开发Android应用程序的过程中,日志信息是非常重要的调试工具。通过日志信息,我们可以了解应用程序的运行状态、错误信息以及其他关键信息。为了更好地调试和分析应用程序的日志信息,我们可以实时监测Android系统打印的日志信息。本文将介绍如......
  • 企业网络日志分析的关键利器【EventLog Analyzer】
    在数字化时代,企业网络的安全和运维管理变得至关重要。随着企业规模的扩大和信息系统的复杂化,网络日志分析成为了不可或缺的一环。EventLogAnalyzer(以下简称EventLogAnalyzer)作为一款强大的日志分析工具,为企业提供了关键的功能和洞察力,帮助其实现网络安全的保护和高效的运维管理。......
  • MySql开启日志 --记录每条执行的SQL语句
    --第一条SETGLOBALlog_output='TABLE';SETGLOBALgeneral_log='ON';--在重启mysql重启Mysql详情请看:(10条消息)如何重启MySQL,正确启动MySQL_mysqlrestart_wuyepiaoxue789的博客-CSDN博客--重启完成之后可以去数据库`Mysql`中的general_log表里查看,也可以执行一下的......
  • journalctl 清理journal日志
    在CentOS7开始使用的systemd使用了journal日志,这个日志的管理方式和以往使用syslog的方式不同,可以通过管理工具维护。使用df-h检查磁盘文件,可以看到/run目录下有日志目录/run/log/journal,占用了数G空间FilesystemSizeUsedAvailUse%Mountedon/dev/mapper......
  • django 中 设置一个logging,来记录日志
    当你使用Django框架开发应用程序时,配置日志是一个重要的任务。以下是一步一步配置Django日志的示例:第1步:在你的Django项目中创建一个名为"logs"的文件夹,用于存储日志文件。第2步:在项目的根目录下的settings.py文件中,找到`LOGGING`配置项。如果该配置项不存在,请添加以下内容:```p......