2013-03-19 173 views
19

我正在與一個涉及服務器的Node.js一起工作(爲了簡單起見,讓我們將這個服務器想象成一個聊天服務器,它必須將消息從某些客戶端轉發到其他客戶端) 。我需要QoS來確保該服務器總是可以訪問,所以我想用羣集來劃分不同服務器(不同物理機器)之間的平衡負載,並確保如果服務器停機,另一臺服務器將準備好爲請求提供服務。Node.js多服務器集羣

我的問題是:這種分佈式方法可能在Node.js中嗎?

我已經閱讀了關於「集羣」模塊的內容,但是據我所知,它似乎只能在同一臺機器上的多處理器上擴展。

+0

請仔細標註標籤。這不是[標籤:聚類分析](又名:聚類;數據挖掘技術)。 – 2013-03-19 15:15:36

+0

在MongoDB中查看分片 - https://docs.mongodb.com/manual/sharding/ 您可以按位置或某些其他屬性,時區,社交羣組或聊天室進行分片。 – 2018-01-16 15:24:43

回答

29

是的,這是可能的。

它不是NodeJS的屬性,而是您爲應用程序設計的體系結構,它將決定您是否可以執行此操作。

你的主要問題將始終是在您的實例共享的狀態,所以說,你有4個聊天服務器ABCD,和你有縱橫交錯的四臺服務器,那麼當出現故障的連接負載均衡器L,並重新連接所有A與其餘實例的關係,您如何確保BC和D上的聊天室狀態相同?

一種方法是讓應用程序代碼完全無狀態,並將所有數據推送到分佈式內存數據庫中,如mongoDb或Redis。您希望在數據庫實例發生故障時分發數據庫。

現在你最後一個問題是LoadBalancer。如果發生這種情況,整個系統就會關閉。

因此,長話短說;是的,你可以做到這一點,但是你需要做出一些艱難的決定,決定你潛在的失敗點。如果你不想單點故障,你將需要一個複雜和昂貴的設置。

+0

在多臺服務器之間共享狀態的其他方式是什麼,如果Redis成爲瓶頸會怎麼樣? – 2017-12-30 06:26:56

+0

在MongoDB中查看分片 - https://docs.mongodb.com/manual/sharding/ 您可以按位置或某些其他屬性,時區,社交羣組或聊天室進行分片。 – 2018-01-16 15:24:10

5

我的建議是你利用獨立的羣集來共享狀態。換句話說,擁有一個API集羣,服務器不會彼此交談,而是共享一個共同的Redis實例/集羣,並共享一個共同的MongoDB集羣。這允許您共享會話,變量,並且您可以利用Redis的pub/sub功能來避免在API集羣中需要任何閒話。

聊天具體地說,如果你使用Redis的使用Socket.IO爲您的客戶端,那麼每當你廣播到大堂,它會使用Redis的幕後播出的消息到大廳大廳儘管現有成員在多個服務器。此外,由於任何服務器都可以管理套接字重新連接,因此會創建另一個容錯級別,並且如果連接斷開,則socket.io將自動重新連接到API羣集,同時通過Redis維護狀態。