Node.js多服务器集群

19

我正在使用Node.js开发一个项目,这个项目涉及到一个服务器(为了简单起见,我们可以将这个服务器想象成一个聊天服务器,它需要将来自某些客户端的消息转发给其他客户端)。出于QoS的原因,我需要保证这个服务器始终可达,因此我想使用集群技术将负载平衡分配给不同的服务器(不同的物理机器),并确保如果一个服务器宕机,另一个服务器会准备好处理请求。

我的问题是:在Node.js中是否可能采用这种分布式方法?

我已经阅读了“cluster”模块的相关资料,但据我所知,它似乎只能在同一台机器的多处理器上进行扩展。


请更加仔细地打标签。这不是[标签:聚类分析](又称:聚类;一种数据挖掘技术)。 - Has QUIT--Anony-Mousse
看看MongoDB中的分片 - https://docs.mongodb.com/manual/sharding/ 你可以按位置或其他属性,如时区、社交群组或聊天室进行分片。 - vovchisko
这可能会对您有所帮助 https://github.com/pioardi/ring-election - pioardi
2个回答

31

是的,这是可能的。

这不是NodeJS的属性,而是您为应用程序设计的架构将确定您是否可以这样做。

您的主要问题始终是跨实例共享状态,因此假设您有4个聊天服务器A B C D,并且您有一个负载均衡器L将连接分布在这4个服务器上,那么当A出现故障时,您重新连接所有与A相关的连接到其余实例时,如何确保聊天室的状态在B C和D上是相同的?

一种方法是使应用程序代码完全无状态,将所有数据推送到分布式内存数据库,例如mongoDb或Redis。您希望数据库是分布式的,以防其中一个数据库实例出现故障。

现在您最后的问题是负载均衡器。如果它出现故障,您的整个系统就会崩溃。

因此,长话短说:是的,您可以这样做,但您需要在潜在的故障点上做出一些艰难的决策。如果您不想有单个故障点,则需要进行复杂而昂贵的设置。


有没有其他方法可以在多个服务器之间共享状态?如果 Redis 成为瓶颈怎么办? - Muhammad Umer
看看MongoDB中的分片 - https://docs.mongodb.com/manual/sharding/ 你可以按位置或其他属性,如时区、社交群组或聊天室进行分片。 - vovchisko

5

我的建议是利用独立的集群来共享状态。换句话说,有一个API集群,在这个集群中,服务器之间不相互通信,而是共享一个常见的Redis实例/集群和一个常见的MongoDB集群。这使您可以共享会话、变量,并且可以利用Redis的发布/订阅功能,从而避免在API集群中需要进行任何传播。

对于Chat功能,如果您使用Redis和Socket.IO作为客户端,则每当您向大厅广播时,它将在幕后使用Redis将该消息广播到该大厅,即使大厅成员存在于多个服务器上。此外,这还创建了另一层容错性,因为任何服务器都可以管理套接字重新连接,而socket.io将通过Redis自动重新连接到API集群,同时通过Redis维护状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接