Mongodb学习整理之数据存储引擎

从Mongodb4.0开始Mongodb加入了事务控制,那么我们就来整理一下事务控制实现得益于什么?在3.0之前Mongodb默认的存储方式是MMAPv1,在3.0版本后加入了WiredTiger存储引擎。在4.0之后弃用了存储引擎MMAPv1,那么这两种存储引擎之间有什么区别呢?MMAPv1他的并发控制级别是(collection)级别的就是说他的锁是加在集合上面的,就是说如果有人在写这个集合那么其他人就只能等待他释放锁。WiredTiger并发控制级别是(Document)级别的,就是说他的锁是加在文档级别的,粒度已经跟关系型数据库差不多了,因为我们说数据库的有效锁定是行级锁,所以WiredTiger对高并发性能提高还是非常明显的。下面是官网对这两种引擎模型的说明。

For WiredTiger
Beginning with version 3.0, MongoDB ships with the WiredTiger storage engine.
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.Some global operations, typically short lived operations involving multiple databases, still require a global “instance-wide” lock. Some other operations, such as dropping a collection, still require an exclusive database lock.
For MMAPv1
The MMAPv1 storage engine uses collection-level locking as of the 3.0 release series, an improvement on earlier versions in which the database lock was the finest-grain lock. Third-party storage engines may either use collection-level locking or implement their own finer-grained concurrency control.For example, if you have six collections in a database using the MMAPv1 storage engine and an operation takes a collection-level write
lock, the other five collections are still available for read and write operations. An exclusive database lock makes all six collections unavailable for the duration of the operation holding the lock.What is a storage engine?A storage engine is the part of a database that is responsible for managing how data is stored, both in memory and on disk. Many databases support multiple storage engines, where different engines perform better for specific workloads. For example, one storage engine might offer better performance for read-heavy workloads, and another might support a higher throughput for write operations.ou can have replica set members that use different storage engines.

下面开始我们所有的知识点的整理都是围绕着WiredTiger存储引擎整理的,对于WiredTiger,mongodb同时使用WiredTiger内部缓存和文件系统缓存。从MongoDB 3.4开始,默认wiredtiger内部缓存大小为以下两者中的较大值:50%(RAM-1 GB),或256兆字节。举例来说,假如你的系统有4G的RAM,则wiredtiger内部缓存使用的内存大小是(4G-1G)*0.5=1.5G,如果你的系统总共有1.25G的RAM,按照刚才的公司(1.25G-1G)*0.5=128M,结果小于256M,这是wiredtiger内部缓存大小是256M。如果想要详细控制Mongodb的内存使用量的话可以使用参数storage.wiredTiger.engineConfig.cacheSizeGB为nG,也就是根据情况设置几个G或几百M。

默认wiredtiger内部缓存大小值假定每台计算机只有一个mongod实例。如果一台机器包含多个MongoDB实例,那么应该减少设置以适应其他MongoD实例。如果在无法访问系统中所有可用RAM的容器(例如lxc、cgroups、docker等)中运行mongod,则必须将storage.wiredtiger.engineconfig.cachesizegb设置为小于容器中可用RAM数量的值。确切数量取决于容器中运行的其他进程。有一点是需要重点关注的地方,wiredtiger存储引擎在删除文档时维护数据文件中的空记录列表。这个空间可以被wiredtiger重用,但是除非在非常特殊的情况下,否则不会返回到操作系统。

默认情况下,wiredtiger对所有集合使用快速块压缩,对所有索引使用前缀压缩。压缩默认值可以在全局级别配置,也可以在收集和索引创建期间按每个集合和每个索引设置。Wiredtiger内部缓存中的数据与磁盘格式使用不同的表示形式:文件系统缓存中的数据与磁盘格式相同,包括对数据文件进行压缩的好处。操作系统使用文件系统缓存来减少磁盘I/O。wiredtiger内部缓存中加载的索引与磁盘格式具有不同的数据表示形式,但仍可以利用索引前缀压缩来减少RAM使用。索引前缀压缩将删除索引字段中的常见前缀。wiredtiger内部缓存中的收集数据是未压缩的,使用与磁盘格式不同的表示形式。块压缩可以节省大量的磁盘存储空间,但数据必须解压缩才能由服务器操作。通过文件系统缓存,MongoDB自动使用WiredTiger缓存或其他进程未使用的所有可用内存。

Checkpoints
从3.6版开始,mongodb将wiredtiger配置为每隔60秒创建检查点(即,将快照数据写入磁盘)。在早期版本中,MongoDB将检查点设置为每隔60秒或在写入2GB日志数据时(以先发生者为准)在wiredtiger中对用户数据执行检查。

Journal Data
MongoDB根据以下间隔或条件写入磁盘:MongoDB每隔50毫秒将缓冲日志数据同步到磁盘(从MongoDB 3.2开始)如果写入操作包含j:true的写入问题,wiredtiger将强制同步wiredtiger日志文件。因为MongoDB使用的日志文件大小限制为100MB,所以wiredtiger大约每100MB数据创建一个新的日志文件。当wiredtiger创建新的日志文件时,wiredtiger将同步上一个日志文件。

目前,MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟缓存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。 那么Mongodb的内存具体设置多大合适呢?(内存 > 索引 + 热数据)就是理想的一个状态,所以如果业务量比较小的数据还是可以的,如果业务量真的是很大的话还是做数据分片吧,Mongodb的数据分片是非常容易的,不过可能会有一些成本。还有一点比较重要就是不要讲Mongodb和其他一些对内存,硬盘等使用率比较高的应用部署在一个环境,如数据库,redis等。

今天的总结就是这些了,Mongodb需要整理的知识还是很多,简单的使用并不能让你很好的理解一个产品的核心原来,官网是一个比较详细的产品说明书,而想要深入理解还需要在实践中不断总结,思考,对比,当各种方案融合之后,出现了各种问提才是我们真正提高的时候,如果只是初窥门径,没有任何生成中的问题检验是没有任何意义的,真所谓实践出真知,实践是检验一切的真理,送给各位看客。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值