用于自管理部署的内存存储引擎
内存存储引擎是 64 位版本中正式发布 (GA) 的一部分。除了某些元数据和诊断数据外,内存中存储引擎不维护任何磁盘数据,包括配置数据、索引、用户凭证等。
通过避免磁盘 I/O,内存存储引擎支持更可预测的数据库操作延迟。
指定内存存储引擎
要选择内存存储引擎,请指定:
inMemory
对于--storageEngine
选项,或如果使用配置文件,则为storage.engine
。--dbpath
或storage.dbPath
(如果使用配置文件)。内存存储引擎虽然不会向文件系统写入数据,但会在--dbpath
小元数据文件和诊断数据以及用于构建大索引的临时文件中维护它。
例如,从命令行:
mongod --storageEngine inMemory --dbpath <path>
或者,如果使用YAML 配置文件格式:
storage: engine: inMemory dbPath: <path>
有关特定于此存储引擎的配置选项,请参见 inMemory 选项。大多数 mongod
配置选项都可用于内存存储引擎,但与数据持久性相关的选项(例如日志记录或静态加密配置)除外。
警告
内存中存储引擎在进程关闭后不保留数据。
事务(读写)并发
从版本7.0开始, MongoDB使用默认算法来动态调整并发存储引擎事务(读取和写入票证)的最大数量。 动态并发存储引擎ACID 事务算法可优化集群过载期间的数据库吞吐量。 并发存储引擎事务(读取和写入票证)的最大数量永远不会超过128读取票证和128写入票证,并且可能因集群中的节点而异。 单个节点内的读取票证和写入票证的最大数量始终相等。
要指定动态最大值不能超过的读写事务(读取和写入工单)的最大数量,请使用 storageEngineConcurrentReadTransactions
和 storageEngineConcurrentWriteTransactions
。
如果您想要禁用动态并发存储引擎的事务算法,请提交支持请求,与 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>
持久性(Durability)
内存存储引擎具有非持久性,不会将数据写入永久存储空间。非持久化数据包括应用程序数据和系统数据,例如用户、权限、索引、副本集配置、分片集群配置等。
如果副本集的任何有投票权成员使用内存存储引擎,则必须将 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
实例还可以作为副本集的一部分或分片集群的一部分运行。
副本集(Replica Set)
您可以部署使用内存存储引擎的 mongod
实例作为副本集的一部分。例如,作为三成员副本集的一部分,您可以:
两个
mongod
实例使用内存存储引擎运行。一个
mongod
实例使用 WiredTiger 存储引擎运行。将 WiredTiger 节点配置为隐藏节点(即hidden: true
和priority: 0
)。
使用这种部署模型,只有使用内存存储引擎运行的 mongod
实例才能成为主节点。客户端仅连接到内存存储引擎 mongod
实例。即使运行内存存储引擎的两个 mongod
实例崩溃并重新启动,它们也可以从运行 WiredTiger 的节点进行同步。使用 WiredTiger 运行的隐藏 mongod
实例将数据保存到磁盘,包括用户数据、索引和复制配置信息。
注意
内存存储引擎要求其所有数据(包括 oplog 等,如果 mongod
是副本集的一部分)符合指定的 --inMemorySizeGB
命令行选项或 storage.inMemory.engineConfig.inMemorySizeGB
设置。请参阅内存使用情况。
分片集群
您可以将使用内存存储引擎的 mongod
实例部署为分片集群的一部分。内存存储引擎避免了磁盘 I/O,从而实现更可预测的数据库操作延迟。在分片集群中,一个分片可以由单个 mongod
实例或副本集组成。例如,您可以有一个由以下副本集组成的分片:
两个
mongod
实例使用内存中存储引擎来运行一个
mongod
实例使用 WiredTiger 存储引擎运行。将 WiredTiger 节点配置为隐藏节点(即hidden: true
和priority: 0
)。
在此分片中,添加 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"
。