本番環境での考慮事項(シャーディングされたクラスター)
シャーディングされたクラスターでマルチドキュメントトランザクションを実行できます。
以下のページでは、シャーディングされたクラスターでトランザクションを実行する際に固有の懸念事項を示します。 これらの懸念事項は、 本番環境での考慮事項にリストされている考慮事項に追加されます。
パフォーマンス
シングル シャード
単一のシャードを対象とするトランザクションは、レプリカセットのトランザクションと同じパフォーマンスを持つ必要があります。
複数のシャード
複数のシャードに影響するトランザクションの場合、パフォーマンス コストが高くなります。
注意
シャーディングされたクラスターでは、関係するシャードにアービタが含まれていると、複数のシャードにまたがるトランザクションはエラーとなり中止します。
時間制限
時間制限を指定するには、 commitTransaction
に maxTimeMS
の制限を指定します。
maxTimeMS
が指定されていない場合、MongoDB はtransactionLifetimeLimitSeconds
を使用します。
maxTimeMS
が指定されているがtransactionLifetimeLimitSeconds
を超えるトランザクションが発生する場合、MongoDB はtransactionLifetimeLimitSeconds
を使用します。
シャーディングされたクラスターのtransactionLifetimeLimitSeconds
を変更するには、すべてのシャード レプリカセットのノード パラメーターを変更する必要があります。
読み取り保証(read concern)
マルチドキュメントトランザクションは、 "local"
、 "majority"
、 "snapshot"
の読み取り保証レベルをサポートしています。
シャーディングされたクラスター上のトランザクションの場合、 "snapshot"
読み取り保証のみが複数のシャード間で一貫したスナップショットを提供します。
読み取り保証とトランザクションの詳細については、「トランザクションと読み取り保証 」を参照してください。
書込み保証 (write concern)
シャーディングされたクラスターのうち writeConcernMajorityJournalDefault
が false
に設定されているもの(インメモリ ストレージエンジンを使用する投票ノードのあるシャードなど)ではトランザクションを実行できません。
注意
トランザクションに指定された書込み保証(write concern) にかかわらず、シャーディングされたトランザクションのコミット操作の一部には、 {w:
"majority", j: true}
書込み保証を使用する部分が含まれます。
アービタ
レプリカセットにアービタがある場合、トランザクションを使用してシャードキーを変更することはできません。 アービタは、 マルチシャード トランザクションに必要なデータ操作に参加することはできません。
書込み操作が複数のシャードにまたがるトランザクションで、アービタを含むシャードを対象に読み取りまたは書込み操作が実行される場合、そのトランザクションはエラーとなり中止します。
バックアップと復元
警告
mongodump
とmongorestore
をシャーディングされたクラスターのバックアップ戦略として使用するには、「データベース ダンプを使用した自己管理型シャーディングされたクラスターのバックアップ 」を参照してください。
シャーディングされたクラスターではバックアップと復元に次のいずれかの連携的なプロセスも利用できます。これによりシャード間のトランザクションはアトミック性が継続的に保証されます。
チャンクの移行
チャンクの移行では、特定の段階で排他的なコレクション ロックが取得されます。
進行中のトランザクションでコレクションがロックされ、そのコレクションを含むチャンクの移行が開始された場合、これらの移行段階では、トランザクションがコレクションのロックを解放するまで待つ必要があるため、チャンクの移行のパフォーマンスに影響します。
チャンクの移行がトランザクションとインターリーブする場合(たとえば、チャンクの移行がすでに進行中のときにトランザクションが開始され、トランザクションがコレクションをロックする前に移行が完了した場合)、トランザクションはコミット中にエラーになり、中止されます。
2 つの操作がどのようにインターリーブされるかによって、次のようなエラーが出ます(エラーメッセージは省略されています)。
an error from cluster data placement change ... migration commit in progress for <namespace>
Cannot find shardId the chunk belonged to at cluster time ...
コミット中の外部読み取り
トランザクションのコミット中に、外部の読み取り操作が、トランザクションによって変更される同じドキュメントを読み込もうとする場合があります。トランザクションが複数のシャードに書き込まれる場合、シャード間でのコミット試行中に次のことが起きます。
読み取り保証 (read concern)
"snapshot"
または"linearizable"
を使用する外部読み取りは、トランザクションのすべての書込み (write) が表示可能になるまで待機します。因果的にコンシステントなセッション (afterClusterTime を含むもの)の一部である外部読み取りは、トランザクションのすべての書込みが表示可能になるまで待機します。
他の読み取り方法を使用した外部読み取りは、トランザクションのすべての書込みが表示されるまで待たずに、トランザクション前のバージョンのドキュメントを読み取ります。