Mongodb

MongoDB 多數據中心部署和分片鍵

  • June 30, 2020

在閱讀文件和一些較舊的問題後,我試圖檢查我的理解,所以我的問題很重要:

  1. 在分片集群中,每個分片都應該(並且從 3.6 開始必須?)駐留在自己的副本集上。2)每個副本集都有自己的master。

所以假設我想在 2 個可用區中部署一個 Mongo 集群。所以我建立了一個 6 節點集群,在 2 個單獨的副本集上具有 2 個分片,這樣每個副本集的主節點都位於不同的數據中心。從節點的分佈使得每個副本集中至少有一個從節點位於每個數據中心,因此:

  1. 如果我使用“多數”讀取問題,我的同一副本集中的 mongod 實例是否必須在我的數據中心之間進行通信以驗證數據在至少 2 個實例上可用?聽起來有點傻。還是複制需要更長的時間,因為每個實例都需要向其他實例確認其寫入已完成?
  2. 如果我使用“可用”讀取問題,我可以保證我的應用程序從最近的實例中讀取嗎?我可以讓我的應用程序(比如 Mongo CLI)更喜歡某個奴隸嗎?
  3. 如果我想保證每次寫入都發生在最近的 master 上,我可以使用 region 作為 shard key。

現在假設我想用 4 個分片做同樣的練習,每個副本集 2 個。

  1. 一個副本集中可以有多個分片嗎?即每個節點會複製2組數據?
  2. 如果是這樣,並且我仍想確保每次寫入都發生在最近的主伺服器上,我將使用複合分片鍵,具有區域和其他一些屬性。我可以以某種方式為每個主伺服器配置我的分片鍵雜湊結果範圍嗎?即我想實現類似:

分片 1 和 2 駐留在美國西部數據中心,分片 3 和 4 駐留在美國東部數據中心

然後對於我的 (region, foo) 複合分片鍵,我想保證:

| region = US-West | region = US-East | 
| foo < 0 | foo >=0| foo < 0 | foo >=0|
| shard 1 | shard 2| shard 3 | shard 4|

是的,你的問題很重要……

1.1 是的,每個分片都應該有 RS 1.2 每個 RS 都有自己的主節點。

2.1。僅當您進行從屬讀取時。通常從主節點讀取。它不會直接影響複製。僅寫入數據,寫入關注佔多數。2.2. 如果您進行從讀取並連接到特定實例,則從該實例讀取數據。2.3. 是的,你可以這麼做。

3.1。不是。3.2. 不是。

您可以(當然)在美國西部擁有 2 個分片,在美國東部擁有 2 個分片……然後您只有 4 個使用複合分片鍵 {region:1,foo:1} 的分片集群,但每個分片都有不同數據。您只需要手動設置塊限制(使 foo < 0 和 foo >= 0)並禁用分片之間的平衡……最終結果可能不是最好的,因為數據分佈不均勻。

最好的分片鍵將寫入的數據均勻地分配到每個分片,因此不需要在分片之間進行平衡,並且查詢永遠不需要從多個分片中讀取。使用“壞”鍵,您將所有數據寫入一個分片,然後平衡將該數據移動到其他分片(稍後)。

引用自:https://dba.stackexchange.com/questions/270093