自管理部署的内存存储引擎
内存存储引擎是64位构建中一般可用性(GA)的一部分。除了某些元数据和诊断数据外,内存存储引擎不维护任何磁盘上的数据,包括配置数据、索引、用户凭证等。
通过避免磁盘I/O,内存存储引擎允许数据库操作具有更可预测的延迟。
指定内存存储引擎
要选择内存存储引擎,请指定
inMemory
参数,用于--storageEngine
选项,或者在使用配置文件时使用storage.engine
设置。--dbpath
,或者在使用配置文件时使用storage.dbPath
。尽管内存存储引擎不将数据写入文件系统,但它仍然在--dbpath
中维护小的元数据文件和诊断数据,以及构建大型索引时的临时文件。
例如,从命令行
mongod --storageEngine inMemory --dbpath <path>
或者,如果使用 YAML 配置文件格式:
storage: engine: inMemory dbPath: <path>
有关此存储引擎的特定配置选项,请参阅 内存选项。除了与数据持久性相关的选项(如日志记录或静态加密配置)之外,大多数 mongod
配置选项都可以与内存存储引擎一起使用。
警告
内存存储引擎在进程关闭后不会持久化数据。
事务(读取和写入)并发
从7.0版本开始,MongoDB使用默认算法动态调整最大并发存储引擎事务(读取和写入票据)的数量。动态并发存储引擎事务算法优化集群过载时的数据库吞吐量。最大并发存储引擎事务(读取和写入票据)的数量不会超过128个读取票据和128个写入票据,并且可能在集群的各个节点上有所不同。单个节点内的读取票据和写入票据的最大数量始终相等。
要指定动态最大值不能超过的最大读取和写入事务(读取和写入票据)的数量,请使用storageEngineConcurrentReadTransactions
和storageEngineConcurrentWriteTransactions
。
如果您想禁用动态并发存储引擎事务算法,请提交支持请求与MongoDB技术服务工程师合作。
文档级别并发
内存存储引擎使用文档级别并发控制进行写操作。因此,多个客户端可以同时修改集合中不同的文档。
内存使用
内存存储引擎要求所有数据(包括索引、oplog(如果mongod
实例是复制集的一部分等)必须适合指定的--inMemorySizeGB
命令行选项或storage.inMemory.engineConfig.inMemorySizeGB设置在YAML配置文件中。
默认情况下,内存存储引擎使用物理RAM的50%减去1GB。
如果写操作会导致数据超出指定的内存大小,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
实例。一个使用WiredTiger存储引擎运行的
mongod
实例。将WiredTiger成员配置为隐藏成员(即hidden: true
和priority: 0
)。
在这种部署模式下,只有运行内存存储引擎的 mongod
实例可以成为主实例。客户端仅连接到运行内存存储引擎的 mongod
实例。即使运行内存存储引擎的两个 mongod
实例崩溃并重新启动,它们也可以从运行WiredTiger的成员同步。使用WiredTiger运行的隐藏 mongod
实例将数据持久化到磁盘,包括用户数据、索引和复制配置信息。
注意
内存存储引擎要求所有其数据(包括如果 mongod
是复制集的一部分等)都符合指定的 --inMemorySizeGB
命令行选项或 storage.inMemory.engineConfig.inMemorySizeGB
设置。请参阅 内存使用。
分片集群
您可以将使用内存存储引擎的 mongod
实例作为 分片集群 的一部分进行部署。内存存储引擎避免了磁盘I/O,从而允许更可预测的数据库操作延迟。在分片集群中,一个 分片 可以由单个 mongod
实例或一个 复制集 组成。例如,您可以有如下组成的复制集
运行内存存储引擎的两个
mongod
实例一个使用WiredTiger存储引擎运行的
mongod
实例。将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
分配给整个数据块范围
。
sh.addTagRange("test.analytics", { shardKey: MinKey }, { shardKey: MaxKey }, "inmem")
对于应该位于 persisted
分片上的每个分片集合,将标签 persisted
分配给整个数据块范围
。
sh.addTagRange("salesdb.orders", { shardKey: MinKey }, { shardKey: MaxKey }, "persisted")
对于 inmem
分片,创建数据库或移动数据库。
注意
读取关注级别 "snapshot"
不支持与内存存储引擎。