自己管理型配置のためのインメモリ ストレージ エンジン
インメモリ ストレージエンジンは、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 は、デフォルトのアルゴリズムを使用して、ストレージエンジンの同時トランザクション(読み取りチケットと書き込みチケット)の最大数を動的に調整します。 ストレージエンジンの同時トランザクションの動的なアルゴリズムは、クラスターの過負荷時にデータベースのスループットを最適化します。 ストレージエンジンの同時実行トランザクション(読み取りチケットと書き込みチケット)の最大数は128読み取りチケットと128書き込みチケットを超えることはなく、クラスター内のノードによって異なる場合があります。 1 つのノード内の読み取りチケットと書き込みチケットの最大数は常に同じです。
動的な最大値が超えることのできない読み取りおよび書込みトランザクション(読み取りおよび書込みチケット)の最大数を指定するには、 storageEngineConcurrentReadTransactions
とstorageEngineConcurrentWriteTransactions
使用します。
ストレージエンジンの同時トランザクションの動的なアルゴリズムを無効にする場合は、MongoDB テクニカル サービス エンジニアと連携するためのサポートリクエストをお申し込みください。
ドキュメント レベルの同時実行
インメモリ ストレージ エンジンは、書込み (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
に設定されている場合、レプリカセット ノードで起動警告がログに記録されます。
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"
は、インメモリ ストレージ エンジンでは正式にサポートされていません。