假设MongoDB 3.6,使用WiredTiger,禁用日记:
单神如何将数据写入硬盘?它对每个文档执行写操作?每块钱?还有类似的:读物怎么样?还有:这些读写是随机的还是连续的?
更进一步:写日志文件时是否与创建快照时类似?
对问题的进一步解释:我试图限制运行MongoDB的Docker容器对硬盘驱动器的使用,所以我首先按照以下指南对磁盘进行基准测试:binarylane.com -如何对磁盘I/O进行基准测试。它说
同样,数据库和许多其他程序将读取非常小的数据块--4千字节是一个很好的工作估计。
我想知道这个假设是否适用于MongoDB。
发布于 2018-04-27 01:21:23
WiredTiger有两种主要方法来确保数据的持久性:日志记录和检查点。
检查点存储整个数据库的有效和一致状态。如果服务器因任何原因崩溃,它可以从上一个检查点以一致状态重新启动。默认情况下,WiredTiger每60秒检查一次数据库。
日记存储发生在检查点之间的文字。如果数据库在检查点之间崩溃,日志数据将在最后一个已知的良好检查点之上重放。日志每50毫秒被保存到磁盘上。与检查点相比,日志记录过程被优化为轻量级得多(而且工作量也要少得多),因此它通常比检查点快得多。
如果禁用日志记录,则在独立模式或复制集模式下运行的mongod之间的行为略有不同:
有关日记的更多信息,请参见日志记录过程页面。
发布于 2018-02-17 15:12:49
单神如何将数据写入硬盘?它对每个文档执行写操作?每块钱?还有类似的:读物怎么样?还有:这些读写是随机的还是连续的?
作为MongoDB BOL 这里日志过程Changed in version 3.2。
使用journaling,WiredTiger为每个客户端启动的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。每个记录都有一个唯一的标识符。MongoDB将WiredTiger配置为对日志数据使用snappy压缩。
为了在发生故障时提供持久性,
Note :使用对磁盘上的journal文件预先写入日志记录。
正如MongoDB所记录的这里 A sequential,binary transaction log用于在硬关闭时将数据库带入有效状态。日志首先将数据写入日记,然后写入核心数据文件。默认情况下,MongoDB为MongoDB version 2.0和更新的64-bit构建启用日志记录。日志文件是预先分配的,并作为文件存在于数据目录中。
更进一步:写日志文件时是否与创建快照时类似?
如果将journal放在与数据文件不同的filesystem上,则不能单独使用filesystem快照来捕获dbPath目录的有效备份。在这种情况下,使用fsyncLock()确保快照之前的数据库文件与快照完成后的fsyncUnlock()一致。
Note : db.fsyncUnlock()是一种管理操作。
https://dba.stackexchange.com/questions/198063
复制相似问题