MongoDB写入和锁定进程

时间:2014-09-16 17:07:32

标签: mongodb replication locks journaling

我最近已经阅读了很多关于MongoDB的内容,但是我找不到任何明确材料的一个主题是如何将数据写入日志和oplog。

所以这就是我对这个过程的理解,请纠正我错误的地方

  • 客户端连接到mongod并执行写入。写入存储在套接字缓冲区
  • 当Mongo可用时(不确定此时可用的方法),数据会写入期刊吗?
  • 然后mongoDB文档说每隔60秒就会将日志从日志刷新到磁盘上。通过这个我只能假设写入主要和oplog的意思。如果是这种情况,如何写入的时间早于60秒同步间隔?
  • 一段时间后,辅助服务器会从主服务器或其同步源中获取数据并更新其oplog和数据库。关于何时发生这种情况并将其延迟,似乎很模糊。

我也想知道日记是否被禁用(我明白这是一个非常糟糕的主意),oplog和数据库在什么时候更新?

最后,我对这个过程中的哪些点感到有些不满,写锁被创建了。这是在数据库和oplog更新时还是在其他时候?

感谢任何能够对此有所了解或者指出一些阅读材料的人。

西蒙

1 个答案:

答案 0 :(得分:4)

据我所知,这是发生的事情。我简化了一点,但它应该清楚它是如何工作的。

  1. 客户端连接到mongo 。到目前为止还没有完成任何写入,没有连接被拆除,因为它实际上取决于写入关注现在发生了什么。让我们假设我们(在撰写本文时)默认"已确认&#34 34。
  2. 客户端发送其写入操作。这是我真的不确定的地方。在此步骤或下一步骤之后,确认将发送给驱动程序。
  3. 写操作通过查询优化器运行。在此处发送确认是因为在确认的写入问题中,您可能会返回重复键错误。有可能在最后一步检查了这一点。如果我打赌,我会说它是在这之后。
  4. 然后将查询优化器的输出应用于内存中的数据 实际上应用于内存映射数据文件的数据,内存映射的oplog和日志& #39;内存映射文件。查询从此内存映射部分回答,或者相应数据映射到内存以回答查询。如果存在,则从内存中读取oplog。
  5. 通常每100毫秒日志会同步到磁盘。精确值由许多因素决定,其中一个因素是journalCommitInterval configuration parameter。如果你有记录的写作问题,现在会通知司机。
  6. 每隔syncDelay秒,内存映射文件的当前状态将同步到磁盘我认为日记被截断为不是&#39的条目; t还应用于数据,但我不太确定,因为它基本上不会发生日志中的数据尚未应用于当前数据。
  7. 如果您仔细阅读过,您会注意到,只要它已通过查询优化器运行,并且已应用于映射到内存的文件,数据就已准备好用于oplog。当其中一个辅助节点拉入oplog条目时,它会立即应用于它的内存映射文件的数据,并以与主节点相同的方式在磁盘中同步。

    有些注意事项:只要将相对较小的数据写入期刊,就会非常安全。如果节点在两个同步到数据文件之间发生故障,则数据文件和oplog都可以从数据文件和日志中的最后一个状态恢复。通常,您可以拥有的最大数据丢失是上次提交后记录到日志中的操作,中位数为50毫秒。

    至于锁。如果您已仔细编写,则在将数据同步到磁盘时,不会对数据库级别施加锁定。可以创建写锁定以确保在任何给定时间点仅一个线程修改给定文档。还有其他写锁可能,但一般来说,它们应该是相当罕见的。

    文件系统层上的写锁定只创建一次,但只是隐式地,iirc。在应用程序启动期间,将在dbpath的根目录中创建锁定文件。当存在有效锁时,任何其他mongod实例将拒绝对这些数据文件执行任何操作。而你也不应该;)

    希望这有帮助。