WhattypeoflockingdoesMongoDBuse?
mongodb用的是什么类型的锁
MongoDBusesareaders-writer[1]lockthatallowsconcurrentreadsaccesstoadatabasebutgivesexclusiveaccesstoasinglewriteoperation.
mongodb使用读写锁(共享-排他锁、多读单写锁),允许对数据库进行并发的读访问,并且对每一个写操作提供排他的访问。
Whenareadlockexists,manyreadoperationsmayusethislock.However,whenawritelockexists,asinglewriteoperationholdsthelockexclusively,andnootherreadorwriteoperationsmaysharethelock.
当存在一个读锁时,很多读操作均可使用这个锁。当一个写锁出现,一个写操作排他的占有该锁,并且不被其他的读或者写操作共享。
Locksare“writergreedy,”whichmeanswriteshavepreferenceoverreads.Whenbothareadandwritearewaitingforalock,MongoDBgrantsthelocktothewrite.
锁是偏向于写操作的,即相对于读操作,写操作有更高的优先权。当一个读和写操作同时在等待一个锁时,mongodb优先给写操作分配锁。
HowgranulararelocksinMongoDB?
Changedinversion2.2.
mongodb中锁的粒度
Beginningwithversion2.2,MongoDBimplementslocksonaper-databasebasisformostreadandwriteoperations.Someglobaloperations,typicallyshortlivedoperationsinvolvingmultipledatabases,stillrequireaglobal“instance”widelock.Before2.2,thereisonlyone“global”lockpermongodinstance.
从2.2版本起,对大多数读写操作,mongodb实现了基于数据库的锁。全局操作,典型的比如涉及多个数据库的shortlived操作,依旧会请求实例级别的全局锁,在2.2之前,每个mongodb实例只有一个全局锁。
Forexample,ifyouhavesixdatabasesandonetakesawritelock,theotherfivearestillavailableforreadandwrite.
例如,如果你有六个数据库,其中一个有写锁,其他的五个仍然可以进行读写。
HowdoIseethestatusoflocksonmymongodinstances?
我如何查看mongod实例的锁状态
Forreportingonlockutilizationinformationonlocks,useanyofthefollowingmethods:
db.serverStatus(),
db.currentOp(),
mongotop,
mongostat,and/or
theMongoDBMonitoringService(MMS)
Specifically,thelocksdocumentintheoutputofserverStatus,orthelocksfieldinthecurrentoperationreportingprovidesinsightintothetypeoflocksandamountoflockcontentioninyourmongodinstance.
Toterminateanoperation,usedb.killOp().
Doesareadorwriteoperationeveryieldthelock?
Newinversion2.0.
读写操作会交出锁吗?
Areadandwriteoperationswillyieldtheirlocksifthemongodreceivesapagefaultorfetchesdatathatisunlikelytobeinmemory.Yieldingallowsotheroperationsthatonlyneedtoaccessdocumentsthatarealreadyinmemorytocompletewhilemongodloadsdocumentsintomemory.
如果mongod接收到未命中的缓存页或者去取不在内存中的数据,读写操作将放弃他们的锁。这样就允许mongod进行其他只需要访问内存里的文档即可完成的操作,同时加载自身需要的数据到内存。
Additionally,writeoperationsthataffectmultipledocuments(i.e.update()withthemultiparameter,)willyieldperiodicallytoallowreadoperationsduringtheselogwriteoperations.Similarly,longrunningreadlockswillyieldperiodicallytoensurethatwriteoperationshavetheopportunitytocomplete.
此外,多个文档上的写操作(比如带有multi操作的update),在日志写的时间内,会周期性地交出锁以容许读操作。类似的,长时间的读锁也会定期的退让以便写操作有机会完成。
Changedinversion2.2:TheuseofyieldingexpandedgreatlyinMongoDB2.2.Includingthe“yieldforpagefault.”MongoDBtracksthecontentsofmemoryandpredictswhetherdataisavailablebeforeperformingaread.IfMongoDBpredictsthatthedataisnotinmemoryareadoperationyieldsitslockwhileMongoDBloadsthedatatomemory.Oncedataisavailableinmemory,thereadwillreacquirethelocktocompletestheoperation.
2.2版本极大地扩展了yielding,包括因为pagefault的yielding。mongodb会跟踪内存并在执行一个读之前预判数据是否可用。如果数据不在内存,读操作即交出锁同时mongodb加载数据到内存。一旦数据到了内存,该读操作会再次搜索那个读锁完成此次操作。
##################################################
--1 MongoDB 使用的锁
MongoDB 使用的是“readers-writer”锁,可以支持并发但有很大的局限性,当一个读锁存在,许多
读操作可以使用这把锁,然而, 当一个写锁的存在,一个单一的写操作会 exclusively 持有该锁,同时
其它读,写操作不能使用共享这个锁;举个例子,假设一个集合里有 10 个文档,多个 update 操作不能
并发在这个集合上,即使是更新不同的文档。
--2 锁的粒度
在 2.2 版本以前,mongod 只有全局锁;在 2.2 版本开始,大部分读写操作只锁一个库,相对之前版本,
这个粒度已经下降,例如如果一个 mongod 实例上有 5 个库,如果只对一个库中的一个集合执行写操作,那
么在写操作过程中,这个库被锁;而其它 5 个库不影响。相比 RDBMS 来说,这个粒度已经算很大了!
--3 如何查看锁的状态
db.serverStatus()
db.currentOp()
mongotop
mongostat
the MongoDB Monitoring Service (MMS)
--4 哪些操作会对数据库产生锁?
下表列出了常见数据库操作产生的锁。
Operation
Lock Type
Issue a query |
Read lock |
Get more data from acursor
|
Read lock |
Insert data |
Write lock |
Remove data |
Write lock |
Update data |
Write lock |
Map-reduce |
Read lock and write lock, unless operations are specified as non-atomic. Portions of map-reduce jobs can run concurrently. |
Create an index |
Building an index in the foreground, which is the default, locks the database for extended periods of time. |
db.eval() |
Write lock.db.eval()blocks all other JavaScript processes. |
eval |
Write lock. If used with thenolocklock option, theevaloption does not take a write lock and cannot write data to the database. |
aggregate() |
Read lock |
--5 哪些数据库管理操作会锁数据库?
某些数据库管理操作会 exclusively 锁住数据库,以下命令需要申请 exclusively 锁,并锁定一段时间
db.collection.ensureIndex(),
reIndex,
compact,
db.repairDatabase(),
db.createCollection(), when creating a very large (i.e. many gigabytes) capped collection,
db.collection.validate(),
db.copyDatabase().This operation may lock all databases
以下命令需要申请 exclusively 锁,但锁定很短时间。
db.collection.dropIndex(),
db.collection.getLastError(),
db.isMaster(),
rs.status() (i.e. replSetGetStatus,)
db.serverStatus(),
db.auth(), and
db.addUser().
备注:可见,一些查看命令也会锁库,在比较繁忙的生产库中,也会有影响的。
--6 锁住多个库的操作
以下数据库操作会锁定多个库。
db.copyDatabase() must lock the entire mongod instance at once.
Journeying, which is an internal operation, locks all databases for short intervals.
All databases share a single journal.
User authentication locks the admin database as well as the database the user is accessing.
All writes to a replica set’s primary
lock both the database receiving the writes and the
local database. The lock for the local database allows the mongod to write to the primary’s oplog.
分享到:
相关推荐
详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...
MongoDB支持副本集和分片集群等多种复制机制,可以在多个服务器之间复制数据,提高数据的可靠性和系统的可伸缩性。 ##### 9.2 复制概念 - **主节点**:处理写入操作的节点。 - **从节点**:复制主节点数据的节点。...
- **锁机制**:详细说明了锁的工作原理及其在并发控制中的作用。 #### 9.5 分片与MongoDB FAQ - **分片概念**:回顾了分片的基本概念。 - **分片策略**:提供了一些分片的策略和建议。 #### 9.6 复制集与复制FAQ -...
详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...
- **MongoDB锁机制** - 包括全局锁、集合锁、文档锁等,用于控制并发访问。 #### 六、C++语言 **6.1 C++静态成员** - **static的作用** - 在C++中表示类的静态成员变量或函数,在C中表示变量或函数的作用范围仅...
使用乐观锁机制防止并发问题,保证数据一致性。 2.4 支付接口:集成第三方支付平台如支付宝或微信支付,提供支付接口。使用异步处理模型,保证支付的及时性和可靠性。 2.5 订单管理:保存用户的购票记录,包括订单...
并发处理是现代系统架构中不可避免的问题,需要理解线程、进程的区别,掌握锁机制、线程池等概念,以确保系统的稳定运行。 #### 2.3 网络编程 网络编程是分布式系统的基础,理解TCP/IP协议、HTTP协议的工作原理,...
改进版的2PC协议,增加了预提交阶段,减少了锁的等待时间,提高了系统的吞吐量。 **3.3 消息中间件(最终一致性)** 通过消息中间件实现最终一致性,如使用RocketMQ来保证消息的可靠传递和消费。 #### 四、队列 **...
2.2 分布式数据处理MapReduce 21 2.2.1 产生背景 21 2.2.2 编程模型 22 2.2.3 实现机制 22 2.2.4 案例分析 24 2.3 分布式锁服务Chubby 25 2.3.1 Paxos算法 26 2.3.2 Chubby系统设计 27 2.3.3 Chubby中的Paxos 29 ...
它使得开发者能够更容易地实现诸如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等复杂功能。 ##### 1.1 Spring Cloud 核心组件介绍 - **Eureka*...
尽管JSON功能可能不如NoSQL数据库如MongoDB那样全面,但MySQL 5.7的JSON支持具有混合存储结构化和非结构化数据的能力,同时提供了完整的事务处理机制,这是许多NoSQL数据库所不具备的。 2.2.2 生成列(Generated ...
- **同步关键字**:`sync` 包中的原子操作和互斥锁。 **2.7 小结** - **基础知识总结**:理解 Go 语言的核心特性,为后续 Web 开发打下坚实的基础。 #### 三、Web 基础 **3.1 Web 工作方式** - **客户端/服务器...