Replication

可以將 MongoDB 配置為位於負載均衡器後面嗎?

  • February 6, 2018

根據這篇文章

在單個副本集中,您不能分發寫入,它們都必須轉到主副本。您可以通過 Read Preferences 在您認為合適的情況下將讀取分配到輔助節點。驅動程序跟踪什麼是主要的,什麼是次要的,並適當地路由查詢。

根據Mongo 文件

您還可以部署一組 mongos 實例並在應用程序和 mongos 之間使用代理/負載均衡器。在這些部署中,您必須為客戶端關聯配置負載均衡器,以便來自單個客戶端的每個連接都到達相同的 mongos。

所以基本上,如果你有一個由 3 個節點組成的副本集,你就不能真正使用代理/負載均衡器,因為所有寫入都需要轉到主節點並且你需要客戶端親和性……所以所有讀取還需要去小學。

我在想的是,有可能讓應用程序連接到負載均衡器。負載均衡器會將所有請求路由到主節點(不是很均衡,但無論如何)……直到/除非主節點出現故障 - 此時負載均衡器將開始將請求路由到“新主節點”。

我不確定這是否可能,但是,負載均衡器如何知道哪個 mongo 伺服器已被選為新的主伺服器(因此它應該在哪里路由新請求)?

假設這是可能的,這將實現一定程度的冗餘,以防主伺服器出現故障……我也希望它也具有在網路分區發生時避免過時寫入的副作用,因為負載均衡器(因此所有數據庫客戶端)只會連接到一個主節點。

或者這是一個愚蠢的問題…

你需要仔細閱讀。A**mongos**是提供對分片集群的訪問的查詢路由器。mongos 非常了解底層副本集、(重新)選舉以及最後但並非最不重要的一點,即哪個節點是分片副本集的主節點。

擁有多個 mongos 具有各種優勢。通常的設置是每個應用程序伺服器有一個 mongos。該設置可能是不受歡迎的,例如,因為您有基於負載的應用程序伺服器的自動擴展。**mongos*您可以使用查詢路由器設置大量機器,並通過您的連接字元串將*所有這些實例傳遞到您的應用程序伺服器。這裡的問題是所有查詢都會轉到第一個mongos列出的。為了避免這種情況,您可以在mongos**實例前面放置一個 tcp 負載均衡器。

對於副本集,這些都不是必需的。首先,(大多數,這是所有主要的)驅動程序都非常清楚他們正在連接到副本集的事實,如果配置正確的話。使用副本集感知驅動程序,它們會自動確定目前的主要寫入。對於某種負載平衡,有一個稱為讀取首選項的概念。簡化:在每個查詢的基礎上,您可以選擇從輔助讀取,接受讀取過時數據的可能性,根據最終一致性。同樣,(大多數)驅動程序都知道這一點,並且不需要負載平衡器。

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