Replication

當兩個 DC 中的 mongo 主機無法相互通信時,mongoDB 的正確行為是什麼

  • July 15, 2017

假設有兩個數據中心:DC1 和 DC2。

在 DC1 中:

  • 兩台 mongodb 主機,一台主,一台輔助。DC1 中的所有 mongo 主機都有 readPreferenceTag:dc:"DC1"
  • 兩個應用程序主機,readPreferenceTag 已設置為dc:"DC1"mongo URI 內。

在 DC2 中:

  • 兩個 mongodb 主機,都設置為優先級為 0 的輔助主機(永遠不能選擇為主)。DC2 中的所有 mongo 主機都有 readPreferenceTag:dc:"DC2"
  • 兩個應用程序主機,readPreferenceTag 已設置為dc:"DC2"mongo URI 內。

兩個 DC 中的所有 Mongo 主機都在一個副本集中。

在正常工作流程中,DC1 中的應用程序主機將寫入 DC1 mongo 主機,DC2 中的應用程序主機將寫入 DC1 中的主要 mongo 主機並從 DC2 中的 mongo 主機讀取。

我的問題是:如果 DC1 和 DC2 中的 mongo 主機之間存在網路問題(一個 DC 中的 mongo 主機將無法與另一個 DC 中的 mongo 主機通信,但應用程序主機仍然可以與兩個 DC 中的 mongo 主機通信) ,DC1中的app主機仍然可以與DC1中的mongo主機進行R/W操作。

但是 DC2 中應用程序主機的正確行為是什麼?

從主要 mongo 主機中的配置狀態(rs.status())我們可以知道 DC2 中的所有 mongo 主機都將處於'unreachable'狀態,那麼DC2 中的應用程序主機仍會從 DC2 mongo 主機讀取,還是將從 DC1 mongo 主機讀取?

在這種奇怪的情況下,mongod 程序以某種方式被網路分區(在 DC 之間)但應用程序節點不是。DC2 的 mongod 節點保持在“SECONDARY”狀態。

所以,是的,即使數據沒有從主節點更新,DC2 應用程序仍會繼續從 DC2 mongod 節點讀取數據。

但是,在這種佈局中,如果 DC1 和 DC2 之間存在網路分區,您的 PRIMARY(位於 DC1)將不會保持為主,因為您有四個投票節點,並且在失去兩票 (DC2) 後沒有多數。

您需要仲裁器,它應該位於 DC3。副本集中永遠不應該有“均勻”的投票計數。

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