这就是 MongoDB 对日志记录的看法:
为了在发生故障时提供持久性,MongoDB 使用预写日志记录到磁盘日志文件。
但是对于WiredTiger:
重要的
在写入操作之间,当日志记录保留在 WiredTiger 缓冲区中时,更新可能会在 mongod 硬关闭后丢失。
如果 WiredTiger 中的日记功能不能完全保证不会丢失更新,我们必须在编写应用程序时注意某些文档可能会“消失”,那么考虑到它会减慢写入速度,为什么还要启用日记功能呢?
似乎如果您不能丢失更新*,则必须选择带日记功能的MMAPv1,如果可以的话,您可能更愿意选择不带日记功能的 WiredTiger 。
(*) 由于回滚,您仍然可能会丢失 MongoDB 集群中的更新,尽管您可以使用w: majority write concern或对 rollback/ folder 中的文件做一些事情来避免回滚。
不管是 wiredTiger 还是 MMAPv1,它们只是存储引擎。是否丢失更新取决于写入问题。
您的应用程序与 MongoDB 服务器通信,该服务器主要写入具有页面缓存的内存,这些页面会定期从永久性磁盘写入和读取。还有一个记录所有内容的日志。
当您写入数据库时,它会同时写入页面和日志。页面将根据内存压力写入磁盘。默认情况下,您不等待来自日志的确认,因为日志可能有一段时间不会写入磁盘,这由 j=false 表示。默认情况下 w=1 这意味着它只确认写入缓存页面。
默认值:w = 1, j = false - 这很快,但是如果在日志有机会写入磁盘之前发生某些事情,那么数据就会丢失。更糟糕的是,如果您依赖 w = 1,它会显示数据已被写入/持久化。
w = 1, j = true - 在这种情况下,您等待日志确认它已写入磁盘。这要慢很多,但可以确保数据持久化。