2012-10-03 71 views
0

我想知道有關配置服務器本聲明MongoDB中(from documentation):MongoDB的配置服務器 - 只讀

如果任何配置的服務器宕機,集羣的元數據都會 只讀。但是,即使在這種故障狀態下,仍然可以讀取和寫入MongoDB羣集 。

我們可以使用1或3個配置服務器。爲什麼如果我們使用3個配置服務器並且一臺服務器關閉,羣集將轉到只讀模式? 正如你可以從上面的鏈接看到的,Each config server has a complete copy of all chunk information
如果每個sesrver都具有所有塊信息的完整副本,爲什麼只有在一個配置服務器關閉後纔會讀取它?

回答

2

所以,原因是配置服務器進行兩階段提交的方式。而如果你有一個配置服務器,並且它失敗了,那麼你的整個系統就會失敗。如果您有3個,但其中一個失敗,則所有元數據仍然可用,但您失去了2階段提交的彈性因子。沒有3個成員就不能進行2階段提交。

因此,您仍可能會從其他兩個讀取中讀取數據,但平衡器基本上已關閉,因此不會發生塊遷移或拆分(因此元數據將變爲只讀)。這是因爲您不能使用3節點配置設置使用的提交進程來提交拆分或遷移,所以它們不會發生。

不推薦使用1個配置服務器運行。基本上,如果它發生故障,你不知道你的數據在哪裏。

2階段提交僅適用於3臺機器,因爲它可以確保您的數據保持一致狀態。這意味着如果一臺機器在更新過程中死亡,那麼更新將會失敗或者持續,這取決於它是否被提交給至少另一個會更新第三個節點的節點(因此是2階段提交)。因此,使用左側的2個配置服務器來讀取分片羣集是安全的。

你不能這樣做2節點。它可能已經過了,它可能沒有,你不能說,因爲你不能比較剩下的最後一個節點和其他節點之間的任何事情。因此,安全的做法是在第三個節點備份之前不要進行任何更新,否則您可能會讀取過期數據。

如果您想要無縫失敗抵抗,那麼使用2因爲您使用2階段承諾是沒有意義的。如果你寧願沒有任何可能不正確的數據,它實際上沒有更多的耐久性,然後1節點。而在分片集羣中,任何事情和不正確的數據都會攜手並進,因爲無論哪種方式你都不知道在哪裏找到你的組塊。

它基本上是爲了保護您免受潛在的配置數據損壞和不一致之處。

+0

但是爲什麼不在2個節點中使用2階段提交?而且一切都會繼續,分裂和移動將會發生。如果需要,您可以使用1個配置服務器。 –