我們有要求將一個特定位的數據寫入到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)
我可以說它不會拋出任何錯誤(我們可以讀寫,並且所有的測試都通過了),我不知道它是否驗證了寫入的程度,而且我沒有性能分析了它。
謝謝,但我很確定REPLICA_ACKNOWLEDGED和REPLICAS_SAFE確保內存寫入(無錯誤)到兩臺機器。我需要在大多數機器上寫入磁盤。如果您遵循這兩個靜態方法中的構造函數,它們都會評估相同的寫入問題 - (兩次寫入,無限超時,fsync = false) –
http://docs.mongodb.org/manual/reference/write-concern/ 大於1的數字: 寫操作已成功傳播到指定數量的副本集成員(包括主節點)的擔保。如果將w設置爲大於保存數據的成員集的數量,則MongoDB會等待不存在的成員變爲可用,這意味着MongoDB會無限期地阻止。 我認爲這就像你將要得到的一樣。 – evanchooly
問題不在於副本的數量,而在於我們需要確認磁盤寫入,而不僅僅是無錯誤的確認(這基本上是內存寫入)。 (如果您查看該頁面的下一段,有一個叫做「majority」的魔術值,這是我們想要的,而REPLICA_ACKNOWLEDGED被硬編碼爲「2」) –