MongoDB的In-Memory存储引擎
在企业版 3.2.6版本开始,MongoDB开始有In-Memory存储引擎,除了一些元数据和诊断数据外,In-Memory存储引擎不会存储任何数据到磁盘,包括配置数据、索引、用户凭证等。
因为避免了磁盘IO,所以In-Memory存储引擎在操作的延迟会更小。
一、In-Memory存储引擎基本概念
1、需要在MongoDB启动时候指定 --storageEngine,或者配置文件中指定storage.engine。
2、需要指定--dbpath,In-Memory存储引擎会在磁盘存储一些元数据和诊断数据、以及创建大索引时使用到的临时文件。
3、In-Memory存储引擎在进程关闭后将不再保存数据。
4、In-Memory存储引擎支持文档级并发。
5、In-Memory存储引擎要求所有的数据、包括索引以及oplog等使用的内存都要限制在inMemorySizeGB参数内,默认情况下In-Memory存储引擎对内存的使用为50%物理内存-1G,当一个写操作导致超出当前的内存限制,MongoDB会直接报错。
6、In-Memory存储引擎不支持多文档事务。
二、In-Memory数据持久性
1)In-Memory存储引擎是不持久的,也不会将数据写入到一个持久化的存储引擎。
2)In-Memorey对数据、索引、用户权限、复制集信息等都不具有持久性。
3)在In-Memory存储引擎下,通过journal等待数据达到持久化是不存在的。
4)在副本集中,任何vote>0的节点如果使用In-Memory存储引擎,需要将该节点的writeConcernMajorityJournalDefault设置为false。
5)在In-Memory存储引擎下,一个指定write concern的写操作,journal认证后会立即被返回。当MongoDB实例关闭或者意外宕机后,是无法恢复内存中的这些数据的。
三、常见部署体系结构
1)两个节点使用In-Memory存储引擎;
2)一个节点使用WiredTiger存储引擎,且设置该节点的priority=0,hidden=true;
3)这样部署保证In-Memory存储引擎的节点为primary节点,且客户端仅可以连接到In-Memory存储引擎的节点。即使副本集提供业务节点出现宕机,也可以通过WiredTiger存储引擎的节点来sync进行数据恢复。
四、journaling
1)因为In-Memory存储引擎将所有数据保存在内存,包括journal也在内存中,当操作指定j:true,会立刻会返回。
2)In-Memory存储引擎的副本集节点必须设置writeConcernMajorityJournalDefault为false。
3)当writeConcernMajorityJournalDefault设置为false,MongoDB将不会等待w:“majority”在写入jounal file后完成ack。因此该参数可能有roll back的风险。