Node.js 多服务器集群

Posted

技术标签:

【中文标题】Node.js 多服务器集群【英文标题】:Node.js Multi Server Clustering 【发布时间】:2013-03-08 06:36:33 【问题描述】:

我正在使用 Node.js 开发一个涉及服务器的项目(为了简单起见,让我们将此服务器想象为聊天服务器,它必须将消息从某些客户端转发到其他客户端)。出于 QoS 的原因,我需要该服务器始终可以访问,所以我想使用集群来划分不同服务器(不同物理机)之间的平衡负载,并确保如果一台服务器出现故障,另一台将准备好为请求提供服务.

我的问题是:这种分布式方法在 Node.js 中可行吗?

我已经阅读了“集群”模块,但据我了解,它似乎只能在同一台机器上的多处理器上扩展。

【问题讨论】:

请仔细标记。这不是cluster-analysis(又名:聚类;一种数据挖掘技术)。 查看 MongoDB 中的分片 - docs.mongodb.com/manual/sharding 您可以按位置或其他一些属性、时区、社交组或聊天室进行分片。 这可以帮助你github.com/pioardi/ring-election 【参考方案1】:

是的,这是可能的。

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

您的主要问题始终是在您的实例之间共享状态,假设您有 4 个聊天服务器 ABCD,并且您有一个 LoadBalancer L,它将连接分布在 4 个服务器之间,然后当 A 出现故障时,您重新连接所有 A与其余实例的连接,您如何确保聊天室的状态在 BC 和 D 上相同?

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

现在你的最后一个问题是 LoadBalancer。如果出现问题,您的整个系统都将关闭。

长话短说;是的,你可以做到,但你需要做出一些艰难的决定,决定你的潜在失败点在哪里。如果您不希望出现单点故障,您将需要一个复杂且昂贵的设置。

【讨论】:

在多台服务器之间共享状态的其他方法是什么,如果 Redis 成为瓶颈怎么办? 查看 MongoDB 中的分片 - docs.mongodb.com/manual/sharding 您可以按位置或其他一些属性、时区、社交组或聊天室进行分片。【参考方案2】:

我的建议是您利用独立的集群来共享状态。换句话说,有一个 API 集群,其中服务器不相互通信,而是共享一个公共 Redis 实例/集群,并共享一个公共 MongoDB 集群。这允许您共享会话、变量,并且您可以利用 Redis 的发布/订阅功能来避免在您的 API 集群中需要任何闲聊。

特别是对于聊天,如果您使用带有 Socket.IO 的 Redis 作为您的客户端,那么无论何时您向大厅广播,它都会在后台使用 redis 将该消息广播到该大厅,尽管大厅成员存在于多个服务器上.此外,这创建了另一个级别的容错,因为任何服务器都可以管理套接字重新连接,如果连接断开,socket.io 将自动重新连接到 API 集群,同时通过 Redis 保持状态。

【讨论】:

以上是关于Node.js 多服务器集群的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Socket.IO 聊天应用集群服务器

Node.JS 内置集群还是 PM2 集群?

Docker 容器和 Node.js 集群

与 RDS MySQL/Aurora 无服务器集群的 SSL 连接因 Node.js 失败

使用集群将 Socket.IO 扩展到多个 Node.js 进程时的一些问题

Node JS - 记录工作集群最后一个异常