内存中存储引擎
在本页面
在版本 3.2.6 中更改。
从 MongoDB Enterprise 3.2.6 版开始,内存存储引擎是 64 位版本中通用可用性(GA)的一部分。除了某些元数据和诊断数据外,内存存储引擎不维护任何磁盘上数据,包括配置数据,索引,用户凭据等。
通过避免磁盘 I/O,内存中存储引擎使数据库操作的延迟更可预测。
指定内存中存储引擎
要选择内存存储引擎,请指定:
-
--storageEngine选项为
inMemory
,如果使用配置文件,则为storage.engine设置。 -
--dbpath
或storage.dbPath(如果使用配置文件)。尽管内存存储引擎不会将数据写入文件系统,但它会在--dbpath
中维护小型元数据文件和诊断数据以及用于构建大型索引的临时文件。
例如,从命令行:
mongod --storageEngine inMemory --dbpath <path>
或者,如果使用YAML 配置文件格式:
storage:
engine: inMemory
dbPath: <path>
有关此存储引擎的特定配置选项,请参见inMemory Options。除与数据持久性相关的那些选项(例如日志记录或静态配置加密)外,大多数mongod配置选项可用于内存存储引擎。
Warning
进程关闭后,内存中存储引擎不会保留数据。
Concurrency
内存存储引擎使用文档级并发控制进行写操作。结果,多个 Client 端可以同时修改集合的不同文档。
Memory Use
内存存储引擎要求其所有数据(包括索引,oplog(如果mongod实例是副本集的一部分,则为 oplog 等))必须适合YAML 配置文件中指定的--inMemorySizeGB命令行选项或storage.inMemory.engineConfig.inMemorySizeGB设置。
默认情况下,内存存储引擎使用 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
内存中存储引擎是非持久性的,不会将数据写入持久性存储。非持久数据包括应用程序数据和系统数据,例如用户,权限,索引,副本集配置,分片群集配置等。
因此,journal或 await 数据变为durable的概念不适用于内存中的存储引擎。
如果副本集的任何有投票权的成员都没有journaling运行(即运行内存存储引擎或禁用日记功能运行),则必须将writeConcernMajorityJournalDefault设置为false
。
Note
从版本 3.6.14 开始,如果副本集成员使用内存存储引擎(投票或不投票),但是副本集的writeConcernMajorityJournalDefault设置为 true,则副本集成员将记录启动警告。
在writeConcernMajorityJournalDefault设置为false
的情况下,MongoDB 在确认写入之前不会 awaitw: "majority"写入磁盘日志上。这样,如果给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动),则majority
写操作可能会回滚。
指定写关注点journaled的写操作将立即得到确认。当由于shutdown命令或由于系统错误而关闭mongod实例时,无法恢复内存中的数据。
Deployment Architectures
除了独立运行外,使用内存存储引擎的mongod实例还可以作为副本集或分片群集的一部分运行。
Replica Set
您可以部署使用内存存储引擎作为副本集一部分的mongod个实例。例如,作为三成员副本集的一部分,您可能需要:
-
两个mongod实例通过内存存储引擎运行。
-
一个mongod实例与WiredTiger存储引擎一起运行。将 WiredTiger 成员配置为隐藏成员(即hidden: true和priority: 0)。
使用此部署模型,只有与内存存储引擎一起运行的mongod实例可以成为主要实例。Client 端仅连接到内存存储引擎mongod实例。即使运行内存存储引擎的mongod实例都崩溃并重新启动,它们也可以从运行 WiredTiger 的成员进行同步。与 WiredTiger 一起运行的隐藏mongod实例会将数据持久保存到磁盘,包括用户数据,索引和复制配置信息。
Note
内存存储引擎要求其所有数据(如果mongod是副本集的一部分,则包括 oplog 等)都应适合指定的--inMemorySizeGB命令行选项或storage.inMemory.engineConfig.inMemorySizeGB设置。参见Memory Use。
Sharded Cluster
您可以将使用内存存储引擎的mongod个实例部署为分片群集的一部分。例如,在分片群集中,您可以拥有一个由以下副本集组成的分片:
-
两个mongod实例通过内存存储引擎运行
-
一个mongod实例与WiredTiger存储引擎一起运行。将 WiredTiger 成员配置为隐藏成员(即hidden: true和priority: 0)。
在此分片上,添加tag inmem
。例如,如果此分片的名称为shardC
,则连接到mongos并运行sh.addShardTag()。
For example,
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")