mongodb寫入策略(WriteConcern)


寫入策略(WriteConcern)

mongodb的寫入策略有多種方式,寫入策略是指當客戶端發起寫入請求后,數據庫什么時候給應答,mongodb有三種處理策略:客戶端發出去的時候,服務器收到請求的時候,服務器寫入磁盤的時候

Unacknowledged

客戶端發出請求丟到socket的時候就收到相應,這個時候客戶端不需要等地服務器的應答,但是的本地的驅動還是盡可能的通知客戶端網絡的異常,這和客戶端操作系統的配置有關。就像現實中郵寄信件一樣,丟到信箱就結束了,但是如果信箱壞了,發信人還是能知道的。

Acknowledged

這種方式客戶端發送接口會等待服務器給的確認,這種方式一定能確保服務器收到了客戶端的請求,並且服務器能夠異常時,響應客戶端。

Journaled

Journaled方式相比Acknowledged的方式是要保證服務器端已經寫入到硬盤文件了。對於Acknowledged的方式有可能服務收到請求數據相應客戶端后的一瞬間當機了,這個數據就丟失了,但是對於Journaled方式,服務器保證寫入到磁盤后再相應客戶端,即使當機了,也不會導致數據丟失。

Replica Acknowledged

這個方式和Acknowledged是一樣的意思,適用於Replica sets模式。Acknowledged模式下只有一台機器收到了請求就返回了,對於復制集模式有多台機器的情況,可以要求有多台機器收到寫入請求后再相應客戶端。這種更安全,但是導致了客戶端耗時增加,所以要結合自己的場景設置合適的策略。

可以通過下面的方式設置默認的策略,majority表示多數節點寫入成功后才相應客戶端,也可以替換成具體的數子,比如w:2表示至少寫入2個節點才返回。wtimeout表示超時時間,還有一個參加 j 可以設置true,false表示是否是寫入日志才返回。

cfg = rs.conf()
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 } rs.reconfig(cfg)

也可以通過客戶端來指定具體的策略,如下: 至少要寫入兩個節點,超時時間是5s

db.products.insert( { item: "envelopes", qty : 100, type: "Clasp" }, { writeConcern: { w: 2, wtimeout: 5000 } } )

如果復制集是3台機器,寫入兩台機器,流程如下:

請輸入圖片描述

參考資料

https://docs.mongodb.com/manual/reference/write-concern/
https://docs.mongodb.com/manual/core/replica-set-write-concern/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM