MongoDB - write concern concept

本文翻譯自 write concern
注意,本文內容適用於MongoDB Manual 3.0.2及以上版本。mongodb

What's write concern

所謂的寫關注就是當向客戶端報告寫操做的成功執行時,MongoDB提供的保證。經過提供不一樣級別的寫關注來解決應用的具體需求。shell

Considerations

Default Write Concern

mongo shell和MongoDB驅動使用acknowledged做爲默認寫關注級別。數據庫

Read Isolation

注:讀與寫如何隔離?寫與寫如何隔離?網絡

在將這些修改提交至磁盤以前,MongoDB容許客戶端讀取剛插入或修改的文檔,無論寫關注的級別或日誌(journaling)配置。其結果是,應用能夠觀察到兩類行爲:併發

  1. 對於有多個併發讀取者和寫入者的系統來講,在寫操做返回以前,MongoDB容許客戶端讀取寫操做的結果。
  2. 若是在提交數據至日誌(journal)以前mongod進程終止了,那麼即便寫操做成功返回了,查詢仍可能讀取到 在mongod重啓後 並不存在的數據。

其餘數據庫系統稱這些 隔離語義(isolation semantics) 爲read uncommitted。對於全部的插入和更新,MongoDB以隔離方式修改每個文檔:客戶端從不會看到中間狀態的文檔。對於多文檔操做來講,MongoDB並未提供多文檔事物或隔離。ide

當以單機方式(standalone)方式部署的mongod從使用journaled寫關注的寫操做中返回時,數據就徹底提交至磁盤了,重啓mongod後它們就可用了。spa

對於副本集,只有在 在副本集的大部分投票節點上寫操做被複制且提交數據至日誌 以後,寫操做纔是持久的。MongoDB會按期(regularly)提交數據至日誌,無論journaled寫關注:使用commitIntervalMs去控制mongod多長時間提交一次數據。翻譯

Timeouts

客戶端能夠設置一個wtimeout值,做爲replica acknowledged寫關注的一部分。若是在指定的時間間隔內寫關注未被知足,當前操做就會返回錯誤,即便寫關注最終成功完成。日誌

wtimeout間隔過時以前,MongoDB不會回滾或撤消已作出的修改。進程

Write Concern Levels

MongoDB有下面這些概念性的寫關注等級,由弱到強:

注:下面這些只是邏輯概念上的寫關注級別,並不是配置write concern時恰好有這幾個配置枚舉值可選。實際上寫關注包含兩個方面,分別對應兩個配置項:wj,須要組合這兩個配置項來實現下面這些寫關注級別。具體請看Write Concern Reference

unacknowledged

MongoDB不會告知客戶端寫操做已收到。unacknowledged相似於error ignored。然而,驅動程序在可能的時候會試圖接收並處理網絡錯誤。但驅動檢測網絡錯誤的能力有賴於系統的網絡設置。

Default Write Concern Change勾畫出的發佈(注:此版本已發佈於2012.11)以前,unacknowledged就是默認寫關注。

圖片描述

acknowledged

acknowledged 也叫 receipt acknowledgedmongod會告知客戶端已收到寫操做,而且已將改變應用於數據的內存視圖。acknowledged 寫關注(write concern)容許客戶端捕獲網絡(network)、重複鍵(duplicate key)和其餘錯誤。但acknowledged 寫關注並不會確認寫操做已經被持久化到磁盤系統。

Default Write Concern Change勾畫出的驅動發佈(注:此版本已發佈於2012.11)開始,MongoDB將默認使用acknowledged寫關注。

![](./acknowledged.png)

journaled

MongoDB僅在將數據提交到journal後才告知客戶端。(告知客戶端什麼信息呢?)這種寫關注會確保在關機或電力中斷後MongoDB可以恢復數據。

你必須啓用journaling以使用這種寫關注。

使用這種寫關注,寫操做必須等到下一第二天志提交(journal commit)才能返回。爲了下降操做延遲,MongoDB也增長了它提交數據至日誌(journal)的頻率。參考commitIntervalMs文檔以獲取更多信息。

圖片描述

注意:
若是在副本集中須要journaled寫關注,只須要寫操做在主節點上完成日誌提交就好了,不用考慮replica acknowledged寫關注。(journaled寫關注只是一種邏輯上的寫關注級別,實際並無這個配置項值,組合wj兩個配置項才能實現用戶指望的寫關注。

replica acknowledged

關於寫關注,副本集(relica set)提出了額外的考慮因素。默認寫關注僅要求來自主節點(the primary)的確認(acknowledgement)。

使用這種寫關注,你可以確保寫操做被傳播至副本集中的額外成員,即部分從節點(the secondary)。參考**Write Concern for Replica Sets **文檔以獲取更多信息。

圖片描述

注意:
若是在副本集中須要journaled寫關注,只須要寫操做在主節點上完成日誌提交就好了,不用考慮replica acknowledged寫關注。(journaled寫關注只是一種邏輯上的寫關注級別,實際並無這個配置項值,組合wj兩個配置項才能實現用戶指望的寫關注。

Related Resources

Write Concern Reference

相關文章
相關標籤/搜索