fsync
定義
fsync
ストレージ層からディスクへのすべての保留中の書込みをフラッシュします。
lock
フィールドがtrue
に設定されている場合、サーバーまたはクラスターにロックが設定され、ロックが解放されるまで追加の書込みが行われません。MongoDB 6.0.11以降 ( 5.0.22以降でも利用可能 )
fsync
とfsyncUnlock
コマンドはmongos
で実行され、シャーディングされたクラスターのロックとロックを解除します。アプリケーションがデータを書き込むと、MongoDB ではデータがストレージ層に記録され、その後ディスクにデータが書込まれます。
ディスクへの書き込みをフラッシュする場合は、
fsync
を実行します。永続的なデータを提供するために、 WiredTigerはチェックポイントを使用します。 詳細については、「ジャーナリングと WiredTiger ストレージ エンジン 」を参照してください。
重要
サーバーは fsync ロック カウントを維持します。
lock
フィールドをtrue
に設定するfsync
コマンドは、ロック数を増加させ、fsyncUnlock
コマンドは、それを減算します。 ロックされたサーバーまたはクラスターで書込みを有効にするには、ロック数が 0 になるまでfsyncUnlock
コマンドを呼び出します。バックアップ操作を実行したい場合は、このコマンドを使用して書込みをブロックします。
Tip
mongosh
では、このコマンドはdb.fsyncLock()
ヘルパー メソッドを通じて実行することもできます。ヘルパー メソッドは
mongosh
ユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.adminCommand( { fsync: 1, lock: <Boolean>, fsyncLockAcquisitionTimeout: <integer>, comment: <any> } )
コマンドフィールド
コマンドには次のフィールドがあります:
フィールド | タイプ | 説明 |
---|---|---|
| integer | |
| integer | 任意。 ロックを取得するまでの待機時間をミリ秒単位で指定します。 ロック取得操作がタイムアウトした場合、 コマンドは失敗した応答を返します。 デフォルト: バージョン 6.0.11 の新機能。 |
| ブール値 | 任意。 サーバーまたはクラスターのロックを取得し、すべての書き込み操作をブロックします。 |
| any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。
コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。 |
Considerations
fsync
コマンドとlock
オプションを指定すると、 cp
、 scp
、 tar
などの低レベルのバックアップ ユーティリティを使用してデータファイルを安全にコピーできます。 コピーされた ファイルを使用して開始されたmongod
には、ロックされたmongod
のユーザーが記述したデータと区別できないユーザーが記述したデータが含まれています。
ロックされたmongod
のデータファイルは、ジャーナリング同期やWiredTiger スナップショットなどの操作によって変更される可能性があります。 これは論理データ(例: クライアントがアクセスするデータ)では、一部のバックアップ ユーティリティがこれらの変更を検出して警告を発したり、エラーで失敗したりすることがあります。 MongoDB が推奨するバックアップ ユーティリティと手順の詳細については、「自己管理型配置のバックアップ メソッド 」を参照してください。
大規模な配置への影響
バージョン 6.0.11 の新機能。
fsync
コマンドがmongos
で実行されると、クラスター全体に対して fsync 操作が実行されます。 lock
フィールドをtrue
に設定すると、クラスターにロックが設定され、追加の書込みが防止されます。
シャーディングされたクラスターをロックする前に、使用可能な自己管理型バックアップを作成するには、以下の手順を行います。
チャンク移行、リシャーディング、または DDL 操作がアクティブになっていないことを確認します。
追加のチャンク移行が開始されないようにするには、バランサーを停止します。
ジャーナリングの代替手段
mongod
でジャーナリングが有効になっている場合は、ファイルシステムまたはボリュームやブロックレベルでのスナップショットツールを使用して、データセットとジャーナルを単一のユニットとしてバックアップを作成します。
ロック カウント
fsync
コマンドは、 lockCount
フィールドを含むドキュメントを返します。 mongod
で実行された場合、カウントはサーバーに設定されている fsync ロックの数を示します。
シャーディングされたクラスターで実行すると、 mongos
は fsync 操作を各シャードに送信し、それぞれのlockCount
を含む結果を返します。
注意
lockCount
フィールドが 0 より大きい場合、サーバーとクラスターですべての書込みがブロックされます。 ロック数を減らすには、 fsyncUnlock
コマンドを使用します。
失敗後の Fsync ロック
Fsync ロックは、レプリカセットまたはシャーディングされたクラスター内のプライマリで実行されます。
ネットワークの問題によりプライマリがダウンしたり、アクセスできなくなった場合、クラスターは使用可能なセカンダリから新しいプライマリを選択します。 fsync ロックを持つプライマリがダウンした場合、新しいプライマリは fsync ロックを保持せず、書込み操作を処理できます。 バックアップ操作中に選挙が行われると、結果のバックアップが一貫性を失うか、使用できない可能性があります。
プライマリがダウンした状態から回復するには、次の手順に従います。
ロック数が 0 になるまで
fsyncUnlock
コマンドを実行し、すべてのノードのロックを解放します。fsync
コマンドを発行して、クラスター上の fsync ロックを再確立します。バックアップを再起動します。
さらに、 fsync ロックは永続的です。 古いプライマリが再度オンラインになったら、ノードのロックを解放するためにfsyncUnlock
コマンドを使用する必要があります。
例
Fsync ロック
注意
fsync
コマンドとlock
オプションを指定すると、 cp
、 scp
、 tar
などの低レベルのバックアップ ユーティリティを使用してデータファイルを安全にコピーできます。 コピーされた ファイルを使用して開始されたmongod
には、ロックされたmongod
のユーザーが記述したデータと区別できないユーザーが記述したデータが含まれています。
ロックされたmongod
のデータファイルは、ジャーナリング同期やWiredTiger スナップショットなどの操作によって変更される可能性があります。 これは論理データ(例: クライアントがアクセスするデータ)では、一部のバックアップ ユーティリティがこれらの変更を検出して警告を発したり、エラーで失敗したりすることがあります。 MongoDB が推奨するバックアップ ユーティリティと手順の詳細については、「自己管理型配置のバックアップ メソッド 」を参照してください。
コマンドは、fsync
を介して個々のmongod
mongos
インスタンスまたはシャーディングされたクラスターをロックできます。lock
フィールドをtrue
に設定して実行すると、 fsync 操作はすべてのデータをストレージ層にフラッシュし、 インスタンスまたはクラスターのロックが解除されるまで、追加の書込み (write) 操作はすべてブロックされます。
データベースをロックするには、 fsync
コマンドを使用してlock
フィールドをtrue
に設定します。
db.adminCommand( { fsync: 1, lock: true } )
この操作では、操作のステータスとlockCount
を含むドキュメントが返されます。
{ "info" : "now locked against writes, use db.fsyncUnlock() to unlock", "lockCount" : NumberLong(1), "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand", "ok" : 1 }
ロックされると、書込み (write) 操作はブロックされます。 個別の接続では、書込み操作の最初の試行まで読み取り操作が続行される場合があり、サーバーまたはクラスターのロックが解除されるまで待機します。
重要
fsync ロック操作はロック数を維持します。
サーバーまたはクラスターの書き込みロックを解除するには、ロック カウントは 0 である必要があります。 つまり、fsync ロックを実行する特定の回数に応じて、書込み (write) に対してサーバーまたはクラスターのロックを解除するには、対応する数のロック操作を発行する必要があります。
fsyncUnlock
クラスターのサーバーのロックを解除するには、 fsyncUnlock
コマンドを使用します。
db.adminCommand( { fsyncUnlock: 1 } )
このコマンドを必要な回数繰り返し、ロック数を 0 に減らします。 ロック数が 0 に達すると、サーバーまたはクラスターは書込みを再開できます。
ロック ステータスの確認
fsync ロックの状態を確認するには、 db.currentOp()
を使用します。 サーバーまたはクラスターが現在ロックされているかどうかをテストするには、shell で次の JavaScript 関数を使用します。
serverIsLocked = function () { var co = db.currentOp(); if (co && co.fsyncLock) { return true; } return false; }
この関数をmongosh
セッションにロードしたら、次の構文で呼び出します。
serverIsLocked()
この関数は、サーバーまたはクラスターが現在ロックされている場合はtrue
を返し、サーバーまたはクラスターがロックされていない場合はfalse
を返します。