首页 > 数据库 >MongoDB的Journal

MongoDB的Journal

时间:2024-12-02 19:32:57浏览次数:8  
标签:slot log MongoDB Journal WiredTiger 检查点 日志

注:这里提到的日志(即journal)指的是 WiredTiger 提前写日志,而不是 MongoDB 日志文件。

 

为了在发生故障时能提供耐久性,MongoDB 使用write ahead logging 机制,提前写入磁盘上的日志(journal)文件。

 

WiredTiger使用检查点为磁盘上的数据提供一致的视图,并支持 MongoDB 从最后一个检查点进行恢复。但是,如果 MongoDB 在两次检查点之间意外退出,则需要日志来恢复自上次检查点之后发生的信息。

 

从 MongoDB 6.1 开始,日志始终处于启用状态。因此,MongoDB 删除了storage.journal.enabled选项以及相应的--journal和--nojournal命令行选项。

有了日志,恢复过程是这样的:

1.在数据文件中查找最后一个检查点的标识符。

2.在日志文件中查找与最后一个检查点标识符匹配的记录。

3.应用最后一个检查点后日志文件中的操作记录。

 

日志过程

有了日志,WiredTiger 会为每个客户端启动的写操作创建一条日志记录。日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger 会创建一条日志记录,其中包括更新操作及其相关的索引修改。

MongoDB 将 WiredTiger 配置为使用内存缓冲来存储日志记录。线程协调分配并复制到各自的缓冲区中。所有不超过 128 kB 的日志记录都会被缓冲。

出现以下情况时,WiredTiger 会将缓冲的日志记录同步到磁盘:

1.对于副本集成员(主成员和辅助成员):

· 如果写操作包含或隐式包含了写关注j:true (如果writeConcernMajorityJournalDefault被设置为true,"majority"写关注就隐式包含了j:true)

· 此外,对于二级成员,在每次批量应用 oplog 条目后

2.每 100 毫秒(请参阅storage.journal.commitIntervalMs )

3.当 WiredTiger 创建新的日志文件时。由于 MongoDB 使用的日志文件大小限制为 100 MB,因此 WiredTiger 大约每 100 MB 数据创建一个新日志文件。

 

serverStatus命令的wiredTiger.log列会返回日志的统计信息:

> db.serverStatus().wiredTiger.log
{
        "busy returns attempting to switch slots" : 33345816,
        "force archive time sleeping (usecs)" : 0,
        "log bytes of payload data" : NumberLong("2410249794860"),
        "log bytes written" : NumberLong("2465646805120"),
        "log files manually zero-filled" : 0,
        "log flush operations" : 530806245,
        "log force write operations" : 568960680,
        "log force write operations skipped" : 345671770,
        "log records compressed" : 178201264,
        "log records not compressed" : 172711326,
        "log records too small to compress" : 546926861,
        "log release advances write LSN" : 575248,
        "log scan operations" : 8,
        "log scan records requiring two reads" : 1,
        "log server thread advances write LSN" : 227661859,
        "log server thread write LSN walk skipped" : 53111249,
        "log sync operations" : 223684164,
        "log sync time duration (usecs)" : NumberLong("223213885794"),
        "log sync_dir operations" : 23539,
        "log sync_dir time duration (usecs)" : 740774,
        "log write operations" : 897839425,
        "logging bytes consolidated" : NumberLong("2465641101184"),
        "maximum log file size" : 104857600,
        "number of pre-allocated log files to create" : 1,
        "pre-allocated log files not ready and missed" : 1,
        "pre-allocated log files prepared" : 23539,
        "pre-allocated log files used" : 23538,
        "records processed by log scan" : 20,
        "slot close lost race" : 0,
        "slot close unbuffered waits" : 0,
        "slot closures" : 228237116,
        "slot join atomic update races" : 20939,
        "slot join calls atomic updates raced" : 20928,
        "slot join calls did not yield" : 897694949,
        "slot join calls found active slot closed" : 123645,
        "slot join calls slept" : 1205,
        "slot join calls yielded" : 144504,
        "slot join found active slot closed" : 2677443,
        "slot joins yield time (usecs)" : 5093155,
        "slot transitions unable to find free slot" : 0,
        "slot unbuffered writes" : 3762652,
        "total in-memory size of compressed records" : NumberLong("4778668147941"),
        "total log buffer size" : 33554432,
        "total size of compressed records" : NumberLong("2292315590289"),
        "written slots coalesced" : 9,
        "yields waiting for previous log file close" : 0

在写操作期间,日志记录还存在与 WiredTiger 缓存中,如果硬关闭mongod实例,可能会丢失数据的。详见:https://www.mongodb.com/docs/manual/core/journaling/

 

日志文件

对于日志文件,MongoDB 会在 dbPath 目录下创建一个名为 journal 的子目录。WiredTiger 日志文件的名称格式如下:WiredTigerLog.<sequence>,其中<sequence>是一个从0000000001 开始的零填充数字。例如:

-rw------- 1 mongod mongod 104857600 Nov 21 10:34 WiredTigerLog.0000026125
-rw------- 1 mongod mongod 104857600 Nov 21 10:31 WiredTigerPreplog.0000023540

 

日志记录

日志文件包含每个客户端启动的写操作的记录

· 日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger 会创建一条日志记录,其中包括更新操作及其相关的索引修改。

· 每条记录都有唯一标识符。

· WiredTiger 的最小日志记录大小为 128 字节。

 

日志压缩

默认情况下,MongoDB 会配置 WiredTiger 对日志数据使用snappy 压缩。要指定不同的压缩算法或不使用压缩算法,请使用storage.wiredTiger.engineConfig.journalCompressor设置。如果日志记录小于或等于 128 字节(WiredTiger 的最小日志记录大小),WiredTiger 不会压缩该记录。

 

改变压缩配置的之前,请先干净的关闭mongodb实例:

db.getSiblingDB('admin').shutdownServer()

 

日志文件大小限制

WiredTiger 日志文件的最大大小限制约为 100 MB。一旦文件超过该限制,WiredTiger 就会创建一个新的日志文件。

WiredTiger 会自动删除旧的日志文件,只保留从上次检查点恢复所需的文件。要确定为日志文件预留多少磁盘空间,请考虑以下几点:

· 检查点的默认最大大小为 2 GB

· MongoDB 在从检查点恢复时写入新日志文件可能需要额外空间

· MongoDB 会压缩日志文件

· 恢复检查点所需的时间取决于你的使用情况

· 如果覆盖了最大检查点大小或禁用了压缩,计算结果可能会大不相同

 

由于上述原因,很难准确计算出你需要多少额外空间。高估磁盘空间总是一种更安全的方法。如果没有为日志文件预留足够的磁盘空间,MongoDB 实例会崩溃。

 

此外 WiredTiger 会预先分配日志文件。

 

日志和 In-Memory 存储引擎

在 MongoDB 企业版中,In-Memory 引擎是通用版本 (GA) 的一部分。由于其数据保存在内存中,因此没有单独的日志。写关注为 j: true 的写操作会立即被确认。

如果副本集的任何投票成员使用内存存储引擎,则必须将 writeConcernMajorityJournalDefault 设为 false。

 

更多的注意事项请参考官方文档!

标签:slot,log,MongoDB,Journal,WiredTiger,检查点,日志
From: https://www.cnblogs.com/abclife/p/18560170

相关文章

  • MongoDB索引详解
    MongoDB索引索引是一种用来快速查询数据的数据结构。B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree做索引,索引创建在colletions上。MongoDB不使用索引的查询,先扫描所有的文档,再匹配符合条件的文档。使用索引的查询,通过索引找到文档,使用索引能够极大的提升查询效......
  • Cloud Mongodb中organization和project和cluster和databases的关系。
    一个集群(cluster)是多个数据库的集合,这多个数据库的集合共同服务于一个项目。本质上就是把需要的数据按照类别划分成不同的部分,然后分别存储在不同的数据库中。集群虽然是多个数据库的集合,但集群本身就是一个数据库,可以理解为一个服务器程序。但在使用时,可以把一个集群中的一个数据......
  • MongoDB Write Concern
    写关注(WriteConcern)描述了向单独的mongod、副本集或分片集群进行写操作时,MongoDB所要求的确认级别。在分片集群中,mongos实例会将写关注传递给分片。 注:对于多文档事务,应在事务级别而非单个操作级别设置写关注。不要为事务中的单个写操作明确设置写关注。如果为多文档事务......
  • MongoDB Read Concern
    1.读关注(readconcern)通过readConcern选项,可以控制从副本集和分片集群读取数据的一致性和隔离属性。 通过有效使用写关注和读关注,可以适当调整一致性和可用性保证的级别,如等待更强的一致性保证,或放宽一致性要求以提供更高的可用性。 副本集和分片群集支持设置全局默认......
  • MongoDB测试环境搭建分片脚本
    搭建1个config节点,一个mongos节点,两个分片,每个分片3个节点。传入参数为mongos节点端口号,config节点端口号,分片节点端口号可根据需求修改存放的目录basedir#!/bin/bash#定义usage函数usage(){echo"Usage:mongos_portconfig_portshard_node_port_1....shard_......
  • mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
    随笔从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条?数据源的统一与拆分监控报警系统的指标、规则与执行闭环我们的系统应该配置哪些监控报警项?监控报警系统如何实现自监控?java老矣,尚能饭否?一骑红尘妃子笑,无人知是荔枝来!张居正的考成法,对我们有何参考价值?mon......
  • OpenEuler安装MongoDB并配置访问密码
    1.下载MongoDB、安装wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.18.tgztarzxvfmongodb-linux-x86_64-rhel80-4.4.18.tgz移动到/home路径下mvmongodb-linux-x86_64-rhel80-4.4.18/homecd/homemvmongodb-linux-x86_64-rhel80-4.4.1......
  • mongodb shard 分片集群基础概念
    目录一、shard集群二、ConfigServer1、config.shards2、config.database3、config.collection4、config.chunks5、config.settings6、其他三、shard机制1、PrimaryShard2、ShardKey2.1范围分片2.2哈希分片2.3ShardKey重定义2.4版本约束2.5ShardKey......
  • Springboot集成Mongodb
    1、安装Mongodb参考链接:https://www.cnblogs.com/lveyHang/p/16866309.html2、进行配置找到mongodb的安装位置、找到如下文件进行配置 Mongodb\bin\mongod.cfg#配置数据存储目录,没有则创建.storage:dbPath:D:\soft\Mongodb\data#配置日志存储目录,没有则创建.systemLo......
  • MongoDB身份认证机制揭秘!
    检查MongoDB服务器的身份验证状态,使用MongoDB的shell或者命令行工具。1使用MongoDBShell1.1连接到admin数据库因为大多数身份验证相关的命令需要在admin数据库中运行:useadmin1.2检查服务器的身份验证状态db.runCommand({getParameter:1,authenticationMechanisms:1......