Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

用于自管理部署的内存存储引擎

在此页面上

  • 指定内存存储引擎
  • 事务(读写)并发
  • 文档级并发性
  • 内存使用
  • 持久性(Durability)
  • 事务
  • 部署架构

内存存储引擎是 64 位版本中正式发布 (GA) 的一部分。除了某些元数据和诊断数据外,内存中存储引擎不维护任何磁盘数据,包括配置数据、索引、用户凭证等。

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

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

  • inMemory 对于 --storageEngine 选项,或如果使用配置文件,则为 storage.engine

  • --dbpathstorage.dbPath(如果使用配置文件)。内存存储引擎虽然不会向文件系统写入数据,但会在 --dbpath 小元数据文件和诊断数据以及用于构建大索引的临时文件中维护它。

例如,从命令行:

mongod --storageEngine inMemory --dbpath <path>

或者,如果使用YAML 配置文件格式:

storage:
engine: inMemory
dbPath: <path>

有关特定于此存储引擎的配置选项,请参见 inMemory 选项。大多数 mongod 配置选项都可用于内存存储引擎,但与数据持久性相关的选项(例如日志记录或静态加密配置)除外。

警告

内存中存储引擎在进程关闭后不保留数据。

从版本7.0开始, MongoDB使用默认算法来动态调整并发存储引擎事务(读取和写入票证)的最大数量。 动态并发存储引擎ACID 事务算法可优化集群过载期间的数据库吞吐量。 并发存储引擎事务(读取和写入票证)的最大数量永远不会超过128读取票证和128写入票证,并且可能因集群中的节点而异。 单个节点内的读取票证和写入票证的最大数量始终相等。

要指定动态最大值不能超过的读写事务(读取和写入工单)的最大数量,请使用 storageEngineConcurrentReadTransactionsstorageEngineConcurrentWriteTransactions

如果您想要禁用动态并发存储引擎的事务算法,请提交支持请求,与 MongoDB 技术服务工程师合作。

内存存储引擎使用文档级 并发控制进行写入操作。因此,多个客户端可同时修改某一集合的不同文档。

内存存储引擎要求其所有数据(包括索引、oplog 等 [如果 mongod 实例是副本集的一部分等])必须符合指定的 --inMemorySizeGB 命令行选项或 YAML 配置文件中的 storage.inMemory.engineConfig.inMemorySizeGB 设置。

默认情况下,内存存储引擎使用物理 RAM 大小减去 1 GB 后的 50%。

如果写操作会导致数据超出指定内存大小,MongoDB 将返回错误:

"WT_CACHE_FULL: operation would overflow cache"

要指定新的大小,请使用 storage.inMemory.engineConfig.inMemorySizeGB 设置,而其格式为 YAML 配置文件格式

storage:
engine: inMemory
dbPath: <path>
inMemory:
engineConfig:
inMemorySizeGB: <newSize>

或者使用命令行选项 --inMemorySizeGB

mongod --storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>

内存存储引擎具有非持久性,不会将数据写入永久存储空间。非持久化数据包括应用程序数据和系统数据,例如用户、权限、索引、副本集配置、分片集群配置等。

因此,日志或等待数据持久化的概念不适用于内存存储引擎。

如果副本集的任何有投票权成员使用内存存储引擎,则必须将 writeConcernMajorityJournalDefault 设置为 false

注意

从版本 4.2(以及 4.0.13 和 3.6.14)开始,如果某个副本集成员使用内存存储引擎(有投票权或无投票权),但副本集已将 writeConcernMajorityJournalDefault 设置为 true,则该副本集成员会记录一个启动警告。

writeConcernMajorityJournalDefault 设置为 false 时,MongoDB 不会等待 w: "majority" 写入在写入到磁盘日志后才确认写入。例如,"majority" 写操作可能会在给定副本集中的大部分节点发生临时断连(例如崩溃和重启)的情况下回滚。

指定写关注 journaled 的写入操作会立即得到确认。当 mongod 实例因 shutdown 命令或系统错误而关闭时,将无法恢复内存数据。

在以下情况下,副本集和分片集群会支持事务:

  • 主节点使用 WiredTiger 存储引擎,并且

  • 从节点成员使用 WiredTiger 存储引擎或内存存储引擎。

注意

如果分片集群中分片的 writeConcernMajorityJournalDefault 设置为 false(例如具有使用内存中存储引擎的投票成员分片),则无法在该分片集群上运行事务。

除独立运行外,使用内存存储引擎的 mongod 实例还可以作为副本集的一部分或分片集群的一部分运行。

您可以部署使用内存存储引擎的 mongod 实例作为副本集的一部分。例如,作为三成员副本集的一部分,您可以:

使用这种部署模型,只有使用内存存储引擎运行的 mongod 实例才能成为主节点。客户端仅连接到内存存储引擎 mongod 实例。即使运行内存存储引擎的两个 mongod 实例崩溃并重新启动,它们也可以从运行 WiredTiger 的节点进行同步。使用 WiredTiger 运行的隐藏 mongod 实例将数据保存到磁盘,包括用户数据、索引和复制配置信息。

注意

内存存储引擎要求其所有数据(包括 oplog 等,如果 mongod 是副本集的一部分)符合指定的 --inMemorySizeGB 命令行选项或 storage.inMemory.engineConfig.inMemorySizeGB 设置。请参阅内存使用情况

您可以将使用内存存储引擎的 mongod 实例部署为分片集群的一部分。内存存储引擎避免了磁盘 I/O,从而实现更可预测的数据库操作延迟。在分片集群中,一个分片可以由单个 mongod 实例或副本集组成。例如,您可以有一个由以下副本集组成的分片:

在此分片中,添加 tag inmem。例如,如果该分片的名称是 shardC,则连接到 mongos,并运行 sh.addShardTag()

例如,

sh.addShardTag("shardC", "inmem")

对于其他分片,添加一个单独的标记 persisted

sh.addShardTag("shardA", "persisted")
sh.addShardTag("shardB", "persisted")

对于应该位于 inmem 分片上的每个分片集合,对标记 inmem 进行 assign to the entire chunk range

sh.addTagRange("test.analytics", { shardKey: MinKey }, { shardKey: MaxKey }, "inmem")

对于应位于 persisted 分片中的每个分片集合,assign to the entire chunk range 标记 persisted

sh.addTagRange("salesdb.orders", { shardKey: MinKey }, { shardKey: MaxKey }, "persisted")

对于 inmem 分片,创建一个数据库或移动该数据库。

注意

内存存储引擎不正式支持读关注级别 "snapshot"

后退

将自管理分片集群更改为 WiredTiger