インメモリ ストレージエンジンは、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 構成オプションは、インメモリ ストレージ エンジンで使用できます。
警告
インメモリ ストレージ エンジンは、プロセスのシャットダウン後にデータを保持しません。
同時実行性
インメモリ ストレージ エンジンは、書込み (write) 操作にドキュメント レベルの同時実行制御を使用します。その結果、複数のクライアントがコレクションの異なるドキュメントを同時に修正することができます。
メモリの使用
インメモリ ストレージ エンジンでは、すべてのデータ(インデックス、mongod インスタンスがレプリカセットの一部である場合の oplog などを含む)が、指定された --inMemorySizeGB コマンドライン オプションまたは YAML 構成ファイルの storage.inMemory.engineConfig.inMemorySizeGB 設定に適合する必要があります。
デフォルトで、インメモリ ストレージエンジンは物理 RAM の 50% から 1 GB を引いた量を使用します。
書込み (write) 操作によってデータが指定されたメモリ サイズを超える場合、MongoDB は次のようにエラーを返します。
"WT_CACHE_FULL: operation would overflow cache"
新しいサイズを指定するには、YAML 構成ファイル形式の storage.inMemory.engineConfig.inMemorySizeGB 設定を使用します。
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" 特定のレプリカセット内の大多数のノードでの一時的な損失(例: クラッシュおよび再起動)が発生したイベントにロールバックされる可能性があります。
書込み保証 (write concern) journaled を指定する書込み操作は、ただちに承認されます。shutdown コマンドの結果として、またはシステム エラーが原因で、mongod インスタンスがシャットダウンした場合、メモリ内のデータを回復することはできません。
トランザクション
トランザクションは、次のレプリカセットとシャーディングされたクラスターでサポートされます。
WiredTiger ストレージ エンジンを使用するプライマリ
セカンダリ ノードでは、WiredTiger ストレージ エンジンまたはインメモリ ストレージ エンジンのいずれかが使用されます。
注意
writeConcernMajorityJournalDefaultがfalseに設定されているシャーディングされたクラスター(インメモリ ストレージ エンジンを使用する投票ノードのあるシャードなど)ではトランザクションを実行できません。
配置アーキテクチャ
インメモリ ストレージ エンジンを使用する mongod インスタンスは、スタンドアロンとして実行するだけでなく、レプリカセットの一部またはシャーディングされたクラスターの一部として実行することもできます。
レプリカセット
インメモリ ストレージ エンジンを使用する mongod インスタンスを、レプリカセットの一部として配置できます。たとえば、3 つのノードのレプリカセットの一部として、次のものを持つことができます。
インメモリ ストレージ エンジンで実行される 2 つの
mongodインスタンス。WiredTiger ストレージ エンジンで実行される 1 つの
mongodインスタンス。非表示ノードとして WiredTiger ノードを設定します(つまり、hidden: trueとpriority: 0)。
この配置モデルでは、インメモリ ストレージ エンジンで実行される mongod インスタンスのみがプライマリになることができます。クライアントは、インメモリ ストレージ エンジンの mongod インスタンスにのみ接続します。インメモリ ストレージ エンジンで実行している mongod インスタンスの両方がクラッシュして再起動しても、WiredTiger を実行しているノードから同期できます。WiredTiger で実行されている非表示の mongod インスタンスは、ユーザー データ、インデックス、レプリケーション構成情報などのデータをディスクに保存します。
注意
インメモリ ストレージ エンジンでは、すべてのデータ( mongodがレプリカセットの一部である場合などの oplog を含む)が、指定された--inMemorySizeGBコマンドライン オプションまたはstorage.inMemory.engineConfig.inMemorySizeGB設定に適合する必要があります。 「メモリの使用 」を参照してください。
シャーディングされたクラスター
インメモリ ストレージ エンジンを使用する mongod インスタンスを、シャーディングされたクラスターの一部として配置できます。インメモリ ストレージ エンジンは、データベース操作の待ち時間をより予測しやすくするためにディスク I/O を回避します。シャーディングされたクラスターでは、シャードは 1 つの mongod インスタンスまたはレプリカセットで構成できます。たとえば、以下のレプリカセットで構成されるシャードを 1 つ持つことができます。
インメモリ ストレージ エンジンで実行される 2 つの
mongodインスタンスWiredTiger ストレージ エンジンで実行される 1 つの
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 に assign to the entire chunk range を行います。
sh.addTagRange("test.analytics", { shardKey: MinKey }, { shardKey: MaxKey }, "inmem")
persisted シャードにまたがって存在すべきシャーディングされたコレクションごとに、タグ persisted に assign to the entire chunk range を行います。
sh.addTagRange("salesdb.orders", { shardKey: MinKey }, { shardKey: MaxKey }, "persisted")
inmem シャードの場合は、データベースを作成するか、データベースを移動します。
注意
読み取り保証 (read concern) レベル "snapshot" は、インメモリ ストレージ エンジンでは正式にサポートされていません。