签到成功

知道了

CNDBA社区CNDBA社区

MongoDB 4.4 中 journal 和 oplog 日志 说明

2022-05-07 13:48 2468 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/

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

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

  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/5033http://www.cndba.cn/cndba/dave/article/107979

在第一次启动副本集时,在没有指定oplog大小的情况下,MongoDB 会根据默认值来创建oplog。

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

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

默认情况下oplog最大时时50GB,但可以手工指定超过该值。

在大多数情况下,默认的oplog大小就足够了。 http://www.cndba.cn/cndba/dave/article/107979

在mongod创建oplog之前,可以使用oplogSizeMB选项指定其大小。一旦首次启动副本集成员,可使用replSetResizeOplog管理命令更改oplog大小。通过replSetResizeOplog可以动态调整oplog的大小,无须重新启动mongod进程。http://www.cndba.cn/cndba/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.

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

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

可以通过如下两种方法配置oplog的最小保留期:http://www.cndba.cn/cndba/dave/article/107979http://www.cndba.cn/cndba/dave/article/107979

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

注意:http://www.cndba.cn/cndba/dave/article/107979

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

http://www.cndba.cn/cndba/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。http://www.cndba.cn/cndba/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值:http://www.cndba.cn/cndba/dave/article/107979

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小时:

[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

关注

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

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

        QQ交流群

        注册联系QQ