2015-11-16 71 views
8

在複製品模式中,每個寫操作在任何DB任何集合,還寫入到OPLOG集合。MongoDB的3.0寫鎖定

現在,在並行寫入多個數據塊時,所有這些寫操作也寫OPLOG。 我的問題:這些寫入操作是否需要鎖定oplog? (我正在使用w:1寫關注)。如果他們這樣做,這有點類似於對所有不同的數據庫的所有寫入操作之間的全局鎖定,不是嗎?

我很樂意爲此得到任何提示。

回答

4

根據documentation,在複製中,當MongoDB寫入主節點集合時,MongoDB也寫入主節點的oplog,這是本地數據庫中的一個特殊集合。因此,MongoDB必須同時鎖定集合的數據庫和本地數據庫。 mongod必須同時鎖定兩個數據庫以保持數據庫的一致性,並確保寫入操作(即使使用複製)是「全有或全無」操作。

這意味着到多個數據庫並行於主並行寫入會導致所有的寫操作之間的全局鎖。這不適用於輔助數據庫,因爲MongoDB不會將連續寫入輔助數據的應用程序寫入,而是會批量收集oplog條目,然後並行應用這些批處理。

+0

嗯,我讀了文檔,但我仍然無法相信它。由於oplog條目是冪等的,並且數據庫被鎖定在應用程序上,所以實際上不需要它...我真的不明白它。 –

+1

這篇博文也值得一讀。在開發實時公制系統時,作者確實遇到了這種「全局鎖定」。 – Jaco

+1

忘記添加鏈接:鏈接:http://daprlabs.com/blog/blog/2014/04/19/mongodb/。請注意,該博客作者爲微軟工作,他的一些結論似乎有點偏頗。 – Jaco

3

免責聲明這是我頭上的一切,所以如果我有一個錯誤,請不要把我釘死在十字架上。不過,請糾正我。

他們爲什麼要?

  1. 前提:數據庫,顧名思義,未互連
  2. oplog entries are always idempotent
  3. 的OPLOG是capped collection, with a guarantee of preserving the insert order

假設查詢的真正的並行被應用。所以,我們有兩個查詢在同一時間到達,我們需要決定先插入oplog的哪一個。第一個拿鎖的人會先寫信,對吧?除此之外,還有一個問題。我們假設第一個查詢是一個簡單的查詢db.collection.update({_id:"foo"},{$set:{"bar":"baz"}}),而另一個查詢更復雜,因此需要更長的時間來評估正確性。所以爲了防止這種情況發生,必須在到達時鎖定,並在寫入冪等oplog條目後發佈。

這裏是我不得不依靠我的記憶

然而,查詢也不會以並行應用。查詢是排隊並按到達順序進行評估。在查詢運行完查詢優化器後,數據庫被鎖定在查詢的應用程序上。在該鎖期間,冪等oplog查詢被寫入oplog。由於數據庫不互連,並且在任何給定時間只能將一個查詢應用於數據庫,因此數據庫的鎖定就足夠了。 無論如何,沒有兩個數據更改查詢可以同時應用於同一個數據庫,那麼爲什麼應該在oplog上設置一個鎖? 很顯然,本地數據庫會發生鎖定。但是,由於數據已經被鎖定,我沒有看到原因。* scratchingMyHead *

+2

這篇博文也值得一讀,它描述了可以在更復雜的技術細節中出現在副本集中的「有效全局鎖定」:http://daprlabs.com/blog/blog/2014/04/19/mongodb/ – Jaco

+0

@Jaco有趣的閱讀,雖然我不能得出他的結論。但是,雙重鎖定問題可能值得調查。 –