1

特定の 1 ビットのデータを mongo レプリカ セットに書き込む必要があり、それが安全であることを確認する必要があります (これは法的要件です)。大部分のノードでディスクへの書き込みをカプセル化する標準の WriteConcern はありますか? MAJORITY_FSYNCED のようなもの。

私が思いついた最高のものは次のとおりです-これは有効ですか? WriteConcern replicaSetFsyscToMajority = new WriteConcern.Majority(0, true, false);

Java ドライバーの WriteConcern クラスの事前定義されたレベルを見ると、私が知る限り、既存のレベルのどれも私が求めているものではないようです。

FSYNCED は、プライマリのみのディスクへの安全な書き込みを意味します。(そのため、プライマリ ノードでメルトダウンが発生すると、書き込みが失われる可能性があります)

REPLICAS_SAFE は、書き込みが少なくとも 2 つのレプリカによって確認され、必ずしもディスクではなくメモリに書き込まれたことを表しているようです (したがって、mongo レプリカ セット全体の電源を切ると、書き込みが失われる可能性があります)。MAJORITY は似ていますが、((n/2) + 1) レプリカです。

補足事項・コメント

  • Java 7 で Java ドライバー 2.11.2 を使用しています。
  • 明らかに、これらの非常に安全な書き込みでは、パフォーマンスが低下しますが、これには満足しています (または、より正確には、負荷が十分に低いため、時期尚早の最適化です)。
  • データベースに書き込めない場合は、再試行できますが、それが失敗した場合は、DB の書き込みなしで続行するよりも、ユーザーの旅を中止する方が良い* :( 私が言ったように、これは法的要件です.

*より良いの特定の定義について!


編集:これまでに試したこと...

以下を使用してみました:

new WriteConcern.Majority(0, true, false)

エラーは発生しないと言えます (読み取りと書き込みが可能で、すべてのテストに合格します)。書き込みが十分に検証されているかどうかはわかりません。また、パフォーマンスのプロファイリングも行っていません。

4

2 に答える 2

1

セカンダリに関連する書き込みの懸念は、データがディスクに書き込まれたことではなく、確認のみを保証することは正しいです。

私は Java ドライバーに詳しくありませんが、Journaling と WriteConcern を別々に設定できるはずです。ただし、J=1 および W=Majority の場合でも、この SO の質問で説明されているように、ロールバックの可能性もあります: Can rollback still occur on a MongoDB replica set with J=1 and W=Majority?

J=1 は、データがプライマリ ノードで安全であることを保証し、セカンダリもレプリケーションの形である程度の保護を提供します。

さらに自信を持たせるには、プライマリのハードディスクで RAID などを使用することを検討してください。

于 2014-03-20T17:27:37.510 に答える
0

WriteConcern の javadoc から:

/**
 * Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
 */
public final static WriteConcern REPLICA_ACKNOWLEDGED= new WriteConcern(2);

/**
 * Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
 * <p>
 * This field has been superseded by {@code WriteConcern.REPLICA_ACKNOWLEDGED}, and may be deprecated in a future release.
 * @see WriteConcern#REPLICA_ACKNOWLEDGED
 */
public final static WriteConcern REPLICAS_SAFE = new WriteConcern(2);

したがって、REPLICAS_SAFE または REPLICA_ACKNOWLEDGED が必要になると思います。

于 2013-10-15T19:08:00.207 に答える