MongoDB Write Concern整理

chenfeng發表於2016-01-14

MongoDB提供了一個配置引數:write concern 來讓使用者自己衡量效能和寫安全。分散式資料庫中這樣的引數比較常見,記得Cassandra中也有一個類似引數,不過那個好像是要寫入幾個節點返回成功。其實道理都一樣分散式的叢集環境考慮到效能因素不能確保每個成員都寫入後在返回成功,所以只能交給使用者根據實際場景去衡。

    Mongodb提供了以下幾個可選設定:Errors Ignored(不推薦),Unacknowledged,Acknowledged,Journaled。列出的級別分別是安全性一次增強的。解釋一下每一個選項的特點。

    Errors Ignored [-1]

一個比較不靠譜級別,發出謝寫令後就不再理會,即使現在有網路問題也不會發出異常。其實這個官方已經明確給出了警告,閒著沒事別用這個。

    Unacknowledged [0]

這個級別也屬於比較低的級別,以前這個級別是驅動配置的預設級別,不過後來調整成Acknowledged級別。在這個級別下,這個驅動會根據當前系統的網路配置進行網路問題的檢測,不等待Mongd的返回。程式碼測試:本地網路問題是否有異常?本地網路無問題是遠端server問題是否異常?

MongoDB Write Concern整理

    Acknowledged [1]

這個級別算是中等級別的配置,這個級別能夠拿到mongod的返回資訊:dupkey Error,以及一些其他的問題。現在這個級別是驅動的預設級別,估計是10gen公司發現好多人評價Mongodb不靠譜後改的。一般系統這個級別也就夠用了。由於預設級別是Acknowledged,內部用getLastError方法檢查是否寫入成功的時候是也不用設定任何引數,對與Replset來說可以在配置中進行getLastErrorDefaults的配置,如果沒有的話預設則是Master收到就ok。

MongoDB Write Concern整理

    Journaled [1, journal=true ]

等到操作記錄到Journal Log中才返回操作結果,也就是下一次JournaledLog提交。這種情況可以容忍伺服器突然當機,斷電等意外的恢復。出去上邊的配置還要在啟動mongod的時候加上journaling 引數確保可以使用。commitlog提交間隔時間是可以配置的,單磁碟裝置(physical volume, RAID device, or LVM volume)每100ms提交一次,和資料檔案刷出相同頻率,日誌和資料分開磁碟裝置的30ms提交一次。在插入資料是如果使用{j:true}則會縮短到已配置的預設設定1/3的時間。

MongoDB Write Concern整理

    Replica Acknowledged [>1 or majority]

在副本集中如果w設定為2的話則至少已經吸入到一個secondary中,我猜測寫入secondary這個級別是Acknowledged級別,majority是多個secondary已經寫入。如果手賤設定w引數大於replset中需要複製的secondarys的話,操作就一直等待直到達到已寫入資料的伺服器數量符合要求,也可以設定timeout值來指明最長等待時間。{ getLastError: 1, w: 2, wtimeout:5000 }    

MongoDB Write Concern整理


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-1976423/,如需轉載,請註明出處,否則將追究法律責任。

相關文章