侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 128873 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

mongodb日志

2023-12-23 星期六 / 0 评论 / 0 点赞 / 31 阅读 / 9167 字

MongoDB使用提前写日志到磁盘journal来保证写操作的持续性,并提供崩溃恢复。在将数据变动写入数据文件之前,MongoDB将更改写入journal。如果MongoDB进程需要终止或者在将更改从

MongoDB使用提前写日志到磁盘journal来保证写操作的持续性,并提供崩溃恢复。在将数据变动写入数据文件之前,MongoDB将更改写入journal。如果MongoDB进程需要终止或者在将更改从journal写入数据文件之前遇到错误,MongoDB能够重新执行写操作来维持数据库的一致性。

如果没有journal,如果mongod意外退出,你要预设你的数据处于不一致状态,需要进行repair,或者最好从副本集中选择一个数据一致的成员,重新进行数据同步。

启用了journal之后,如果mongod意外退出,程序可以从journal中恢复出任何数据,数据仍旧处于一致性状态。默认情况下,没有记录到journal的写入内容的丢失不超过100毫秒。

启用了journal,如果你需要整个数据集都驻留在内存里,你需要足够的RAM来容纳整个数据集以及“写工作集(write working set)”,“写工作集”是你希望看到的私有视图重映射间的唯一数据(The “write working set." is the amount of data you expect to see written between re-mappings of the private view),更多信息,请参考Storage Views used in Journaling

重要

在 2.0 版更改: For 64-bit builds of mongod, journaling is enabled by default. For other platforms, see journal.

步骤

启用journaling

默认64位操作系统,启用了journalling

显示启用journalling,启动mongod时添加参数--journal

如果journal文件存在,mongod启动后,进程需要预配置新的日志文件。在这个操作过程中,只有完成了预配置,mongod才开始监听连接:对有些操作系统,这可能持续几分钟。在这个过程中,应用和mongo shell不可用。

 

禁用journaling

警告

生产系统不要禁用journaling。如果你的mongod实例因为某种原因意外未干净退出,且你没有运行journaling,这种情况下你需要从未受影响的副本集成员中或者备份中恢复数据。

要禁用journaling,启动mongod添加参数--nojournal

获取提交确认

你可以通过食用getLastError命令和j参数来获取提交确认,详细信息,参考Internal Operation of write concern

避免预配置带来的延迟

为了避免预分配带来的延迟,你可以拷贝其它mongod实例的journal目录到当前目录来实现文件预配置。

预配置文件不包含数据。后续删除是安全的。不过如果你启用了journaling重启了mongod,这些文件会重新被创建。

例如

以下顺序为监听在27017端口的mongod进程预配置了journal文件。

For demonstration purposes, the sequence starts by creating a set of journal files in the usual way.

  1. 为journal文件创建一个临时目录:

    mkdir ~/tmpDbpath
  2. 启动mongod进程,该进程使用此临时目录存放journal文件:

    mongod --port 10000 --dbpath ~/tmpDbpath --journal
  3. 当看到如下输出时,表明mongod已经创建好这些文件,使用CONTROL+C停止mongod实例:

    web admin interface listening on port 11000
  4. 讲临时目录中的journal文件移动到新实例使用的文件目录中:

    mv ~/tmpDbpath/journal /data/db/
  5. 启动新实例:

    mongod --port 27017 --dbpath /data/db --journal

监控Journal状态

使用如下命令监控journal状态:

  • serverStatus

    ServerStatus显示实例状态信息,访问性能。

  • journalLatencyTest
    使用journalLatencyTest测量在append-only模式下,需要多久才能写入磁盘。你可以在空闲系统上运行该命令获得journaling的基线同步时间。你也可以在繁忙的操作系统上运行该命令获取同步时间。如果journal目录和数据目录在同一个卷上,该时间可能会稍高。
    journalLatencyTest还可以检测磁盘是否开启了写缓存。如果磁盘不是SSD,而写入时间非常低(比如不足2毫秒),磁盘驱动器很可能缓存了写操作。这种情况下,系统要启用直接写入(write-through),除非你的磁盘控制卡有电池。(unless you have a disk controller card with battery backed RAM)

更改组提交间隔

使用journalCommitInterval更改组提交间隔。允许范围为2-300ms

值越低日志的持续性越好,但代价是降低磁盘性能。

意外关闭时的数据恢复

如果遇到数据库崩溃,MongoDB需要进行日志重演,完成之后服务才变的可用。如果MongoDB必须重演日志,在日志输出端会进行提示。

该情况不需进行repairDatabase

日志间隔

mongd开启了journaling运行过程中, MongoDB stores and applies write operations in memory and in the journal before the changes are in the data files.

日志文件

MongoDB开启日志后,在定义好的dbpath内创建一个日志目录。日志目录下存放日志文件,这些文件是预先写入的redo日志。这个目录同时还存放一个最后序列数字文件。如果数据库被干净地关闭,journal目录下的文件会全部被删除。

日志文件是追加式文件,这些文件有一个前缀j._。当日志文件达到1G,MongoDB创建一个新的日志文件。当日志文件中所有的写操作已经被应用,该文件会被删除。除非每秒钟你写入了很多数据,否则该目录下应该只包括两到三个日志文件。

如果想想限制日志文件最大为128M,使用在mongod运行时使用smallfiles命令。

 

重要

If you place the journal on a different filesystem from your data files you cannot use a filesystem snapshot to capture consistent backups of a dbpath directory.

 

日志中的存储视图

journaling在mongodb中添加了三个存储视图

共享视图(shared view)存储了要上传到MongoDB数据文件中的修改过的数据。共享视图是唯一能够直接访问MongoDB数据文件的视图。当实例开启了journaling,mongod会要求系统将磁盘上已存在的数据文件映射到共享视图的内存视图(sharedview memory view)。操作系统映射这些文件,但不加载它们。如果后续需要,mongoDB会将这些数据文件加载进来。

私有视图(private view)存储了需要读操作的数据。MongoDB maps private view to the shared view and is the first place MongoDB applies new write operations.

日志是一种记录在磁盘上的视图,该视图存储了新的写入操作,这些操作已经被记录在私有cache中,但还没有写入到数据文件。日志提供了数据持续性。如果mongod实例崩溃,但没有将数据写入数据文件,日志可以通过将数据重演到共享视图,最后写入数据文件。

日志如何记录写操作

MongoDB将写操作复制一组提交(journal in batches called group commits)。默认,每100ms之行一次组提交:即每100msmongodb将该100ms内的所有命令一次提交。这种组提交策略降低了对性能的影响。

日志存储原始操作,以便MongoDB可以将其进行重组:

  • 文档插入/更新
  • 索引更改
  • 名称空间文件的更改

写操作发生时,MongDB将数据写入RAM中的私有视图,然后将其批量复制到日志。日志将这些操作记录到磁盘。mongodb以条目形式在journal的前向指针中添加操作。每个条目描述了在数据文件的哪些字节处有写操作。

As part of journaling, MongoDB routinely asks the operating system to remap the shared view to the private view, for consistency.

MongoDB之后将journal的写操作应用到共享视图。此时,共享视图和数据文件变的不一致。

默认每隔60s,MongoDB请求操作系统将共享视图内容刷入数据文件。这保证了总是最新的。

当MongoDB将写操作刷入数据文件时,MongoDB将写操作从journal's behind pointer中移除此操作。

When MongoDB flushes write operations to the data files, MongoDB removes the write operations from the journal’s behind pointer. The behind pointer is always far back from advanced pointer.

作为日志记录的一部分,为了一致性,MongoDB会定期要求操作系统重新将共享视图映射进私有视图。

 

 

http://mongodb-documentation.readthedocs.io/en/latest/administration/journaling.html

广告 广告

评论区