1. 程式人生 > >mongodb官網文檔閱讀筆記:write concern

mongodb官網文檔閱讀筆記:write concern

ava 節點數 edge 返回 post ase 執行c ans mman

write concern保證了mongodb寫操作的級別,不同的write concern設置相應了不同級別的寫操作。設置的級別越高。那麽寫操作的性能的持久化做得越好,可是寫性能也就越差。

mongodb默認採用?Acknowledged的write concern級別,這也是安全性最高的級別。

?Acknowledged級別的副本集模式下。mongodb可在client設置一個wtimeout值。假設在規定的時間內無法完畢這個寫操作就返回一個錯誤,即使它終於可能能夠完畢。

Write Concern Levels

Unacknowledged

Unacknowledged模式下,mongodbserver不會去確認寫操作是否真正收到了,相似於忽略了所以操作。然而,驅動器還是會嘗試接收和處理來自網絡的錯誤,這就取決於系統的網絡配置了。下圖是Unacknowledged級別的原理圖。

技術分享圖片技術分享圖片

Acknowledged

Acknowledged模式下,mongod會去確認它接收到了這個寫操作而且將這個寫操作應用到內存數據中。Acknowledged?模式執行client捕捉全部網絡錯誤。主鍵沖突等錯誤。

可是Acknowledged?並不能保證寫操作應用到磁盤數據總。下面是原理圖

技術分享圖片技術分享圖片

Journaled

Journaled模式下。mongodbserver會確認寫操作提交到journal log中。所以這個級別能夠保證mongodb能夠在意外宕機以後恢復出全部數據。

當然這個級別必須保證你在server端開啟了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?Option

1 默認配置,確保單實例mongod或副本集中的主節點在寫操作時acknowled 0 全部的都沒有acknowled,可是這時你假設設置了journal commit?acknowled的話,那麽寫操作依然是acknowled模式 N 首先N>1,N的值表示在副本集中包含主節點在內的須要acknowled的節點數量 majority 保證副本集中大多數節點acknowled
<tag set> 保證這個目標副本集的全部節點acknowled

j?Option

j操作確保寫操作的數據應用到磁盤上的journal log,值true表示開啟,flase表示關閉。副本集中設置為true僅僅能保證主節點上的寫操作應用到磁盤的journal log。

wtimeout

這個值僅僅針對w的值設置為大於1的場合有效,即僅僅針對副本集環境有效。當發生超時時就會返回一個錯誤,即使終於數據write成功了。這時mongodb不會回滾已經改動成功的數據。

該值設置為0就是不做限制。




mongodb官網文檔閱讀筆記:write concern