mongodb幽灵操作的解决方案
生活随笔
收集整理的這篇文章主要介紹了
mongodb幽灵操作的解决方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<Mongodb權威指南>中提到了幽靈操作
但是上面的解決方案寫得很含糊,僅僅是提到了:應答式寫入.
那么應答式寫入的具體Mongodb SQL例子是啥?
下面內容來自[1]
Write Concern用法
{ w: <value>, j: <boolean>, wtimeout: <number> }w : 該選項要求確認操作已經傳播到指定數量的mongod實例或指定標簽的mongod實例w可選的的值<number>w:1(應答式寫入)要求確認操作已經傳播到指定的單個mongod實例或副本集主實例(缺省為1)w:0(非應答式寫入)不返回任何響應,所以無法知道寫入是否成功但是對于嘗試向已關閉的套接字寫入或者網絡故障會返回異常信息w:>1(用于副本集環境)該值用于設定寫入節點的數目,包括主節點"majority"(大多數)適用于集群架構,要求寫入操作已經傳遞到絕大多數投票節點以及主節點后進行應答<tag set>要求寫入操作已經傳遞到指定tag標記副本集中的成員后進行應答j : 該選項要求確認寫操作已經寫入journal日志之后應答客戶端(需要開啟journal功能)則在意外重啟,宕機等情形下可以通過journal來進行數據恢復寫入journal操作必須等待直到下次提交日志時完成寫入為降低延遲,MongoDB可以通過增加commit journal的頻率來加快journal寫入wtimeout:該選項指定一個時間限制,以防止寫操作無限制被阻塞導致無法應答給客戶端wtimeout的單位為ms,當w值大于1時生效,該參數即僅適用于集群環境當某個節點寫入時超出指定wtimeout之后,mongod將返回一個錯誤在捕獲到超時之前,mongod并不會撤銷其他節點已成功完成的寫入wtimeout值為0時等同于沒有配置wtimeout選項,容易導致由于某個節點掛起而無法應答對于單實例應答的情形,是將數據寫入到內存后開始應答,除非j:true,則保證掉電后不會丟失數據
1、非應答式寫入圖示
2、應答式寫入圖示
應答式寫入是默認值MongoDB會在收到寫入操作并且確認該操作在內存中應用后進行應答,但不會確認數據是否已寫入磁盤同時允許客戶端捕捉網絡、重復key等等錯誤mongos> db.blogs.insert({ename:"john",url:"http://blog.csdn.net/john"},{writeConcern:{w:1}})WriteResult({ "nInserted" : 1 }) //此處應答信息顯示為1個文檔已插入mongos> db.blogs.find({},{_id:0}){ "ename" : "leshami", "url" : "http://blog.csdn.net/leshami" }{ "ename" : "john", "url" : "http://blog.csdn.net/john" }所以應答式還是非應答式取決于writeConcern中的w的取值
?
Reference:
[2]MongoDB 寫安全(Write Concern)
總結
以上是生活随笔為你收集整理的mongodb幽灵操作的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel框架总结(一) -- 请求
- 下一篇: jQuery的ajax里dataType