本文内容:
- In-Memory存储引擎配置
- 并发
- 内存使用
- 持久化
- 事务
- 部署架构
在版本3.2.6中的改变。
从MongoDB Enterprise 3.2.6版开始,In-Memory存储引擎是64位版本中广泛使用(general availability GA)的一部分。除某些元数据和诊断数据外,In-Memory存储引擎不维护任何磁盘上的数据,包括配置数据,索引,用户凭据等。
In-Memory存储引擎通过避免了磁盘I / O操作,对数据库操作的延迟更可预测、可控。
In-Memory存储引擎设置(Specify In-Memory Storage Engine)
要使用In-Memory存储引擎,请指定:
- 配置--storageEngine选项值为inMemory;如果使用配置文件,则配置storage.engine。
- 配置--dbpath,如果使用配置文件则配置storage.dbPath。尽管In-Memory存储引擎不会将数据写入文件系统,但它会在--dbpath中维护小型元数据文件和诊断数据以及用于构建大型索引的临时文件。
例如:
mongod --storageEngine inMemory --dbpath <path>
或者,如果使用YAML配置文件格式:
storage:
engine: inMemory
dbPath: <path>
请参阅inMemory Options中有关In-Memory存储引擎的配置选项。除与数据持久性相关的那些选项(例如日志记录或静态配置加密)外,大多数mongod配置选项均可用于In-Memory存储引擎。
警告
进程关闭后,In-Memory存储引擎不会保留数据。
并发(Concurrency)
In-Memory存储引擎对于写入操作使用了文档级并发控制。结果,多个客户端可以同时修改集合的不同文档。
内存使用(Memory Use)
In-Memory存储引擎要求其所有数据(包括索引,oplog-如果mongod实例是副本集的一部分等)的大小必须与在--inMemorySizeGB命令行选项中 或
YAML配置文件的 storage.inMemory.engineConfig.inMemorySizeGB 中指定的内存大小相适应。
默认情况下,In-Memory存储引擎使用50%的物理RAM减去1 GB。
如果写操作的数据超过了指定的内存大小,则MongoDB返回错误:
"WT_CACHE_FULL: operation would overflow cache"
要指定新大小,请使用YAML格式配置文件的storage.inMemory.engineConfig.inMemorySizeGB进行设置:
storage:
engine: inMemory
dbPath: <path>
inMemory:
engineConfig:
inMemorySizeGB: <newSize>
或使用命令行选项--inMemorySizeGB:
mongod --storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>
持久化(Durability)
In-Memory存储引擎是非持久性的,不会将数据写入进行持久存储。非持久数据包括应用程序数据和系统数据,例如用户,权限,索引,副本集配置,分片群集配置等。
因此,journal(日志)或等待持久化的数据不适用于In-Memory存储引擎。
如果副本集的任何有投票权的成员使用In-Memory存储引擎,则必须将writeConcernMajorityJournalDefault设置为false。
注意
从版本4.2(以及4.0.13和3.6.14)开始,如果副本集成员使用In-Memory存储引擎(投票或不投票),但是副本集的writeConcernMajorityJournalDefault设置为true,则副本集成员记录一个启动警告。
将writeConcernMajorityJournalDefault设置为false时,MongoDB在确认写入之前,不会等待 w: "majority"写操作写入磁盘日志(正常是写入磁盘后才会确认)。这样,如果给定副本集中大多数节点的瞬时丢失(例如崩溃和重新启动),多数写入操作可能会回滚。
在journaled中指定了写关注的写操作会立即被确认。当mongod实例由于shutdown命令或由于系统错误而关闭时,无法恢复内存中的数据。
事务(Transactions)
从MongoDB 4.2开始,副本集和分片群集上支持事务,其中:
- 主成员节点使用WiredTiger存储引擎
- 同时,辅助成员使用WiredTiger存储引擎或In-Memory存储引擎。
在MongoDB 4.0中,只有使用WiredTiger存储引擎的副本集才支持事务。
注意
无法在 包含了将writeConcernMajorityJournalDefault设置为false的分片 的分片群集上运行事务,例如,包含了使用In-Memory存储引擎的投票成员的分片。
部署架构(Deployment Architectures)
除了独立运行外,使用In-Memory存储引擎的mongod实例还可以作为副本集的一部分或分片群集的一部分运行。
副本集(Replica Set)
使用了In-Memory存储引擎的mongod实例可以作为副本集的一部分。例如,作为三成员副本集的一部分,您可能需要:
- 两个mongod实例使用In-Memory存储引擎运行。
- 一个mongod实例使用WiredTiger存储引擎运行。将WiredTiger成员配置为隐藏成员(即hidden:true和priority: 0)。
使用此部署模型,只有In-Memory存储引擎mongod实例才能成为主要成员。客户端仅连接到In-Memory存储引擎mongod实例。即使两个In-Memory存储引擎的mongod实例都崩溃并重新启动,它们也可以从WiredTiger成员进行同步。使用WiredTiger存储引擎的隐藏mongod实例会将数据持久保存到磁盘,包括用户数据,索引和复本配置信息。
注意
In-Memory存储引擎要求其所有数据(如果mongod是副本集的一部分,则包括oplog等在内)都必须符合指定的--inMemorySizeGB命令行选项或
storage.inMemory.engineConfig.inMemorySizeGB设置。请参阅内存使用。
分片集群(Sharded Cluster)
您可以将In-Memory存储引擎mongod实例部署为分片群集的一部分。例如,在分片群集中,您可以拥有一个由以下副本集组成的分片:
- 两个使用In-Memory存储引擎的mongod实例
- 一个使用WiredTiger存储引擎的mongod实例。将WiredTiger成员配置为隐藏成员(即hidden:true和priority: 0)。
在此分片上,添加标签inmem。例如,如果此分片的名称为shardC,请连接到mongos并运行sh.addShardTag()。
例如,
sh.addShardTag("shardC", "inmem")
向其他分片添加一个单独的标签persisted。
sh.addShardTag("shardA", "persisted")
sh.addShardTag("shardB", "persisted")
对于应驻留在inmem碎片上的每个碎片集合,将标签inmem分配给整个块范围:
sh.addTagRange("test.analytics", { shardKey: MinKey }, { shardKey: MaxKey }, "inmem")
对于应该驻留在persisted分片上的每个分片集合,将标签persisted分配给整个块范围:
sh.addTagRange("salesdb.orders", { shardKey: MinKey }, { shardKey: MaxKey }, "persisted")
对于inmem分片,请创建数据库或移动数据库。