【问题标题】:Is it safe to delete the journal file of mongodb?删除mongodb的日志文件安全吗?
【发布时间】:2013-11-01 05:13:25
【问题描述】:

如果我删除 3.1G 日志文件,sudo service mongodb restart 将失败。但是,此文件占用了太多空间。我怎么解决这个问题?如何删除它?

bash$ du -sh /var/lib/mongodb/*
4.0K    _tmp
65M auction_development.0
128M    auction_development.1
17M auction_development.ns
3.1G    journal
4.0K    mongod.lock

【问题讨论】:

    标签: linux mongodb disk


    【解决方案1】:

    TL;DR:你有两个选择。将 MongoDB 启动到 limit the size of the journal files 到 128MB 时使用 --smallfiles 启动选项,或使用 --nojournal 选项关闭日志。在生产环境中使用--nojournal 通常是个坏主意,而且在开发环境中使用不同的写入关注点通常是有意义的,这样您就不会在开发和生产环境中使用不同的代码。

    长答案: 不,删除日志文件并不安全。日记的想法是这样的:

    写入。现在,为了使写入持久化(并使数据库持久化),写入必须以某种方式进入磁盘。

    不幸的是,写入磁盘需要 eons compared to writes to the RAM,因此数据库处于两难境地:不写入磁盘是有风险的,因为意外关闭会导致数据丢失。但是每次写入操作都写入磁盘会严重降低数据库的性能,以至于无法用于实际用途。

    现在,数据库不再写入数据文件本身,也不再为每个请求执行此操作,而是简单地附加到日志文件,其中存储了尚未提交到实际数据文件的所有操作。这要快得多,因为文件已经“热”了,因为它一直在被读写,而且它只是一个文件,而不是一堆文件,最后,因为它每 100 毫秒批量写入所有挂起的操作默认。在某些事情中间删除此文件会造成严重破坏。

    【讨论】:

    • 信息答案 - 是否可以清除日志文件?释放空间?
    • @wmock 仅当您在(Mitjas 回答)[stackoverflow.com/a/25516871/1318694] 中添加 smallfiles 选项并在删除之前完全停止数据库时。如果每次数据库启动时缺少日志文件,将重新创建日志文件。 smallfiles 选项更改这些文件的大小。
    • 我只是想知道默认情况下拥有 3 gig 日志文件的基本原理是什么。他们是否期望普通用户每 100 毫秒会修改 3 gig 的数据?
    • 日志文件仅追加,因此它们不会每 100 毫秒被删除或清空。一旦它们达到 1gig 的大小,它们就会被旋转,一旦不再需要它们就会被删除(即,当所有更改都已应用时)。这引入了另一个级别的复杂性,持久性线程需要确保确保没有挂起的写入,因此两到三个文件可能共存。见docs.mongodb.org/manual/core/journaling/#journal-files
    【解决方案2】:

    正如 mnemosyn 的回答中所解释的,日志对于存储引擎来说是必不可少的。幸运的是,它可以在一定程度上得到控制。以下是为 MMAPv1 存储引擎编写的,这是 MongoDB 3.2 之前的默认设置。然后,WiredTiger 成为首选引擎,可以在此答案的底部找到更多信息。

    MMAPv1

    MongoDB

    对于我们的开发服务器,我们使用了以下过程:

    cp -p /etc/mongodb.conf /etc/mongodb.conf.orig
    vi /etc/mongodb.conf
    

    现在,插入

    smallfiles=true
    

    进入mongodb.conf,然后保存。 smallfiles 将日志文件限制为 128MB。

    service mongodb stop
    rm -rf /var/lib/mongodb/journal/*
    service mongodb start
    

    MongoDB >= 2.6(YAML 配置)

    如果您使用带有 YAML config style 的 MMAPv1,请使用与上述相同的步骤备份配置,但要备份到

      mmapv1:
    

    配置块,插入

        smallFiles: true 
    

    。之后,按照上述步骤进行操作,在删除日志的同时重新启动服务器。

    WiredTiger(MongoDB >=3.0,自 3.2 起默认)

    在开发机器上,默认情况下,WiredTiger 下的日志文件应该比 MMAPv1 下的日志文件小一些,因为默认情况下启用了journal compression。根据the documentation,“MongoDB 的 WiredTiger 日志文件的最大大小限制约为 100 MB”。它将“每隔 60 秒或 2 GB 的日志数据创建检查点(即将快照数据写入磁盘)。”

    因此,如果您只在数据库上运行少量请求(几乎不需要更改数据),则使用 WiredTiger 的日志文件不应超过 100 MB 的低倍数。然而,日志文件的大小似乎不可配置。

    【讨论】:

    • 配置文件格式在 2.6 版本更改为 YAML。见:docs.mongodb.org/manual/reference/configuration-options/…
    • 感谢@Skarllot 指出这一点。由于我不再使用 MongoDB,如果有人将我的答案扩展为 2.6 版的部分,我将不胜感激。
    • 我更新了答案以反映 YAML 和 WiredTiger。
    • 如果我们部署了一个为日志文件分配有限空间的 RAID 10 集群,有没有办法限制日志文件的数量?
    【解决方案3】:

    mongodb 从那以后不断发展。现在是v3.4.1 stable
    我在v3.2,方法如下:
    取消注释# mmapv1:,看起来像:

      mmapv1:
        smallFiles: true 
    

    如果您有不同的版本,请在 reference/configuration-options 页面上查找 storage Options

    别忘了清空journal

    sudo service mongodb stop
    sudo rm -rf /var/lib/mongodb/journal/*
    sudo service mongodb start
    

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多