文档菜单
文档首页
/
MongoDB 手册
/ / /

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

本页内容

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

内存存储引擎是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个写入票据,并且可能在集群的各个节点上有所不同。单个节点内的读取票据和写入票据的最大数量始终相等。

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

如果您想禁用动态并发存储引擎事务算法,请提交支持请求与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 存储引擎或 内存 存储引擎。

注意

您无法在设置有 writeConcernMajorityJournalDefaultfalse 的分片上运行事务,例如,使用 内存存储引擎 的投票成员的分片。

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

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

  • 两个使用内存存储引擎运行的 mongod 实例。

  • 一个使用WiredTiger存储引擎运行的 mongod 实例。将WiredTiger成员配置为隐藏成员(即 hidden: truepriority: 0)。

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

注意

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

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

  • 运行内存存储引擎的两个 mongod 实例

  • 一个使用WiredTiger存储引擎运行的 mongod 实例。将WiredTiger成员配置为隐藏成员(即 hidden: truepriority: 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" 不支持与内存存储引擎。

返回

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