多分。はい、データが書き込まれるのを待ちますが、ドキュメントによると、「書き込み操作が完全に永続的でない場合、ジャーナルコミットの間にウィンドウがあります」とあります。彼らが何を指しているのかわかりませんでした。
編集した回答をここに残しておきますが、自分自身を前後に逆にしたので、少しイライラします:
引くことができるレバーがたくさんあるので、これは少し注意が必要です。
MongoDB のセットアップ
ジャーナリングが有効になっていると仮定すると (64 ビットのデフォルト)、ジャーナルは定期的にコミットされます。のデフォルト値はjournalCommitInterval
、ジャーナルとデータ ファイルが同じブロック デバイスにある場合は 100 ミリ秒、そうでない場合は 30 ミリ秒です (したがって、ジャーナルを別のディスクに置くことをお勧めします)。
を 2 ミリ秒に変更することもできますがjournalCommitInterval
、書き込み操作の数が増え、全体的な書き込みパフォーマンスが低下します。
書き込み懸念
データがディスクに書き込まれるまで待機するようにドライバーとデータベースに指示する書き込み懸念を指定する必要があります。ただし、これは、データが実際にディスクに書き込まれるまで待機しません。これは、デフォルトのセットアップでは、最悪のシナリオでは 100 ミリ秒かかるためです。
したがって、最良の場合でも、データが失われる可能性がある 2 ミリ秒のウィンドウがあります。ただし、多くのアプリケーションにとっては不十分です。
このfsync
コマンドは、すべてのデータ ファイルのディスク フラッシュを強制しますが、ジャーナリングを使用する場合は不要であり、非効率的です。
実際の耐久性
すべての書き込みをジャーナルに記録したとしても、データセンターの管理者が都合の悪い日を過ごしてハードウェアにチェーンソーを使用したり、ハードウェアが単に分解したりした場合、何の役に立つでしょうか?
RAID のようなブロック デバイス レベルではなく、はるかに高いレベルでの冗長ストレージは、多くのシナリオでより適切なオプションです。レプリカ セットを使用してデータを別の場所または少なくとも別のマシンに置き、w:majority
ジャーナリングを有効にして書き込み懸念を使用します。 (ただし、ジャーナリングはプライマリにのみ適用されます)。個々のマシンで RAID を使用して運を高めましょう。
これにより、パフォーマンス、耐久性、一貫性の最適なトレードオフが実現します。また、書き込みごとに書き込みの懸念を調整でき、可用性が高くなります。3 台の異なるマシンで次の fsync のためにデータがキューに入れられている場合、どのマシンでも次のジャーナル コミットまでに 30 ミリ秒かかる可能性がありますが (最悪の場合)、30 ミリ秒の間隔で 3 台のマシンがダウンする可能性はおそらく 100 万倍になります。 chainsaw-massacre-admin シナリオよりも低い。
証拠
TL;DR: 上記の私の答えは正しいと思います。
ドキュメントは、特に に関しては少しいらいらする可能性があるwtimeout
ため、ソースを確認しました。私はmongoソースの専門家ではないので、これを一粒の塩で取ってください:
ではwrite_concern.cpp
、次のことがわかります (簡潔にするために編集されています)。
if ( cmdObj["j"].trueValue() ) {
if( !getDur().awaitCommit() ) {
// --journal is off
result->append("jnote", "journaling not enabled on this server");
} // ...
}
else if ( cmdObj["fsync"].trueValue() ) {
if( !getDur().awaitCommit() ) {
// if get here, not running with --journal
log() << "fsync from getlasterror" << endl;
result->append( "fsyncFiles" , MemoryMappedFile::flushAll( true ) );
}
MemoryMappedFile::flushAll( true )
が設定されている場合の呼び出しに注意してくださいfsync
。この呼び出しは明らかに最初の分岐ではありません。それ以外の場合、持続性は別のスレッドで処理されます (関連するファイルには接頭辞 が付きますdur_
)。
これはwtimeout
、スレーブを待機する時間を指し、サーバー上の I/O や fsync とは何の関係もありません。