本文翻譯自 write concern reference。
注意,本文內容適用於MongoDB Manual 3.0.2及以上版本。mongodb
寫關注就是當向客戶端報告寫操做的成功執行時,MongoDB提供的保證。這個保證包含兩個方面:服務器
版本2.6中的修改:一個針對寫操做的新協議將寫關注與寫操做集成在一塊兒,這就消除了調用getLastError命令的須要。之前的版本須要在寫操做以後當即調用getLastError命令,以指定寫關注級別。網絡
write concern能夠包含w選項,以指定返回前要求的確認數量;包含j選項,以要求返回前需將數據寫入日誌(journal);包含wtimeout選項指定一個時間限制,以防止寫操做無窮盡地阻塞。socket
在分片集羣中,mongos實例會將寫關注傳遞給分片。(注:什麼是mongos呢,請看mongos 與 mongod)編碼
w選項提供了既能夠爲副本集指定寫關注,還能夠徹底關閉寫關注的能力。翻譯
MongoDB使用w: 1做爲默認寫關注,w: 1提供了基本的收到確認。日誌
w選項接受以下值:ip
Value | Description |
---|---|
1 | 提供在單機模式的mongod或副本集主節點上的寫操做確認。 這是MongoDB默認的寫操做。 |
0 | 關閉基本的寫操做確認,但返回socket異常和網絡錯誤信息給應用。 若是你關閉了基本的寫操做確認,但卻要求日誌提交確認(journal commit acknowledgement),那麼日誌提交會佔優點,進而服務器會要求mongod對寫操做進行確認。 |
<Number greater than 1> | 保證寫操做已成功傳播至指定數量的副本集成員(包括主節點)。 例如,w: 2表示要求主節點和至少一個從節點的確認。 若是你將w設置爲一個比持有數據的副本集成員數更大的數值,MongoDB會等待那些不存在的成員變得可用,這意味着MongoDB會無窮盡地阻塞。 |
"majority" | 確保寫操做已成功傳播至大部分投票節點:副本集投票成員中的大部分必須在寫操做成功返回前對寫操做進行確認。這可讓你避免在應用中對副本集大小作硬編碼的假設。 3.0版本中的修改:在之前的版本中,w: "majority"指的是副本集成員的大部分。 2.6版本中的修改:在主從(Master/Slave)部署中,MongoDB把w: "majority"視做與w: 1是等效的。在更早的版本中,在主從部署中w: "majority"會產生一個錯誤。 |
<tag set> | 經過指定標籤集,你能夠擁有對 哪些副本集成員必須對寫操做進行確認 細粒度的控制,以知足須要的寫關注級別。 |
j選項確保mongod實例已將數據寫入磁盤上的日誌文件。這會確保若是mongod意外關閉了,數據也不會丟失。設置爲true即啓用journaling。部署
2.6版本中的修改:對 帶有--nojournal選項運行着的mongod或者mongos指定包含j: true的寫關注如今會報錯。之前的版本會忽略j: true。get
注意:
若是在副本集中須要journaled寫關注,只須要寫操做在主節點上完成日誌提交就好了,不用考慮replica acknowledged寫關注。(journaled寫關注只是一種邏輯上的寫關注級別,實際並無這個配置項值,組合w和j兩個配置項才能實現用戶指望的寫關注。)
這個選項爲寫關注指定一個毫秒數的時間限制。只有在w大於1時,wtimeout纔是可應用的。
wtimeout會致使寫操做在指定的時限以後帶着錯誤返回,即便要求的寫關注最終成功完成。當這些寫操做返回時,MongoDB不會撤銷在寫關注超過wtimeout時限以前已經成功執行的數據修改。
若是你沒有指定wtimeout,而要求的寫關注又沒法實現,那寫操做將會無窮盡地阻塞下去。指定wtimeout爲0等效於不帶wtimeout選項的寫關注。