签到成功

知道了

CNDBA社区CNDBA社区

MongoDB 4.4 中 journal 和 oplog 日志 说明

2022-05-07 13:48 3133 1 原创 MongoDB
作者: dave

MongoDB 中有两种日志文件:journal file 和 oplog。

1 Journal File


在之前的博客中有说明,如下:

MongoDB 日志 管理
https://www.cndba.cn/dave/article/107961

简单的罗列几点journal file 信息:

  1. Journal 日志文件在DB 目录的jounal 目录下。
  2. 单个日志文件大概100M左右,达到这个值就会创建新的日志文件。
  3. Journal 日志是wt引擎的操作记录,日志记录包含内部写操作触发的所有的写入操作。
  4. 每100ms 会将buffer中的journal records 刷到journal 日志。
  5. WiredTiger 会自动删除最后一次checkpoint 之后恢复不需要的journal 日志。

2 Oplog(operations log)


官网对oplog的说明参考:

https://www.mongodb.com/docs/v4.4/core/replica-set-oplog/https://www.cndba.cn/dave/article/107979

oplog(操作日志)是一个特殊的固定集合( capped collection),它是所有涉及数据修改事务的回滚记录,存储在local数据库中,它在达到最大值时自动覆盖最旧的条目。

从4.0 版本开始,oplog的固定集合大小可以超过其配置值,从而避免删除 majority commit point。
在4.4 版本中,还可以指定oplog 最小的保留时间(小时为单位),只有在以下条件下,MongoDB 才会删除oplog 记录。

https://www.cndba.cn/dave/article/107979

  1. Oplog 达到配置的最大值。
  2. Oplog 记录保留时间超过了配置的保留策略时间。

MongoDB在Primary节点上应用数据库操作的同时,也会记录到主节点的oplog中。 Secondary节点通过异步进程复制并应用这些操作。 所有副本集成员在local.oplog.rs集合中都包含一个oplog的副本,从而维持数据的同步。

shard1:SECONDARY> use local
switched to db local
shard1:SECONDARY> show tables
oplog.rs
replset.election
replset.initialSyncId
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
shard1:SECONDARY>

如果使用的是WireTiger 存储引擎,那么不能删除任何副本集成员中的 local.oplog.rs 集合。

为了便于复制,所有副本集成员都会向其他成员发送心跳(ping)。 任意secondary 成员都可以从任何其他成员导入oplog。

oplog中的每个操作都是幂等的。 也就是说,在目标库中应用oplog时,无论应用一次还是多次都是相同的结果。

幂等性
https://www.cndba.cn/dave/article/5033

在第一次启动副本集时,在没有指定oplog大小的情况下,MongoDB 会根据默认值来创建oplog。https://www.cndba.cn/dave/article/107979

对于Windows 和 Linux 系统,默认的oplog 大小规则如下,当然这个规则也和存储引擎有关。

  1. In-Memory Storage Engine:默认oplog大小是物理内存的5%, 最小是50MB,最大是50GB。
  2. WiredTiger Storage Engine:默认oplog 大小是空闲磁盘的5%,最小是990MB,最大是50GB。

默认情况下oplog最大时时50GB,但可以手工指定超过该值。https://www.cndba.cn/dave/article/107979

在大多数情况下,默认的oplog大小就足够了。

在mongod创建oplog之前,可以使用oplogSizeMB选项指定其大小。一旦首次启动副本集成员,可使用replSetResizeOplog管理命令更改oplog大小。通过replSetResizeOplog可以动态调整oplog的大小,无须重新启动mongod进程。

官网的描述如下:https://www.cndba.cn/dave/article/107979

Before mongod creates an oplog, you can specify its size with the oplogSizeMB option. Once you have started a replica set member for the first time, use the replSetResizeOplog administrative command to change the oplog size. replSetResizeOplog enables you to resize the oplog dynamically without restarting the mongod process.https://www.cndba.cn/dave/article/107979

实际经过测试发现,仅在副本集不存在的情况下,【replication.oplogSizeMB:n】的参数才会生效,一旦副本集已经启动了,oplogSizeMB 参数就不会再生效,只能通过replSetResizeOplog命令来动态进行调整。https://www.cndba.cn/dave/article/107979

默认情况下,MongoDB不会设置最小的oplog保留期,而是自动从最老的条目开始删除,以保持oplog大小。

可以通过如下两种方法配置oplog的最小保留期:

  1. 在配置文件中添加storage.oplogMinRetentionHours 参数
  2. 在命令行选项添加:—oplogMinRetentionHours

注意:

可以通过replSetResizeOplog 在线调整oplog的最小保留期,在线调整的值会覆盖启动时参数中的设置,但必须将该值同步到参数文件中,否则下次启动就会失效。 https://www.cndba.cn/dave/article/107979

db.adminCommand(
  {
    replSetResizeOplog: <int>,
    size: <double>,
    minRetentionHours: <double>
  }
)

3 调整oplog 大小操作步骤


3.1 查看oplog 状态

shard1:PRIMARY> rs.printReplicationInfo()
configured oplog size:   2286.5400390625MB
log length start to end: 298357secs (82.88hrs)
oplog first event time:  Tue May 03 2022 23:13:24 GMT+0800 (CST)
oplog last event time:   Sat May 07 2022 10:06:01 GMT+0800 (CST)
now:                     Sat May 07 2022 10:06:05 GMT+0800 (CST)
shard1:PRIMARY>

shard1:SECONDARY> db.getReplicationInfo()
{
        "logSizeMB" : 2286.1455078125,
        "usedMB" : 40.74,
        "timeDiff" : 298527,
        "timeDiffHours" : 82.92,
        "tFirst" : "Tue May 03 2022 23:13:24 GMT+0800 (CST)",
        "tLast" : "Sat May 07 2022 10:08:51 GMT+0800 (CST)",
        "now" : "Sat May 07 2022 10:08:52 GMT+0800 (CST)"
}
shard1:SECONDARY>

3.2 在线修改oplog 大小

可以看到我们这里的oplog大小是2286MB。 我们这里修改成3G。https://www.cndba.cn/dave/article/107979

shard1:PRIMARY> db.adminCommand({replSetResizeOplog:1,size:3000});
{
        "ok" : 1,
        "$gleStats" : {
                "lastOpTime" : Timestamp(0, 0),
                "electionId" : ObjectId("7fffffff0000000000000008")
        },
        "lastCommittedOpTime" : Timestamp(1651889541, 3),
        "$configServerState" : {
                "opTime" : {
                        "ts" : Timestamp(1651889541, 2),
                        "t" : NumberLong(8)
                }
        },
        "$clusterTime" : {
                "clusterTime" : Timestamp(1651889541, 3),
                "signature" : {
                        "hash" : BinData(0,"1S7YwbfP2mKbOcffZD2IIv3ps8U="),
                        "keyId" : NumberLong("7093529851058978835")
                }
        },
        "operationTime" : Timestamp(1651889541, 3)
}
shard1:PRIMARY> db.getReplicationInfo()
{
        "logSizeMB" : 3000,
        "usedMB" : 40.74,
        "timeDiff" : 298737,
        "timeDiffHours" : 82.98,
        "tFirst" : "Tue May 03 2022 23:13:24 GMT+0800 (CST)",
        "tLast" : "Sat May 07 2022 10:12:21 GMT+0800 (CST)",
        "now" : "Sat May 07 2022 10:12:26 GMT+0800 (CST)"
}
shard1:PRIMARY>

缩小oplog值:

shard1:SECONDARY> db.adminCommand({replSetResizeOplog:1,size:2000});
shard1:SECONDARY> rs.printReplicationInfo()
configured oplog size:   2000MB
log length start to end: 303382secs (84.27hrs)
oplog first event time:  Tue May 03 2022 23:13:24 GMT+0800 (CST)
oplog last event time:   Sat May 07 2022 11:29:46 GMT+0800 (CST)
now:                     Sat May 07 2022 11:29:56 GMT+0800 (CST)
shard1:SECONDARY>

3.3 修改oplog 最小保留期

[dave@www.cndba.cn_1 etc]# mongo --port 27018
MongoDB shell version v4.4.13
connecting to: mongodb://127.0.0.1:27018/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("9edb6929-a9d7-4b13-a453-26de4e9389fd") }
MongoDB server version: 4.4.13
shard1:SECONDARY> use admin
switched to db admin
shard1:SECONDARY> db.auth('root','root')
1
shard1:SECONDARY> rs.printReplicationInfo()
configured oplog size:   2000MB
log length start to end: 304372secs (84.55hrs)
oplog first event time:  Tue May 03 2022 23:13:24 GMT+0800 (CST)
oplog last event time:   Sat May 07 2022 11:46:16 GMT+0800 (CST)
now:                     Sat May 07 2022 11:46:22 GMT+0800 (CST)
shard1:SECONDARY>

修改成100小时:

shard1:SECONDARY> db.adminCommand({replSetResizeOplog: 1, minRetentionHours: 100})

shard1:SECONDARY> db.getSiblingDB("admin").serverStatus().oplogTruncation.oplogMinRetentionHours
100
shard1:SECONDARY>

注意该修改需要同步到配置文件,我这里直接将配置文件中的值改成150小时:https://www.cndba.cn/dave/article/107979

[dave@www.cndba.cn_1 etc]# cat shard1.conf
……
storage:
  journal:
    enabled: true
  dbPath: "/data/mongodb/data/shard1"
  oplogMinRetentionHours: 150
……
[dave@www.cndba.cn_1 etc]#

重启之后就变成150小时了:

[dave@www.cndba.cn_1 etc]# supervisorctl restart shard1
shard1: stopped
shard1: started
[dave@www.cndba.cn_1 etc]#

shard1:SECONDARY> db.getSiblingDB("admin").serverStatus().oplogTruncation.oplogMinRetentionHours
150
shard1:SECONDARY>

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2297
    原创
  • 3
    翻译
  • 700
    转载
  • 201
    评论
  • 访问:10237830次
  • 积分:4598
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ