MongoDB的存储引擎是一个很重要的组件,负责MongoDB如何在内存和磁盘中存储数据。MongoDB支持多种存储引擎,因为不同的应用场景使用不同的存储引擎可以使MongoDB的性能表现更佳。
从MongoDB3.2开始,MongoDB默认使用WiredTiger存储引擎。它很适合用于高负载的应用,也是官方首选建议使用的存储引擎。WiredTgier存储引擎提供一个文档级别的并发模型,检验点功能和压缩功能。MongoDB企业版本还支持加密功能。
MongoDB3.2之前MMAPv1是默认的存储引擎,MongoDB企业版还支持内存存储引擎,将文档存储在内存。
1.WiredTiger存储引擎
从MongoDB3.0开始,64位版本的MongoDB支持WiredTiger存储引擎。可以在命令行或是配置文件中指定存储引擎,MongoDB3.2默认使用WiredTiger存储引擎。
--storageEngine=wiredTiger
YMAL格式配置文件
storage.engine=wiredTiger
文档级别的并发
WiredTiger使用文档级别的并发来控制写入操作。因此,多个客户端可以同时修改同一个集合的不同的文档。
参考文档:
https://docs.mongodb.com/manual/storage/
本文出自 “Linux SA John” 博客,请务必保留此出处http://john88wang.blog.51cto.com/2165294/1784379
MongoDB存储引擎
标签:mongodb
小编还为您整理了以下内容,可能对您也有帮助:
如何检查当前mongodb是否启用了WiredTiger存储引擎
可以至少通过以下2种方法 验证:
1、在Linux/OSX上执行如下的命令
WIREDTIGER_CONFIGURED=`ps -ef|grep mongod|grep -i storageengine|grep -ic wiredtiger`echo ${WIREDTIGER_CONFIGURED}
如果返回为1则说明当前系统中运行着一个以WiredTiger为存储引擎的mongod
2、在Linux/OSX上执行如下的命令
echo "db.serverStatus()"| mongo|grep wiredTiger
若返回信息中有wiredTiger,则说明该mongo连接到了一个启用了wiredTiger存储引擎的mongod.
注意对于启用了wiredTiger的文件路径–dbpath,无法再使用默认mmapv1存储引擎打开
如何修改mongodb存储引擎
至少通2种 验证: 1、Linux/OSX执行命令 WIREDTIGER_CONFIGURED=`ps -ef|grep mongod|grep -i storageengine|grep -ic wiredtiger`echo ${WIREDTIGER_CONFIGURED} 返1则说明前系统运行着WiredTiger存储引擎mongod 2、Linux/OSX执行命令 echo "db.serverStatus()"| mongo|grep wiredTiger 若返信息wiredTiger则说明该mongo连接启用wiredTiger存储引擎mongod. 注意于启用wiredTiger文件路径–dbpath再使用默认mmapv1存储引擎
如何修改mongodb存储引擎
至少通2种 验证: 1、Linux/OSX执行命令 WIREDTIGER_CONFIGURED=`ps -ef|grep mongod|grep -i storageengine|grep -ic wiredtiger`echo ${WIREDTIGER_CONFIGURED} 返1则说明前系统运行着WiredTiger存储引擎mongod 2、Linux/OSX执行命令 echo "db.serverStatus()"| mongo|grep wiredTiger 若返信息wiredTiger则说明该mongo连接启用wiredTiger存储引擎mongod. 注意于启用wiredTiger文件路径–dbpath再使用默认mmapv1存储引擎
为什么有关MongoDB采用B树索引,以及Mysql B+树做索引
事实上,在MySQL数据库中,诸多存储引擎使用的是B+树,即便其名字看上去是BTREE。
4.1 innodb的索引机制
先以innodb存储引擎为例,说明innodb引擎是如何利用B+树建立索引的
首先创建一张表:zodiac,并插入一些数据
对于innodb来说,只有一个数据文件,这个数据文件本身就是用B+树形式组织,B+树每个节点的关键字就是表的主键,因此innode的数据文件本身就是主索引文件,如下图所示,主索引中的叶子页(leaf page)包含了数据记录,但非叶子节点只包含了主键,术语“聚簇”表示数据行和相邻的键值紧凑地存储在一起,因此这种索引被称为聚簇索引,或聚集索引。
这种索引方式,可以提高数据访问的速度,因为索引和数据是保存在同一棵B树之中,从聚簇索引中获取数据通常比在非聚簇索引中要来得快。
所以可以说,innodb的数据文件是依靠主键组织起来的,这也就是为什么innodb引擎下创建的表,必须指定主键的原因,如果没有显式指定主键,innodb引擎仍然会对该表隐式地定义一个主键作为聚簇索引。
同样innodb的辅助索引,如下图所示,假设这些字符是按照生肖的顺序排列的(其实我也不知道具体怎么实现,不要在意这些细节,就是举个例子),其叶子节点中也包含了记录的主键,因此innodb引擎在查询辅助索引的时候会查询两次,首先通过辅助索引得到主键值,然后再查询主索引,略微有点啰嗦
如何将MongoDB改造成内存数据库
日前有测试需求将MongoDB改成内存数据库。我们知道MongoDB有一个In-Memory存储引擎,但是社区版不能用。所以我们自己想办法将MongoDB改造成内存数据库,经过探索,有三种方式。
研究版本:mongo-3.4
方式一:使用tmpfs作为文件系统
方式二:使用ramfs作为文件系统
这两种方式的思路都差不多,使用一个内存模拟文件系统,由于替换了磁盘文件系统,数据就保留在内存中。
方式三:修改源码设置in_memory参数
其实wiredtiger本身就支持将数据保留在内存中不刷盘,MongoDB的内存引擎估计也是利用wt的这一特性。wiredtiger.in文件中,wiredtiger_open()函数会传入配置信息config,函数前面的注释详细解释了有哪些配置项,其中就列出了in_memory配置,如下图说明。
如果修改源码传入in_memory=true编译还是会报错,提示incompatible argument in-memor。
报上述错误是因为开源版本对这个参数进行了检查,如果设置了就会传回错误码,修改方式很简单,令它不返回错误码就行了。
就这样我们将MongoDB改成了内存数据库。
由上至下的文件位置分别在:
src/third_party/wiredtiger/src/include/wiredtiger.in
src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
src/third_party/wiredtiger/src/conn/conn_ckpt.c
最近重新使用这个内存数据库,发现报出新的错误,提示in_memory与log不能同时设置,这个log的设置默认为true,如果指定nojournal,那么会置为false。不过先检查后重置,所以报错。
解决方法是在检查之前就加入log=(enabled=false)
然后启动./mongod –dbpath {path} –nojournal
如何将MongoDB改造成内存数据库
日前有测试需求将MongoDB改成内存数据库。我们知道MongoDB有一个In-Memory存储引擎,但是社区版不能用。所以我们自己想办法将MongoDB改造成内存数据库,经过探索,有三种方式。
研究版本:mongo-3.4
方式一:使用tmpfs作为文件系统
方式二:使用ramfs作为文件系统
这两种方式的思路都差不多,使用一个内存模拟文件系统,由于替换了磁盘文件系统,数据就保留在内存中。
方式三:修改源码设置in_memory参数
其实wiredtiger本身就支持将数据保留在内存中不刷盘,MongoDB的内存引擎估计也是利用wt的这一特性。wiredtiger.in文件中,wiredtiger_open()函数会传入配置信息config,函数前面的注释详细解释了有哪些配置项,其中就列出了in_memory配置,如下图说明。
如果修改源码传入in_memory=true编译还是会报错,提示incompatible argument in-memor。
报上述错误是因为开源版本对这个参数进行了检查,如果设置了就会传回错误码,修改方式很简单,令它不返回错误码就行了。
就这样我们将MongoDB改成了内存数据库。
由上至下的文件位置分别在:
src/third_party/wiredtiger/src/include/wiredtiger.in
src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp
src/third_party/wiredtiger/src/conn/conn_ckpt.c
最近重新使用这个内存数据库,发现报出新的错误,提示in_memory与log不能同时设置,这个log的设置默认为true,如果指定nojournal,那么会置为false。不过先检查后重置,所以报错。
解决方法是在检查之前就加入log=(enabled=false)
然后启动./mongod –dbpath {path} –nojournal
MongoDB 5.0新特性概览
MongoDB 5.0标志着一个新的发布周期的到来,以更快地交付新特性给到用户。版本化API与在线重新分片相结合,使用户不必担心未来的数据库升级以及业务变化问题;本地原生时间序列数据平台也使MongoDB能支持更广泛的工作负载和业务场景;新的MongoDB Shell能够提升用户体验等均为MongoDB 5.0的功能。本文主要介绍MongoDB 5.0的新特性。
MongoDB 5.0通过原生支持整个时间序列数据的生命周期(从采集、存储、查询、实时分析和可视化,到在线归档或随着数据老化自动失效),使构建和运行时间序列应用程序的速度更快、成本更低。随着MongoDB 5.0的发布,MongoDB扩展了通用的应用数据平台,使开发能够更容易地处理时间序列数据,进一步扩展其在物联网、金融分析、物流等方面的应用场景。
MongoDB的时间序列集合以高度优化和压缩的格式自动存储时间序列数据,减少了存储大小和I/O,以实现更好的性能和更大的规模。同时也缩短了开发周期,使您能够快速建立一个针对时间序列应用的性能和分析需求而调优的模型。
创建时间序列数据集合的命令示例:
MongoDB可以无缝地调整采集频率,并根据动态生成的时间分区自动处理无序的测量值。最新发布的MongoDB Connector for Apache Kafka实现了在本地支持时间序列,您可以直接从Kafka主题消息中自动创建时间序列集合,使您在收集数据的同时根据需要对数据进行处理和聚合,然后写入到MongoDB的时间序列集合。
时间序列集合自动创建一个按时间排序的数据聚集索引,降低查询数据的延迟。MongoDB查询API还扩展了窗口函数,您可以运行分析性查询(例如移动平均数和累积总和)。在关系型数据库系统中,这些通常被称为SQL分析函数,并支持以行为单位定义的窗口(即三行移动平均线)。MongoDB更进一步,还增加了指数移动平均线、导数和积分等强大的时间序列函数,支持您以时间为单位定义窗口(例如15分钟的移动平均线)。窗口函数可用于查询MongoDB的时间序列和常规集合,为多种应用类型提供了新的分析方式。另外,MongoDB 5.0也提供了新的时间运算符,包括$dateAdd、$dateSubstract、$dateDiff和$dateTrunc,使您可以通过自定义的时间窗口对数据进行汇总和查询。
您可以将MongoDB的时间序列数据与企业的其他数据相结合。时间序列集合可以与同一个数据库中的常规MongoDB集合放在一起,您不必选择一个专门的时间序列数据库(它不能为任何其他类型的应用提供服务),也不需要复杂的集成来混合时间序列和其他数据。MongoDB通过提供一个统一的平台,让您建立高性能和高效的时间序列应用的同时,也为其他用例或工作负载提供支持,从而消除了整合和运行多个不同数据库的成本和复杂性。
从MongoDB 5.0开始, Write Concern 默认级别为majority,仅当写入操作被应用到Primary节点(主节点)且被持久化到大多数副本节点的日志中的时候,才会提交并返回成功,“开箱即用”地提供了更强的数据可靠性保障。
说明 Write Concern 是完全可调的,您可以自定义配置 Write Concern ,以平衡应用程序对数据库性能和数据持久性的要求。默认情况下,一个客户端连接对应后端MongoDB服务器上的一个线程( net.serviceExecutor 配置为synchronous)。创建、切换和销毁线程都是消耗较大的操作,当连接数过多时,线程会占用MongoDB服务器较多的资源。
连接数较多或创建连接失控的情况称为“连接风暴”,产生该情况的原因可能是多方面的,且经常是在服务已经受到影响的情况下发生。
针对这些情况,MongoDB 5.0采取了以下措施:
以上措施,加上之前版本在mongos查询路由层的改进,进一步提升了MongoDB承受高并发负载的能力。
长时间运行的快照查询(Long-Running Snapshot Queries)增加了应用程序的通用性和弹性。您可以通过该功能运行默认时间为5分钟的查询(或将其调整为自定义持续时间),同时保持与实时事务性数据库一致的快照隔离,也可以在Secondary节点(从节点)上进行快照查询,从而在单个集群中运行不同的工作负载,并将其扩展到不同的分片上。
MongoDB通过底层存储引擎中一个名为Durable history的项目实现了长期运行的快照查询,该项目早在MongoDB 4.4中就已实现。Durable history将存储自查询开始以来所有变化的字段值的快照。通过使用Durable history,查询可以保持快照隔离,即使在数据发生变化的情况下,Durable history也有助于降低存储引擎的缓存压力,使得业务可以在高写入负载的场景下实现更高的查询吞吐量。
为了提供更好的用户体验,MongoDB 5.0从头开始重新设计了MongoDB Shell(mongosh),以提供一个更现代化的命令行体验,以及增强可用性的功能和强大的脚本环境。新版MongoDB Shell已经成为MongoDB平台的默认shell。新版MongoDB Shell引入了语法高亮、智能自动完成、上下文帮助和有用的错误信息,为您创造一个直观、互动的体验。
随着新的PyMongoArrow API的发布,您可以在MongoDB上使用Python运行复杂的分析和机器学习。PyMongoArrow可以快速将简单的MongoDB查询结果转换为流行的数据格式(例如Pandas数据框架和NumPy数组),帮助您简化数据科学工作流程。
Schema验证(模式验证)是对MongoDB进行数据应用管理控制的一种方式。MongoDB 5.0中,模式验证变得更加简单和友好,当操作验证失败时都会产生描述性的错误信息,帮助您了解不符合集合验证器的验证规则的文档及原因,以快速识别和纠正影响验证规则的错误代码。
MongoDB 5.0支持将正在进行中的索引创建任务在节点重新启动后自动会恢复至原来的位置,减少计划中维护动作对业务的影响。例如:重新启动或升级数据库节点时,您不需要担心当前正在进行的大集合索引创建任务失效。
由于MongoDB支持很多版本和平台,每个发布版本都需在20多个MongoDB支持的平台上进行验证,验证工作量大,降低了MongoDB新功能的交付速度,所以从MongoDB 5.0开始,MongoDB发布的版本将分为Marjor Release(大版本)和Rapid Releases(快速发布版本),其中Rapid Releases作为开发版本提供下载和测试体验,但不建议用在生产环境。
mysql和mongodb的关系区别是什么
1、数据库模型:mysql是关系型数据库,mongodb是非关系型数据库
2、存储方式:mysql不同的存储引擎有不同的存储方式,mongodb为虚拟内存+持久化
3、查询语句:mysql为传统的sql语句,mongodb有独特的自有查询方式
4、架构特点:mysql有常见的单点,m-s、mha、mmm、cluster等架构特点,mongodb可以通过副本集以及分片来实现高可用
5、数据处理方式:mysql不同的引擎有各自的特点,mongodb基于内存,将数据存储在物理内存中,从而达到高速读写
6、成熟度:mysql拥有较为成熟的体系,成熟度较高,mongodb新兴数据库,成熟度较低
mysql和mongodb的关系区别是什么
1、数据库模型:mysql是关系型数据库,mongodb是非关系型数据库
2、存储方式:mysql不同的存储引擎有不同的存储方式,mongodb为虚拟内存+持久化
3、查询语句:mysql为传统的sql语句,mongodb有独特的自有查询方式
4、架构特点:mysql有常见的单点,m-s、mha、mmm、cluster等架构特点,mongodb可以通过副本集以及分片来实现高可用
5、数据处理方式:mysql不同的引擎有各自的特点,mongodb基于内存,将数据存储在物理内存中,从而达到高速读写
6、成熟度:mysql拥有较为成熟的体系,成熟度较高,mongodb新兴数据库,成熟度较低
MongoDB副本集同步原理解析
在MongoDB的副本集中,节点之间是通过oplog来同步数据。Primary节点每执行一次数据写入,都会记录一条oplog,Secondary节点会持续不断的自Primary拉取oplog并在本地回放,从而确保各节点达到数据最终一致性。
Primary节点并发写入数据,时间点分别为t1、t2和t3,按时间先后排序为 t1 -> t2 -> t3;如果t1和t3先落库,t2后落库,那么在oplog集合中如何能保证有序呢?
MongoDB底层通用的存储引擎为WiredTiger、In-Memory,以WiredTiger为例,MongoDB管理层调用WiredTiger引擎接口向oplog集合中插入文档(即记录);
WiredTiger会以 oplog 的 ts 字段作为 key、文档内容作为 value,写入一条 KV 记录,wiredtiger 会保证存储(btree 或 lsm 的方式都能保证)的文档按 key 来排序,这样就解决 “Primary节点oplog如何保证有序” 的问题;
并发写入多条oplog ts1、ts2、ts3和ts4,其中 ts1<ts2<ts3<ts4,如果ts1、ts2和ts4先写入primary成功,ts3存在延迟,还未写入,此时secondary节点自pirmary拉取oplog在本地回放,如何保证有序呢?
MongoDB(wiredtiger 引擎)的解决方案是在读取oplog时进行,保证Secondary 节点看到一定是顺序的,具体实现机制如下:
如此既可以确保 “secondary节点在本地回放oplog时有序”
Secondary节点回放oplog在保证有序的前提下,如何保证高效呢?如下:
如果OpQueue队列中的oplog有对同一个collection的操作,后续并发进行数据回放时,如何保证同一个collections中两条oplog的执行顺序呢?
参考文档:
MongoDB 如何保证 oplog 顺序?
MongoDB复制集同步原理解析
win32下安装mongodb的问题
错误信息的提示是“当前版本的mongod不可以用wiredTiger存储引擎”。
根据官网的说明32位的mongodb确实是不支持wiredTiger存储引擎的。
所以你可以启动的时候用--storageEngine来指定一个其它的引擎
或者下载一个别的版本。
详细信息
【Document that WiredTiger does not support 32bit platforms】
https://jira.mongodb.org/browse/DOCS-4660