簡體   English   中英

MongoDB在多個AWS實例中進行負載平衡

[英]MongoDB load balancing in multiple AWS instances

我們將amazon Web服務用於使用node.js服務器和mongodb作為數據庫的業務應用程序。 目前,node.js服務器正在EC2媒體實例上運行。 我們將mongodb數據庫保存在一個單獨的微實例中。 現在我們想在我們的mongodb數據庫中部署副本集,這樣如果mongodb被鎖定或不可用,我們仍然可以運行我們的數據庫並從中獲取數據。

因此,我們試圖將副本集的每個成員保留在不同的實例中,這樣即使主要的memeber實例關閉,我們也可以從數據庫中獲取數據。

現在,我想在數據庫中添加負載均衡器,以便即使在一次巨大的流量負載下數據庫也能正常工作。 在這種情況下,我可以通過在replicaSet中添加slaveOK配置來讀取數據庫的平衡。 但是,如果數據庫中的寫入操作存在巨大的流量負載,它將不會對數據庫進行負載平衡。

為了解決這個問題,到目前為止我有兩個選擇。

選項1:我要對數據庫進行分片並將每個分片保存在單獨的實例中。 在每個分片下,將在同一個實例中設置一個reaplica。 但是存在一個問題,因為分片將數據庫分成多個部分,因此每個分片都不會在其中保留相同的數據。 因此,如果一個實例關閉,我們將無法從該實例中的分片訪問數據。

為了解決這個問題,我試圖在分片中划分數據庫,每個分片在不同的實例中都有一個replicaSet。 因此,即使一個實例關閉,我們也不會遇到任何問題。 但是如果我們有兩個分片,每個分片在replicaSet中有3個成員,那么我需要6個aws實例。 所以我認為這不是最佳解決方案。

選項2:我們可以在mongodb中創建一個主 - 主配置,這意味着所有數據庫都是主數據庫,並且所有數據庫都具有讀/寫訪問權限,但我也希望它們每隔一段時間自動同步一次,所以他們最終都成了彼此的克隆人。 所有這些主要數據庫都將在不同的實例中。 但我不知道mongodb是否支持這種結構。

對於這種情況,我沒有任何mongodb doc / blog。 所以,請建議我應該是這個問題的最佳解決方案。

到目前為止,這不是一個完整的答案,有太多的細節,我可以像其他許多人一樣寫一篇關於這個問題的整篇文章,因為我沒有那么多的時間,我會補充一些評論關於我所看到的。

現在,我想在數據庫中添加負載均衡器,以便即使在一次巨大的流量負載下數據庫也能正常工作。

副本集的設計並非如此。 如果你想加載平衡,你實際上可能正在尋找分片,這將允許你這樣做。

復制用於自動故障轉移。

在這種情況下,我可以通過在replicaSet中添加slaveOK配置來讀取數據庫的平衡。

因為,為了保持最新狀態,您的成員將獲得與初級操作一樣多的操作,看起來這可能沒有太大幫助。

實際上,不是讓一台服務器有多個連接排隊,而是在許多服務器上排隊等待過時數據,因為成員一致性是最終的,而不是像ACID技術那樣直接,但是,據說它們最終只有32多毫秒的一致性。意味着如果主要裝載,它們不會滯后以提供適當的吞吐量。

由於讀取是並發的,無論您是從主要還是次要讀取,都將獲得相同的速度。 我想你可以延遲一個奴隸來創建一個暫停的OP,但這會帶來大量過時的數據。

更不用說MongoDB不是多主機,因此你只能寫一個節點一次使slaveOK不再是世界上最有用的設置而且我已經看過很多次10gen自己建議你在這個設置上使用分片。

選項2:我們可以在mongodb中創建主 - 主配置,

這需要您自己編碼。 此時您可能需要考慮實際使用支持http://en.wikipedia.org/wiki/Multi-master_replication的數據庫

這是因為你正在尋找的速度很可能實際上是在寫入而不是如上所述的讀取。

選項1:我要對數據庫進行分片並將每個分片保存在單獨的實例中。

這是推薦的方式,但你已經發現了它的警告。 遺憾的是,多主復制應該解決的問題尚未解決,但是,多主復制確實會將自己的瘟疫大鼠添加到歐洲本身,我強烈建議您在考慮之前是否進行了一些認真的研究。 MongoDB目前無法滿足您的需求。

您可能不必擔心任何事情,因為fsync隊列旨在處理IO瓶頸,這會減慢您的寫入速度,就像在SQL中一樣,並且讀取是並發的,因此如果您計划架構和工作正確,您應該能夠獲得大量OP的數量。

事實上,這里有一個10gen員工的相關問題非常好讀: https//stackoverflow.com/a/17459488/383478它顯示了MongoDB在負載下可以實現的吞吐量。

它將很快通過已經在dev分支中的新文檔級鎖定來增長。

選項1是@Sammaye指出的推薦方式,但您不需要6個實例,並且可以使用4個實例進行管理。

假設您需要以下配置。

  • 2個碎片(S1,S2)
  • 每個分片1個副本(副本集輔助)(RS1,RS2)
  • 每個碎片1個仲裁器(RA1,RA2)

然后,您可以將服務器配置划分如下。

Instance 1 : Runs : S1 (Primary Node)
Instance 2 : Runs : S2 (Primary Node)
Instance 3 : Runs : RS1 (Secondary Node S1) and RA2 (Arbiter Node S2)
Instance 4 : Runs : RS2 (Secondary Node S2) and RA1 (Arbiter Node S1)

您可以運行仲裁節點以及輔助節點,這將有助於您在故障轉移期間進行選舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM