首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用日志的MongoDB磁盘操作

禁用日志的MongoDB磁盘操作
EN

Database Administration用户
提问于 2018-02-15 21:47:43
回答 3查看 2K关注 0票数 0

假设MongoDB 3.6,使用WiredTiger,禁用日记:

单神如何将数据写入硬盘?它对每个文档执行写操作?每块钱?还有类似的:读物怎么样?还有:这些读写是随机的还是连续的?

更进一步:写日志文件时是否与创建快照时类似?

对问题的进一步解释:我试图限制运行MongoDB的Docker容器对硬盘驱动器的使用,所以我首先按照以下指南对磁盘进行基准测试:binarylane.com -如何对磁盘I/O进行基准测试。它说

同样,数据库和许多其他程序将读取非常小的数据块--4千字节是一个很好的工作估计。

我想知道这个假设是否适用于MongoDB。

EN

回答 3

Database Administration用户

发布于 2018-04-27 01:21:23

WiredTiger有两种主要方法来确保数据的持久性:日志记录和检查点。

检查点存储整个数据库的有效和一致状态。如果服务器因任何原因崩溃,它可以从上一个检查点以一致状态重新启动。默认情况下,WiredTiger每60秒检查一次数据库。

日记存储发生在检查点之间的文字。如果数据库在检查点之间崩溃,日志数据将在最后一个已知的良好检查点之上重放。日志每50毫秒被保存到磁盘上。与检查点相比,日志记录过程被优化为轻量级得多(而且工作量也要少得多),因此它通常比检查点快得多。

如果禁用日志记录,则在独立模式或复制集模式下运行的mongod之间的行为略有不同:

  • MongoDB 3.6.4禁用日志记录:只有整个数据库的完整状态被写入每个检查点上的磁盘。也就是说,如果您的数据库在检查点之间崩溃,则可能会丢失写入的最后60秒(如果使用默认检查点计时值)。
  • MongoDB 3.6.4禁用日志记录的副本集:根据设计,副本集需要更多的持久性,因为它必须记录oplog中的每个操作,并确保oplog安全地持久化。因此,它将对每次写入执行一个检查点。这将大大减缓复制集的速度。

通过禁用日志所做的权衡:

  • 在独立部署中,由于数据库的主要目标是持久化数据,限制磁盘使用(空间或IOPS)将导致允许写入之间丢失更多的数据。但是,不建议为生产目的运行独立的MongoDB。
  • 在复制集中,由于需要持久化oplog,写入过程被大大减缓。这也将使部署使用更多的磁盘IOPS。在MongoDB的未来版本中,不允许运行没有日志的副本集(请参阅服务器-30347)。

有关日记的更多信息,请参见日志记录过程页面。

票数 2
EN

Database Administration用户

发布于 2018-02-17 15:12:49

单神如何将数据写入硬盘?它对每个文档执行写操作?每块钱?还有类似的:读物怎么样?还有:这些读写是随机的还是连续的?

作为MongoDB BOL 这里日志过程Changed in version 3.2

使用journalingWiredTiger为每个客户端启动的write操作创建一个日志记录。日志记录包括由初始写入引起的任何内部write operations。例如,对集合中的文档的更新可能导致对索引的修改;WiredTiger创建一个既包括更新操作又包括其相关索引修改的single journal record

MongoDB将WiredTiger配置为使用内存中的缓冲来存储日记记录.线程协调分配并复制到缓冲区的一部分。All journal records up to 128 kB are buffered

对于日志文件,MongoDB在dbPath目录下创建一个名为日记的子目录。WiredTiger日志文件具有以下格式的名称( WiredTigerLog.<sequence> ),其中<sequence>是从0000000001开始的zero-padded数字。

日志文件包含一个记录per each write operation。每个记录都有一个唯一的标识符。MongoDBWiredTiger配置为对日志数据使用snappy压缩。

为了在发生故障时提供持久性,Note :使用对磁盘上的journal文件预先写入日志记录。

正如MongoDB所记录的这里 A sequentialbinary transaction log用于在硬关闭时将数据库带入有效状态。日志首先将数据写入日记,然后写入核心数据文件。默认情况下,MongoDB为MongoDB version 2.0和更新的64-bit构建启用日志记录。日志文件是预先分配的,并作为文件存在于数据目录中。

更进一步:写日志文件时是否与创建快照时类似?

如果将journal放在与数据文件不同的filesystem上,则不能单独使用filesystem快照来捕获dbPath目录的有效备份。在这种情况下,使用fsyncLock()确保快照之前的数据库文件与快照完成后的fsyncUnlock()一致。

Note : db.fsyncUnlock()是一种管理操作。

关于进一步的参考资料,这里 这里

票数 1
EN

Database Administration用户

发布于 2018-02-17 01:01:56

虽然你的问题没有得到完整的回答:

WiredTiger存储引擎不对每次写入执行磁盘操作,而是以60秒的间隔将数据刷新到磁盘。更详细的信息可以找到这里

读取操作将首先查找WiredTiger缓存中的数据,然后根据需要将数据提取到缓存中。

日志行为与快照不同。日志写入行为描述为这里

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/198063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档