簡體   English   中英

如何設置WriteConcern以非常安全地寫入Java中的MongoDB副本集

[英]How to set WriteConcern for very safe writes to MongoDB replica set in Java

我們需要將一個特定的數據寫入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)

我可以說它不會引發任何錯誤((我們可以讀取和寫入,並且我們所有的測試都通過了)),我不知道它是否在很大程度上驗證了寫入,並且我還沒有對它進行性能分析。

沒錯,與次要文件有關的寫操作僅可確保確認,而不是將數據寫入磁盤。

我對Java驅動程序不熟悉,但是您應該能夠分別設置Journaling和WriteConcern。 但是請記住,即使在J = 1和W =多數的情況下,也有回滾的可能性,如本SO問題中所述: 在J = 1和W =多數的MongoDB副本集上是否仍會發生回滾?

J = 1將確保數據在主節點上是安全的,輔助節點還將以復制的形式提供一些保護。

為了增加信心,請考慮在主硬盤上使用RAID或類似硬盤。

從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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM