標籤:write concern journal mongodb 寫效能
write concern保證了mongodb寫操作的層級,不同的write concern設定對應了不同層級的寫操作,設定的層級越高,那麼寫操作的效能的持久化做得越好,但是寫效能也就越差。mongodb預設採用 Acknowledged的write concern層級,這也是安全性最高的層級。
在 Acknowledged層級的複本集模式下,mongodb可在用戶端設定一個wtimeout值,如果在規定的時間內無法完成這個寫操作就返回一個錯誤,即使它最終可能能夠完成。
Write Concern Levels
Unacknowledged
在Unacknowledged模式下,mongodb伺服器不會去確認寫操作是否真正收到了,類似於忽略了所以操作。然而,磁碟機還是會嘗試接收和處理來自網路的錯誤,這就取決於系統的網路設定了,是Unacknowledged層級的原理圖。
AcknowledgedAcknowledged模式下,mongod會去確認它接收到了這個寫操作並且將這個寫操作應用到記憶體資料中,Acknowledged 模式運行用戶端捕捉所有網路錯誤,主鍵衝突等錯誤。但是Acknowledged 並不能保證寫操作應用到磁碟資料總。以下是原理圖
JournaledJournaled模式下,mongodb伺服器會確認寫操作提交到journal log中,所以這個層級可以保證mongodb可以在意外宕機以後恢複出所有資料。當然這個層級必須保證你在伺服器端開啟了journaling ,並且每次都必須等待直到下一次journal log的提交,這時你可以嘗試增大journal log的commit頻率。
Replica Acknowledged如果你們的mongodb用到了複本集,寫操作或許就需要額外的考慮,預設的設定只要求了主節點的Acknowledged。而在Replica Acknowledged模式下,它會保證所有的寫操作都應用到複本集中的所有節點中,不過這裡的journal log只需要保證主節點的journal log commit就可以了。
Available Write Concern每次寫操作後driver都會自動調用getLastError()命令來判斷是否發生了寫錯誤以及是否按照設定的writeconcern以後運行,例如db.runCommand( { getLastError: 1, w: 2,j:true, wtimeout:5000 } )就是確認上一次的操作w為2,j為true,wtimeout為5000時,有沒有報錯。而db.things.insert({dd:123},{writeconcern:{w:2}})是設定當前插入的SQL的writeconcern; db.setWriteConcern({w:1,wtimeout:3000,j:1})是設定當前的db的writeconcern值;
db.getWriteConcern()是擷取當前db的write concern設定;
w Option1 預設配置,確保單一實例mongod或複本集中的主節點在寫操作時acknowled0 所有的都沒有acknowled,但是這時你如果設定了journal commit acknowled的話,那麼寫操作依舊是acknowled模式N 首先N>1,N的值表示在複本集中包括主節點在內的需要acknowled的節點數量majority 保證複本集中大多數節點acknowled
<tag set> 保證這個目標複本集的所有節點acknowledj Optionj操作確保寫操作的資料應用到磁碟上的journal log,值true表示開啟,flase表示關閉。複本集中設定為true只能保證主節點上的寫操作應用到磁碟的journal log。wtimeout這個值只針對w的值設定為大於1的場合有效,即只針對複本集環境有效。當發生逾時時就會返回一個錯誤,即使最終資料write成功了,這時mongodb不會復原已經修改成功的資料。該值設定為0就是不做限制。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
mongodb官網文檔閱讀筆記:write concern