内存中存储引擎

在本页面

在版本 3.2.6 中更改。

从 MongoDB Enterprise 3.2.6 版开始,内存存储引擎是 64 位版本中通用可用性(GA)的一部分。除了某些元数据和诊断数据外,内存存储引擎不维护任何磁盘上数据,包括配置数据,索引,用户凭据等。

通过避免磁盘 I/O,内存中存储引擎使数据库操作的延迟更可预测。

指定内存中存储引擎

要选择内存存储引擎,请指定:

例如,从命令行:

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实例可以成为主要实例。Client 端仅连接到内存存储引擎mongod实例。即使运行内存存储引擎的mongod实例都崩溃并重新启动,它们也可以从运行 WiredTiger 的成员进行同步。与 WiredTiger 一起运行的隐藏mongod实例会将数据持久保存到磁盘,包括用户数据,索引和复制配置信息。

Note

内存存储引擎要求其所有数据(如果mongod是副本集的一部分,则包括 oplog 等)都应适合指定的--inMemorySizeGB命令行选项或storage.inMemory.engineConfig.inMemorySizeGB设置。参见Memory Use

Sharded Cluster

您可以将使用内存存储引擎的mongod个实例部署为分片群集的一部分。例如,在分片群集中,您可以拥有一个由以下副本集组成的分片:

在此分片上,添加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")

对于inmem分片,请创建数据库或移动数据库。

首页