MongoDB的事務(1/3) 寫操做 writeConcern

writeConcern
  • writeConcern決定一個寫操做落在多少個節點上纔算成功。writeConcern的取值包括:shell

    • writeConcern 雖然會增長寫操做延遲時間,但並不會顯著增長集羣壓力,所以不管是否等待,寫操做最終都會複製到全部節點上。設置writeConcern只是讓寫操做等待複製後再返回而已。
    • 應對重要數據應該使用 {w:"majority"},普通數據能夠應用 {w:1} 以確保最佳性能。
    • 0:發起寫操做,不關心是否成功;
  • 1~集羣最大數據節點數:寫操做須要被複制到指定節點數纔算成功;異步

    • majority:寫操做須要被複制到大多數節點上纔算成功。
    • 發起寫操做的程序將阻塞到寫操做複製完成,到達指定的節點數爲止。
  • w默認行爲性能

    db.test.insert({count:1})
    • 默認只寫入主節點一個。大數據

    • 甚至默認狀況下都不用寫到盤裏,內存裏寫完就返回了。code

    • 以下圖所示,解釋一下實現表示完成操做,虛線表示會異步進行結果就不保證了。blog

  • w: "majority" 大多數節點確認模式【推薦】內存

    db.test.insert({count:1},{writeConcern:{w:"majority"}})
        db.test.insert({count:1},{writeConcern:{w:3}})
        db.test.insert({count:1},{writeConcern:{w:4}})
  • w: "all" 所有節點確認模式同步

    • 弊端就是有一個節點掛了就會一直阻塞。it

  • j:trueio

    • conf=rs.conf()
      conf.members[2].slaveDelay=5 # 延遲同步
      conf.members[2].priority=0 # 關掉選舉, 由於上一步設置了延遲同步,這個地方必須設置關掉;否則報錯。
      rs.reconfig(conf)
    • writeConcern 能夠決定寫操做到達多少個節點纔算成功,journal 則定義如何纔算成功。

    • 取值包括:

      • true,寫操做要落到 journal 文件中才算成功;
      • false,默認值,寫操做到達內存即算做成功。
  • 觀察複製延遲下的寫入,以及 timeout 參數

    db.test.insert({count:1},{writeConcern:{w:3}})
    db.test.insert({count:1},{writeConcern:{w:3,wtimeout:3000}}) # 爲了防止節點掛掉,一直阻塞,能夠設置返回一個超時的警告。
       # 可是要注意,數據實際上寫進去了,這裏只是警告!!
相關文章
相關標籤/搜索