MongoDB Write Concern整理

    MongoDB提供了一個配置參數:write concern 來讓用戶本身衡量性能和寫安全。分佈式數據庫中這樣的參數比較常見,記得Cassandra中也有一個相似參數,不過那個好像是要寫入幾個節點返回成功。其實道理都同樣分佈式的集羣環境考慮到性能因素不能確保每一個成員都寫入後在返回成功,因此只能交給用戶根據實際場景去衡。
mongodb

    Mongodb提供瞭如下幾個可選設置:Errors Ignored(不推薦),Unacknowledged,Acknowledged,Journaled。列出的級別分別是安全性一次加強的。解釋一下每個選項的特色。數據庫

    Errors Ignored [-1]安全

一個比較不靠譜級別,發出謝寫令後就再也不理會,即便如今有網絡問題也不會發出異常。其實這個官方已經明確給出了警告,閒着沒事別用這個。服務器

    Unacknowledged [0]網絡

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

    Acknowledged [1]性能

這個級別算是中等級別的配置,這個級別可以拿到mongod的返回信息:dupkey Error,以及一些其餘的問題。如今這個級別是驅動的默認級別,估計是10gen公司發現好多人評價Mongodb不靠譜後改的。通常系統這個級別也就夠用了。因爲默認級別是Acknowledged,內部用getLastError方法檢查是否寫入成功的時候是也不用設置任何參數,對與Replset來講能夠在配置中進行getLastErrorDefaults的配置,若是沒有的話默認則是Master收到就ok。測試

    Journaled [1, journal=true ]spa

等到操做記錄到Journal Log中才返回操做結果,也就是下一次JournaledLog提交。這種狀況能夠容忍服務器忽然宕機,斷電等意外的恢復。出去上邊的配置還要在啓動mongod的時候加上journaling 參數確保能夠使用。commitlog提交間隔時間是能夠配置的,單磁盤設備(physical volume, RAID device, or LVM volume)每100ms提交一次,和數據文件刷出相同頻率,日誌和數據分開磁盤設備的30ms提交一次。在插入數據是若是使用{j:true}則會縮短到已配置的默認設置1/3的時間。翻譯

    Replica Acknowledged [>1 or majority]

在副本集中若是w設置爲2的話則至少已經吸入到一個secondary中,我猜想寫入secondary這個級別是Acknowledged級別,majority是多個secondary已經寫入。若是手賤設置w參數大於replset中須要複製的secondarys的話,操做就一直等待直到達到已寫入數據的服務器數量符合要求,也能夠設置timeout值來指明最長等待時間。{ getLastError: 1, w: 2, wtimeout:5000 }    


絕大多數內容翻譯自官方文檔:

http://docs.mongodb.org/manual/core/write-concern/

http://docs.mongodb.org/manual/core/replica-set-write-concern/

相關文章
相關標籤/搜索