`

MongoDB锁机制 2.2

 
阅读更多

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管理与开发实战详解pdf.part1

    详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...

    MongoDB手册

    MongoDB支持副本集和分片集群等多种复制机制,可以在多个服务器之间复制数据,提高数据的可靠性和系统的可伸缩性。 ##### 9.2 复制概念 - **主节点**:处理写入操作的节点。 - **从节点**:复制主节点数据的节点。...

    MongoDB-manual.pdf

    - **锁机制**:详细说明了锁的工作原理及其在并发控制中的作用。 #### 9.5 分片与MongoDB FAQ - **分片概念**:回顾了分片的基本概念。 - **分片策略**:提供了一些分片的策略和建议。 #### 9.6 复制集与复制FAQ -...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...

    后台开发核心技术面试集锦

    - **MongoDB锁机制** - 包括全局锁、集合锁、文档锁等,用于控制并发访问。 #### 六、C++语言 **6.1 C++静态成员** - **static的作用** - 在C++中表示类的静态成员变量或函数,在C中表示变量或函数的作用范围仅...

    火车售票管理系统-java.zip

    使用乐观锁机制防止并发问题,保证数据一致性。 2.4 支付接口:集成第三方支付平台如支付宝或微信支付,提供支付接口。使用异步处理模型,保证支付的及时性和可靠性。 2.5 订单管理:保存用户的购票记录,包括订单...

    2010年系统架构师考试试题

    并发处理是现代系统架构中不可避免的问题,需要理解线程、进程的区别,掌握锁机制、线程池等概念,以确保系统的稳定运行。 #### 2.3 网络编程 网络编程是分布式系统的基础,理解TCP/IP协议、HTTP协议的工作原理,...

    Java高级架构必备知识点

    改进版的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 ...

    java毕业设计&课设-SpringCloud微服务大型电商架构系统(视频+源码+资料).doc

    它使得开发者能够更容易地实现诸如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等复杂功能。 ##### 1.1 Spring Cloud 核心组件介绍 - **Eureka*...

    MySQL 5.7新特性介绍

    尽管JSON功能可能不如NoSQL数据库如MongoDB那样全面,但MySQL 5.7的JSON支持具有混合存储结构化和非结构化数据的能力,同时提供了完整的事务处理机制,这是许多NoSQL数据库所不具备的。 2.2.2 生成列(Generated ...

    go web编程

    - **同步关键字**:`sync` 包中的原子操作和互斥锁。 **2.7 小结** - **基础知识总结**:理解 Go 语言的核心特性,为后续 Web 开发打下坚实的基础。 #### 三、Web 基础 **3.1 Web 工作方式** - **客户端/服务器...

Global site tag (gtag.js) - Google Analytics