节点脚本 - 从一台服务器故障转移到另一台服务器

Node script - Failover from one server to another server

我有一个 nodejs 脚本 - 让我们在服务器 1 上将其称为 "process1",在服务器 2 上相同的脚本是 运行 - "process2"(仅使用 flag=false)。

Process1 将执行操作,开始时将处于 "running" 状态。 process2 将是 运行,但处于 "block" 状态,其中编程了标志。

我想要完成的是,为这个过程实施failover/fallback。如果 process1 关闭,process2 上的标志将更改,process2 将从 process1 接管所有任务(反之亦然,当 process1 回来时 - 回退)。

执行此操作的最佳方法是什么?那些之间的TCP连接?


注意:即使它没有太大关系,但我想提一下这些进程将在内部工作,与第三个服务器建立 tcp 连接并解析我们得到的数据从那个服务器。这两个进程在两台服务器上都是 运行,但当时只有 ONE 进程可以提供服务 - 运行 标志为真(而不是两者都为真)其中)


更新:根据下面的讨论和内部 research/test 以及对解决方案的监控,使用反向代理将为您节省大量时间。仅基于 2 个服务器的编程故障转移将涵盖 70% 与两台机器上使用的内部进程相关的案例 - 但您将无法检测到其他 30% 的问题是由于服务器的问题引起的网络(特别是如果您有大量数据接收方的流量)。

与其说是节点问题,不如说这是基础设施问题,同样的情况几乎适用于任何服务器。

您基本上需要的是监视 Server 1 并确定它是 "healthy" 还是 "alive" 的服务,如果是,则继续将流量定向到它。如果该服务确定服务器不再处于稳定状态(例如,响应时间过长,returns 错误),它会将所有传入流量重定向到 Server 2。当它高兴 Server 1 已恢复正常运行条件时,它会将流量重定向回它。

在大多数情况下,这种情况下的 "service" 是 reverse proxy like Nginx or CloudFlare。在您的情况下,此服务器将充当 Data Reciever 和您的网络 (Server 1 / Server 2) 之间的缓冲区,并将传入流量路由到相关服务器。

这看起来像是反向代理的经典用例。使用经过良好测试的服务器(例如 nginx)应该提供足够的可靠性,代理不会失败(硬件故障除外),您可以将其放在您想要的任何集群大小之前。如果适用且配置正确,您甚至可以获得负载平衡的好处。

或者,也倾向于负载平衡解决方案,您可以让前端服务器将请求推送到队列(例如 ZMQ),然后从队列推送到应用服务器或让您的应用-服务器独立地从队列中拉取任务。

在这两种解决方案中,如果不需要 "push" 2 个同时结果到您的数据接收器,您可以使用所有应用程序服务器都推入的出站队列。