2013-10-15 56 views
1

我們有要求將一個特定位的數據寫入到mongo副本集,並且確實真的是確定它是安全的(這是合法的要求) 。是否有一個標準的WriteConcern封裝在大多數節點上寫入磁盤?像MAJORITY_FSYNCED。如何設置WriteConcern以便非常安全地寫入Java中的MongoDB副本

我想出的最好的是以下 - 是否有效? WriteConcern replicaSetFsyscToMajority = new WriteConcern.Majority(0, true, false);

看在Java驅動程序的WriteConcern類預先定義的水平,沒有任何現有的水平似乎相當我後,據我可以告訴:

FSYNCED意味着安全只在主服務器上寫入磁盤。 (因此,主節點上的危機可能導致寫入丟失)

REPLICAS_SAFE似乎代表了寫已經被至少2個副本承認,並寫入內存,不一定到磁盤(所以斷電到整個mongo副本集可能會丟失寫入)。 MAJORITY是相似的 - 但是((n/2)+1)複製品。

補充說明/評論

  • 我們使用Java驅動程序2.11.2關於Java 7
  • 顯然,對於這些超級安全的寫入,性能需要一擊,我們很高興與這(或者更準確地說,我們的負載足夠低,以至於它是過早的優化)。
  • 如果我們不能寫入數據庫,我們可以重試,但如果失敗了,最好*我們放棄用戶的旅程,而不是在沒有數據庫寫入的情況下繼續,:(如我所說,這是一個法律規定

*爲更好的給定的定義


編輯:!我們試過到目前爲止...

我們已經嘗試使用:

new WriteConcern.Majority(0, true, false) 

我可以說它不會拋出任何錯誤(我們可以讀寫,並且所有的測試都通過了),我不知道它是否驗證了寫入的程度,而且我沒有性能分析了它。

回答

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是你所需要的。

+0

謝謝,但我很確定REPLICA_ACKNOWLEDGED和REPLICAS_SAFE確保內存寫入(無錯誤)到兩臺機器。我需要在大多數機器上寫入磁盤。如果您遵循這兩個靜態方法中的構造函數,它們都會評估相同的寫入問題 - (兩次寫入,無限超時,fsync = false) –

+0

http://docs.mongodb.org/manual/reference/write-concern/ 大於1的數字: 寫操作已成功傳播到指定數量的副本集成員(包括主節點)的擔保。如果將w設置爲大於保存數據的成員集的數量,則MongoDB會等待不存在的成員變爲可用,這意味着MongoDB會無限期地阻止。 我認爲這就像你將要得到的一樣。 – evanchooly

+0

問題不在於副本的數量,而在於我們需要確認磁盤寫入,而不僅僅是無錯誤的確認(這基本上是內存寫入)。 (如果您查看該頁面的下一段,有一個叫做「majority」的魔術值,這是我們想要的,而REPLICA_ACKNOWLEDGED被硬編碼爲「2」) –

1

你是對的,與第二方相關的寫入問題只確保確認,而不是數據已寫入磁盤。

我不熟悉Java驅動程序,但應該可以分別設置Journaling和WriteConcern。但請記住,即使在J = 1和W =多數的情況下,如本SO問題中所述也有可能回滾:Can rollback still occur on a MongoDB replica set with J=1 and W=Majority?

J = 1將確保數據在主節點上安全,副局還將以複製的形式提供一些保護。

爲了增加額外的自信,請考慮在主硬盤上使用RAID或類似設備。