0

我們有3個實例的mongodb副本集,其中主節點位於數據中心D1,數據中心D2上的輔助節點。在我們的設置中,我們不需要任何故障轉移選項,並按照https://docs.mongodb.com/manual/tutorial/configure-secondary-only-replica-set-member/中所述進行配置。當與主節點沒有連接時,從mongodb輔助節點讀取

在同一數據中心D2內的輔助節點上運行的應用程序「A」正在使用貓鼬,我們指定(使用「最接近」或「次要」選項)從輔助節點讀取數據。

我們面臨這些問題:

1)是否有可能使「A」從特定的輔助節點閱讀,而不會在連接配置中是主節點的MongoDB指定?

2)如果數據中心D1和D2之間的連接丟失,我們如何才能使輔助節點仍然讀取「A」應用程序,所以mongoDB主節點不再可用?據我瞭解,它不起作用,因爲即使「A」被配置爲從輔助讀取,mongoDB仍然需要在執行實際讀取操作之前在主要和輔助之間執行一種ping /仲裁。

3)是否有可能/建議在數據中心D2中有一個應用程序,它將直接作爲獨立實例執行對mongodb副本集主實例的寫操作,而不是作爲副本集的一部分?

版本: mongodb的3.2.9,貓鼬4.5.9

回答

1
  1. 是,read preference with tags

  2. 與D1和D2網絡分區,主自動傳送到那些D2節點中的一個,那一個是最「最新的」反對小學的。用"priority settings"你可以引導這個選擇。只要3個節點中有2個節點處於啓動狀態,則其中的2個節點將被選爲主節點。

讓我們想象一下,你有三個節點:

  • D1.N0
  • D2.N1
  • D2.N2

你應該prioritise節點:

  • D1.N0.priority = 3
  • D2.N1.priority = 2
  • D2.N2.priority = 1

現在,只要D1可達然後D1.N0是主。當我們在D1和D2之間進行網絡分區時,D2.N1將成爲主要的,並且將使D2.N2保持爲次要狀態。當網絡分區結束時,D1.N0將通過讀取D2.N1 opLog「追上」缺失的數據,並且將再次成爲主要的,並且D2.N1將是次要的。

  1. 如果您有副本集,則必須始終寫入副本集,而不要直接寫入單個節點!