mongodb并发控制(锁)浅谈(3.0)、mongodb3.0新特性一览、MMAPv1空间占用问题
mongodb
summary_2018/09
1、mongodb锁浅谈
1.1、概述
- MongoDB allows multiple clients to read and write the same data. In order to ensure consistency, it uses locking and other concurrency control measures to prevent multiple clients from modifying the same piece of data simultaneously.
1.2、What type of locking does MongoDB use?
- 锁的类型
- S,IS,X,IX;(意向锁是为了方便检测表级锁和行级锁之间的冲突,提高加锁的效率)
## mongo中锁的描述
Lock Mode Description
R Represents Shared (S) lock.
W Represents Exclusive (X) lock.
r Represents Intent Shared (IS) lock.
w Represents Intent Exclusive (IX) lock.
- Locks are fair, with reads and writes being queued in order. However, to optimize throughput,when one request is granted, all other compatible requests will be granted at the same time.(即为了吞吐量会优先读,但是也会避免饥饿的产生(即仅一次请求中))
## 当一个X锁刚好释放:队列中:IS → IS → X → X → S → IS
mongo并非严格的FIFO,MongoDB will actually grant all IS and S modes,当释放S和IS锁时,队列中:IS → IS → X → X:
此时,消费X锁,所以并不会产生饥饿。
1.3、How granular are locks in MongoDB?
- 支持多种级别粒度的并发控制。
- WiredTiger:For most read and write operations, WiredTiger uses optimistic concurrency control. WiredTiger uses only intent locks at the global, database and collection levels. When the storage engine detects conflicts between two operations, one will incur a write conflict causing MongoDB to transparently retry that operation.(WT使用乐观锁实现并发控制,仅在全局、数据库、或者集合级别加意向锁,当发生冲突时,进行透明的重试(????))
- MMAP在3.0锁粒度由库级别锁提升为集合级别锁。
1.4、What locks are taken by some common client operations?
## 对于支持文档级别锁的存储引擎而言:
v3.0:
Operation Database Collection
Issue a query r (Intent Shared) r (Intent Shared)
Insert data w (Intent Exclusive) w (Intent Exclusive)
Remove data w (Intent Exclusive) w (Intent Exclusive)
Update data w (Intent Exclusive)w (Intent Exclusive)
Perform Aggregation r (Intent Shared) r (Intent Shared)
Create an index (Foreground) W (Exclusive)
Create an index (Background) w (Intent Exclusive) w (Intent Exclusive)
Changed in version 4.0:
Map-reduce W (Exclusive) and R (Shared) w (Intent Exclusive) and r (Intent Shared)
1.5、How do I see the status of locks on my mongod instances?
db.serverStatus()
db.currentOp()
mongotop
mongostat
Tips:To terminate an operation, use db.killOp().
1.6、参考文档
2、mongodb3.0新特性一览
2.1、概述
- Key features include support for the WiredTiger storage engine, pluggable storage engine API, SCRAM-SHA-1 authentication mechanism, and improved explain functionality.improved MMAPv1.
2.2、主要新特性
- 1、support pluggable storage engine API(支持可拔插存储引擎)
- 2、support for the WiredTiger storage engine
- 文档级别并发控制(MVCC)
- 磁盘数据压缩
- 存储方式的改进
- WiredTiger存储方式上也有很大改进。旧版本Mongo在数据库级别分配文件,数据库中的所有集合和索引都混合存储在数据库文件中,所以即使删掉了某个集合或者索引,占用的磁盘空间也很难及时自动回收。WiredTiger在集合和索引级别分配文件,数据库中的所有集合和索引均存储在单独的文件中,集合或者索引删除后,对应的存储文件随即删除。
- 可配置内存使用上限
- WiredTiger支持内存使用容量配置,用户通过storage.wiredTiger.engineConfig.cacheSizeGB参数即可控制MongoDB所能使用的最大内存,该参数默认值为物理内存大小的一半。MAP存储引擎消耗内存是出了名的,只要数据量够大,简直就是有多少用多少,即可以占满。
- 3、MMAPv1存储引擎提升
- 锁粒度由库级别锁提升为集合级别锁,提高一定的并发能力
- 文档空间分配方式改变:paddingFactor->usePowerOf2Sizes(使预分配的空间更加容易使用和维护)
- 复制集(可参考原文档)
- 分片(可参考原文档)
- 其它:
1、优化explan函数
新版本explain函数可以支持count,find,group,aggregate,update,remove等操作的查询计划显示,结果更全面更精细。
2、重写mongodb工具
新版本所有mongodb自带工具均使用Go语言重写,特别是在mongodump和mongorestore添加了并行机制,这样可以大大加快数据的导出和导入。
3、日志输出控制
新版本中将日志分为不同的模块,其中包括ACCESS、COMMAND、CONTROL、GEO、INDEX、NETWORK、QUERY、REPL、SHARDING、STORAGE、JOURNAL和WRITE等。用户可以动态调整每个模块的日志级别,这无疑更有利于系统问题诊断。
4、 索引构建优化
后台索引建立过程中,不能进行删库删表删索引操作,且后台索引建立过程不会因此自动中断。另外,使用createIndexes命令可以同时建立多个索引,并且只扫描一遍数据,提升了建索引的效率。
MMAPv1空间占用大的原因:
1、预分配方式,会占用比较大一部分空间
2、不支持压缩
3、存储方式在数据库级别分配:即使删掉了某个集合或者索引,占用的磁盘空间也很难及时自动回收
2.3、参考文档