2013-03-19 174 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维护状态。