- 存储 >
- Storage Engines >
- 内存存储引擎
内存存储引擎¶
在 3.2.6 版更改.
从MongoDB企业版3.2.6开始,内存存储引擎在64位的版本中正式发布。与其它元数据和诊断数据不同内存存储引擎不维护任何磁盘中的数据,包括配置数据,索引,用户认证信息等。
通过避免磁盘I/O,内存存储引擎提供了数据库操作更大的可预测延迟。
指定内存存储引擎¶
为了选择内存存储引擎,指定:
- inMemory for the --storageEngine option, or the storage.engine setting if using a configuration file.
- --dbpath, or storage.dbPath if using a configuration file. Although the in-memory storage engine does not write data to the filesystem, it maintains in the --dbpath small metadata files and diagnostic data as well temporary files for building large indexes.
例如,从命令行:
mongod --storageEngine inMemory --dbpath <path>
或者,如果使用 YAML configuration file format:
storage:
engine: inMemory
dbPath: <path>
查阅 inMemory Options 了解该存储引擎特定的配置选项。大部分 mongod 配置选项都可用于内存存储引擎,除了那些鱼与数据持久化相关的选项,例如日志或者闲时加密的配置。
警告
在进程结束之后,内存存储引擎并不会持久化数据。
并发性¶
内存存储引擎对写操作使用 document-level 并发控制。因此,多个客户端可以同时修改同一个集合的不同文档。
内存使用¶
内存存储引擎要求所有数据(如果 mongod 实例是复制集的一个部分,包括索引,日志等)必须能够容纳于 --inMemorySizeGB 命令行选项 或者 YAML configuration file 中 storage.inMemory.engineConfig.inMemorySizeGB 配置中指定的大小中。
默认地,内存存储引擎使用物理内存的50%减去1GB的内存。
如果一个写操作将会造成数据超出特定的内存大小,MongoDB返回以下错误:
"WT_CACHE_FULL: operation would overflow cache"
在 YAML configuration file format </reference/configuration-options>`中设置:setting:`storage.inMemory.engineConfig.inMemorySizeGB 来指定一个新的大小。
storage:
engine: inMemory
dbPath: <path>
inMemory:
engineConfig:
inMemorySizeGB: <newSize>
或者使用命令行选项 --inMemorySizeGB:
mongod --storageEngine inMemory --dbpath <path> --inMemorySizeGB <newSize>
持久性¶
内存存储引擎是非持久化的,因此不会将数据写到一个持久化的存储中。也就是说,非持久化的数据包括应用数据以及系统数据,例如用户、权限、索引、复制集配置、分片集群配置等。
因此, journal 的概念或者是等待数据变成 durable 并不适用于内存存储引擎。
If any voting member of a replica set runs without journaling (i.e. either runs an in-memory storage engine or runs with journaling disabled), you must set writeConcernMajorityJournalDefault to false.
With writeConcernMajorityJournalDefault set to false, MongoDB will not wait for w: "majority" writes to be durable before acknowledging the writes. As such, "majority" write operations could possibly roll back in the event of a loss of a replica set member.
指定写关注 journaled 的写入操作将会被立即响应。当一个 mongod 示例停止时,不管是 shutdown 命令或者是系统错误造成的结果,内存数据的恢复都是不可能的。
部署架构¶
除了单机运行,使用内存存储引擎的 mongod 实例可以作为一个复制集或者分片集群的一个部分运行。
复制集¶
您可以将使用内存存储引擎的 mongod 实例作为复制集的一个部分进行部署。例如,作为一个三成员复制集的一个部分,您可以有:
两个运行着内存存储引擎的 mongod 实例。
一个运行着 WiredTiger 存储引擎的 mongod 实例。将WiredTiger成员作为一个隐藏的成员(例如 hidden: true and priority: 0 >)。
通过使用这种部署模型,只有运行着内存存储引擎的 mongod 实例可能变成主节点。客户端只会连接到内存存储引擎的 mongod 实例。即使两台运行着内存存储引擎的 mongod 实例同时崩溃重启,它们也可以从运行着WiredTiger的成员中进行同步。运行着WiredTiger的隐藏 mongod 实例将数据持久化到磁盘,包括用户数据、索引以及复制集配置。
注解
内存存储引擎要求所有数据(如果 mongod 实例是复制集的一个部分,包括索引,日志等)必须能够容纳于 --inMemorySizeGB 命令行选项 或者 YAML configuration file 中 storage.inMemory.engineConfig.inMemorySizeGB 配置中指定的大小中。
分片集群¶
您可以将使用内存存储引擎的 mongod 实例部署为分片集群的一个部分。例如,在分片集群中,你可以配置一个分片,由一下复制集组成:
两个运行着内存存储引擎的 mongod 实例
一个运行着 WiredTiger 存储引擎的 mongod 实例。将WiredTiger成员作为一个隐藏的成员(例如 hidden: true and priority: 0 >)。
向该分片中添加 tag inmem 。例如,如果该分片的名字为 shardC ,连接到 mongos ,然后运行 sh.addShardTag() 。
例如,
sh.addShardTag("shardC", "inmem")
对于其他分片,增加一个单独的标签 persisted 。
sh.addShardTag("shardA", "persisted")
sh.addShardTag("shardB", "persisted")
对应该位于 inmem 分片的每个分片集合, assign to the entire chunk range 标签 inmem :
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")
For the inmem shard, create a database or move the database.