Node.js & Socket.io 具有高可用性

Node.js & Socket.io with High Availibility

我们有一个 node.js 服务器,主要与 socket.io 一起用于 Web 应用程序中的浏览器内部连接。

我们希望有一个高可用性解决方案,理论上由两台 node.js 服务器组成,一台作为主服务器,另一台作为主服务器发生故障时的备用服务器。该解决方案将允许,如果或当主 node.js 服务器出现故障时,备份将接管以提供无缝功能而不会中断。

是否有一种解决方案允许 socket.io 维护多个服务器上的客户端连接数组,而不会重复客户端或发送的消息?

对于 HA 和 node.js 我们应该考虑另一种范例吗?

主备服务器的SocketIO可以连接到redis服务器。这将维护主服务器中的会话并可供备用服务器使用,客户端应再次连接到新服务器(当主服务器发生故障时)。

SoketIO- Redis

HA - 代理用于多个 node.js 实例之间的负载平衡。 HA 代理的使用将取决于您将如何处理主服务器故障。如果你有任何自动切换主服务器的方法,那么 HA-proxy 将不会有太大用处,否则你可以配置 HA-Proxy 在主服务器无法访问时将请求转发到备份服务器。

其他类似于 HA-Proxy 的选项是:

node-http-proxy

Nginx

当当前连接的服务器出现故障时,无法在不中断新服务器的情况下让 webSocket 自动故障转移。连接到发生故障的服务器的 webSockets 将死亡。这就是 TCP 套接字的工作原理。

幸运的是 socket.io,客户端会很快意识到连接已丢失(几秒钟内),并且客户端会很快尝试重新连接。如果您的备份服务器立即到位(例如热备用)来处理传入的 socket.io 连接,那么从客户端的角度来看,重新连接将是相当无缝的。从客户端的角度来看,这似乎只是暂时的网络中断。

但是,在服务器上,您不仅需要备份,还必须能够恢复每个连接的任何状态。如果连接只是用于传递通知的管道并且是无状态的,那么这很容易,因为接收重新连接的备份服务器将立即投入使用。

如果您的 socket.io 连接在服务器端是有状态的,那么当备份服务器接管时,您将需要一种方法来 restore/access 该状态。一种方法是将状态保存在与您的 Web 服务器分开的 Redis 服务器中(尽管您随后还需要 Redis 服务器的 backup/high 可用性计划)。