Replication
當兩個 DC 中的 mongo 主機無法相互通信時,mongoDB 的正確行為是什麼
假設有兩個數據中心: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。副本集中永遠不應該有“均勻”的投票計數。