我最近已经阅读了很多关于MongoDB的内容,但是我找不到任何明确材料的一个主题是如何将数据写入日志和oplog。
所以这就是我对这个过程的理解,请纠正我错误的地方
我也想知道日记是否被禁用(我明白这是一个非常糟糕的主意),oplog和数据库在什么时候更新?
最后,我对这个过程中的哪些点感到有些不满,写锁被创建了。这是在数据库和oplog更新时还是在其他时候?
感谢任何能够对此有所了解或者指出一些阅读材料的人。
西蒙
答案 0 :(得分:4)
据我所知,这是发生的事情。我简化了一点,但它应该清楚它是如何工作的。
如果您仔细阅读过,您会注意到,只要它已通过查询优化器运行,并且已应用于映射到内存的文件,数据就已准备好用于oplog。当其中一个辅助节点拉入oplog条目时,它会立即应用于它的内存映射文件的数据,并以与主节点相同的方式在磁盘中同步。
有些注意事项:只要将相对较小的数据写入期刊,就会非常安全。如果节点在两个同步到数据文件之间发生故障,则数据文件和oplog都可以从数据文件和日志中的最后一个状态恢复。通常,您可以拥有的最大数据丢失是上次提交后记录到日志中的操作,中位数为50毫秒。
至于锁。如果您已仔细编写,则在将数据同步到磁盘时,不会对数据库级别施加锁定。可以创建写锁定以确保在任何给定时间点仅一个线程修改给定文档。还有其他写锁可能,但一般来说,它们应该是相当罕见的。
文件系统层上的写锁定只创建一次,但只是隐式地,iirc。在应用程序启动期间,将在dbpath的根目录中创建锁定文件。当存在有效锁时,任何其他mongod实例将拒绝对这些数据文件执行任何操作。而你也不应该;)
希望这有帮助。