mongodb幽靈操作的解決方案

2021-10-05 09:55:44 字數 1783 閱讀 4410

但是上面的解決方案寫得很含糊,僅僅是提到了:應答式寫入.

那麼應答式寫入的具體mongodb sql例子是啥?

下面內容來自[1]

w : 該選項要求確認操作已經傳播到指定數量的mongod例項或指定標籤的mongod例項

w可選的的值

w:1(應答式寫入)

要求確認操作已經傳播到指定的單個mongod例項或副本集主例項(預設為1)

w:0(非應答式寫入)

不返回任何響應,所以無法知道寫入是否成功

但是對於嘗試向已關閉的套接字寫入或者網路故障會返回異常資訊

w:>1(用於副本集環境)

該值用於設定寫入節點的數目,包括主節點

"majority"(大多數)

適用於集群架構,要求寫入操作已經傳遞到絕大多數投票節點以及主節點後進行應答

要求寫入操作已經傳遞到指定tag標記副本集中的成員後進行應答

j : 該選項要求確認寫操作已經寫入journal日誌之後應答客戶端(需要開啟journal功能)

則在意外重啟,宕機等情形下可以通過journal來進行資料恢復

寫入journal操作必須等待直到下次提交日誌時完成寫入

為降低延遲,mongodb可以通過增加commit journal的頻率來加快journal寫入

wtimeout:

該選項指定乙個時間限制,以防止寫操作無限制被阻塞導致無法應答給客戶端

wtimeout的單位為ms,當w值大於1時生效,該引數即僅適用於集群環境

當某個節點寫入時超出指定wtimeout之後,mongod將返回乙個錯誤

在捕獲到超時之前,mongod並不會撤銷其他節點已成功完成的寫入

wtimeout值為0時等同於沒有配置wtimeout選項,容易導致由於某個節點掛起而無法應答

對於單例項應答的情形,是將資料寫入到記憶體後開始應答,除非j:true,則保證掉電後不會丟失資料

1、非應答式寫入圖示

mongodb不對客戶端進行應答,驅動會檢查套接字,網路錯誤等。

mongos> db.version()

3.2.9

mongos> db.version()

3.2.9

mongos> db

test

mongos> db.blogs.insert(,})

writeresult() //此處應答為空

mongos> db.blogs.find({},)

2、應答式寫入圖示

應答式寫入是預設值

mongodb會在收到寫入操作並且確認該操作在記憶體中應用後進行應答,但不會確認資料是否已寫入磁碟

同時允許客戶端捕捉網路、重複key等等錯誤

mongos> db.blogs.insert(,})

writeresult() //此處應答資訊顯示為1個文件已插入

mongos> db.blogs.find({},)

所以應答式還是非應答式取決於writeconcern中的w的取值

reference:

[2]mongodb 寫安全(write concern)

MongoDB 之 幽靈操作避免

進行靜態載入資料到集合的過程中可能會出現。假設建立乙個任務 job 在mongodb中進行千條更新操作,開始後迅速終止任務,終止所有更新操作,但依然發現新的更新任務在不斷出現,即使任務已經停止。原因是 如果使用非應答式寫入 unacknowledge write 載入資料,應用觸發寫入操作的速度可能...

MongoDB清理資料磁碟不釋放的解決方法

mongodb 不會釋放已經占用的硬碟空間,除非drop整個庫,有以下兩個方法可以釋放磁碟空間。方法一 在mongodb的shell中進入相應庫中執行db.repairdatabase 或db.runcommand 缺點是花費的時間並不短,要保證剩餘一定量磁碟空間,而且當repair databas...

MongoDB中刪除document的方法

刪除表裡面的行記錄 db.users.remove 刪除記錄 delete from users where z abc 預設remove沒有帶選項true false的話,是刪除匹配到的全部行記錄.如果要只刪除一條匹配到的記錄可以使用 db.users.remove true db.t1.dele...