MongoDB将写入锁定到什么级别?(或者:“每个连接”是什么意思;

MongoDB将写入锁定到什么级别?(或者:“每个连接”是什么意思;,mongodb,concurrency,locking,Mongodb,Concurrency,Locking,在mongodb文档中,它说: 从版本2.2开始,MongoDB在每个数据库的基础上为大多数读写操作实现锁。一些全局操作(通常是涉及多个数据库的短期操作)仍然需要全局“实例”范围的锁。在版本2.2之前,每个mongod实例只有一个“全局”锁 这是否意味着在我有,比方说,3个连接的情况下mongodb://localhost/test 来自网络上运行的不同应用程序-一次只能写入一个应用程序?或者只是每个连接 IOW:是每个连接,还是整个/test数据库在写入时被锁定?不是每个连接,而是每个mong

在mongodb文档中,它说:

从版本2.2开始,MongoDB在每个数据库的基础上为大多数读写操作实现锁。一些全局操作(通常是涉及多个数据库的短期操作)仍然需要全局“实例”范围的锁。在版本2.2之前,每个mongod实例只有一个“全局”锁

这是否意味着在我有,比方说,3个连接的情况下mongodb://localhost/test 来自网络上运行的不同应用程序-一次只能写入一个应用程序?或者只是每个连接


IOW:是每个连接,还是整个/test数据库在写入时被锁定?

不是每个连接,而是每个
mongod
。换句话说,锁将存在于该服务器上所有连接到
test
数据库的连接中

它也是一个读/写锁,所以如果发生写入,那么读取必须等待,否则MongoDB怎么知道它是一致读取

但是,我应该提到,MongoDB锁与您获得的SQL/普通事务锁非常不同,通常在平均更新之间锁会保持大约一微秒。

MongoDB锁不同 MongoDB中的锁定与RDBMS中的锁定不同,因此需要进行一些解释。在早期版本的MongoDB中,只有一个全局读写器闩锁。从MongoDB 2.2开始,每个数据库都有一个读写器闩锁

读者和作者 闩锁是多读卡器、单写卡器,并且是写卡器贪婪型。这意味着:

  • 一个数据库上可以有无限数量的同时读卡器
  • 在任何一个数据库中的任何集合上,一次只能有一个writer(稍后将对此进行详细介绍)
  • 作家排斥读者
  • 所谓“writer greedy”,我的意思是,一旦一个写入请求进入,所有读卡器都会被阻塞,直到写入完成(稍后将对此进行详细介绍)
请注意,我将其称为“闩锁”而不是“锁”。这是因为它是轻量级的,并且在正确设计的架构中,写锁的保持时间大约为十几微秒。有关读写器锁定的更多信息,请参阅

在MongoDB中,您可以同时运行任意多个查询:只要相关数据在RAM中,它们都会得到满足,而不会发生锁定冲突

原子文档更新 回想一下,在MongoDB中,事务级别是单个文档。对单个文档的所有更新都是原子的。MongoDB通过保持写闩锁的时间与更新RAM中单个文档的时间相同来实现这一点。如果有任何运行缓慢的操作(特别是,如果文档或索引项需要从磁盘分页),则该操作将产生写闩锁。当该操作产生闩锁时,下一个排队操作可以继续

这确实意味着对单个数据库中所有文档的写入都会被序列化。如果架构设计不好,并且写入需要很长时间,这可能是一个问题,但在正确设计的架构中,锁定不是问题

贪婪的作家 关于作家贪婪的几句话:

一次只能有一个写入程序可以保持闩锁;多个读卡器一次可以保持闩锁。在一个简单的实现中,如果只有一个读卡器在运行,写入程序可能会无限期地饿死。为了避免这种情况,在MongoDB实现中,一旦任何单个线程对特定闩锁发出写入请求

  • 所有需要该闩锁的后续读卡器都将阻塞
  • 该编写器将等待当前所有读卡器完成
  • 写入程序将获取写闩锁,执行其工作,然后释放写闩锁
  • 所有排队的读卡器现在都将继续
实际行为是复杂的,因为这种编写器贪婪行为与屈服的交互方式可能并不明显。回想一下,从2.2版开始,每个数据库都有一个单独的锁存器,因此写入数据库“a”中的任何集合将获得一个单独的锁存器,而不是写入数据库“B”中的任何集合

具体问题 关于具体问题:

  • 锁(实际上是锁存)由MongoDB内核持有的时间只有更新单个文档所需的时间
  • 如果有多个连接进入MongoDB,并且每个连接都在执行一系列写入操作,则每个数据库的锁存时间仅为完成写入所需的时间
  • 执行写入(更新/插入/删除)的多个连接都将交错
虽然这听起来像是一个很大的性能问题,但实际上它并不会降低速度。有了正确设计的架构和典型的工作负载,MongoDB将在任何数据库的锁定百分比超过50%之前,使磁盘I/O容量饱和(即使是SSD)


据我所知,目前容量最高的MongoDB群集每秒执行200万次写入操作。

Mongo3.0现在支持集合级锁定

除此之外,现在Mongo还创建了一个允许创建存储引擎的API。Mongo 3.0附带了两个存储引擎:

  • MMAPv1:默认存储引擎和以前版本中使用的存储引擎。带有集合级锁定
  • WiredTiger:新的存储引擎配备文档级锁定和压缩功能。(仅适用于64位版本)

  • 我知道这个问题已经很老了,但仍然有一些人感到困惑


    从MongoDB 3.0开始,WiredTiger存储引擎(使用文档级并发性)在64位版本中可用

    WiredTiger对写入操作使用文档级并发控制