《MongoDB高手課》學習記錄(第十六天)

第十六天

今天開始事務的學習,要學習的章節爲《19 | 事務開發:寫操做事務》,其實主要就是講一個參數writeConcern。安全

什麼是 writeConcern ?

以前第一章咱們學過,生產環境中MongoDB最少也是須要一個3結點的集羣的。那麼writeConert就是用於控制在數據寫入時,數據寫入多少個結點纔算成功。網絡

> db.test.insert({count: 1}, {writeConcern: {w: 3})

w參數

  • 若是是數字,好比一、二、3等等就是表示須要寫入多少個結點
  • 固然若是超過結點的數量,寫入的時候系統也會報錯
  • 若是是全部結點就寫成 all
  • 系統默認是 majority,即一半以上的結點數據寫入成,才表示寫入成功
  • 若是0,即表示只要主結點寫入成功,即表示數據保存成功。
  • 這裏的寫入成功,不必定是寫入了硬盤,寫入了內存也算成功。

j參數

  • j參數就是來控制,究竟是寫入內存算寫入成功,仍是硬盤算寫入成功,這裏指定寫入了日誌文件裏,說算成功
  • j的取值就2個,true:表明寫入 journal,false:表明寫入內存

wtimeout

  • 若是寫入時間超過了設置時間,系統就提示寫入超時了,但不表明說數據沒寫入成功,由於主結點已經寫完了,就差同步到從結點了。

注意事項

• 雖然多於半數的 writeConcern 都是安全的,但一般只會設置 majority,由於這是等待寫入延遲時間最短的選擇;
• 不要設置 writeConcern 等於總節點數,由於一旦有一個節點故障,全部寫操做都將失敗;
• writeConcern 雖然會增長寫操做延遲時間,但並不會顯著增長集羣壓力,所以不管是否等待,寫操做最終都會複製到全部節點上。設置 writeConcern 只是讓寫操做等待複製後再返回而已;
• 應對重要數據應用 {w: 「majority」},普通數據能夠應用 {w: 1} 以確保最佳性能。性能

實驗

須要搭建一個3節點的測試環境學習

在複製集測試writeConcern參數

db.test.insert( {count: 1}, {writeConcern: {w: "majority"}})
db.test.insert( {count: 1}, {writeConcern: {w: 3 }})
db.test.insert( {count: 1}, {writeConcern: {w: 4 }})

配置延遲節點,模擬網絡延遲(複製延遲)

conf=rs.conf()
conf.members[2].slaveDelay = 5
conf.members[2].priority = 0
rs.reconfig(conf)

觀察複製延遲下的寫入,以及timeout參數

db.test.insert( {count: 1}, {writeConcern: {w: 3}})
db.test.insert( {count: 1}, {writeConcern: {w: 3, wtimeout:3000 }})

總結

今天主要學習了寫操做中,writeConcern參數的使用方法,建設設置爲 majority,這也是系統的默認值,保證大多數結點寫入數據的成功。測試

相關文章
相關標籤/搜索