如果服务器崩溃,我应该如何处理?

How should I handle if a server crash?

我想知道我是否有 2 台服务器,一台是 "main" 服务器,另一台就在那里(两者都使用相同的后端代码)。如果主服务器崩溃并且我希望我的客户使用另一台服务器,我应该如何处理,这样他们就不必重新启动他们的程序或类似的东西。

我已经阅读了有关使用 bully 算法 的内容,但我不知道如何处理我的客户第一次使用的套接字和数据(消息)主服务器,并在我的第二个服务器中使用它。

首先,如果服务器崩溃,您无法对驻留在其上的数据做任何事情(当然,直到服务器恢复正常)。因此,如果您不想在发生故障时丢失数据,您应该使用分布式(NoSQL?)数据存储(例如 Cassandra、Redis、DynamoDB 等),因为它们已经以可扩展的方式解决了这个问题。

其次,如果您的问题是 'how do I route my requests from A to B when A fails',您可以使用简单的(例如基于 NodeJS 的)代理将服务器 A 和 B 作为前端。最初,代理将 'forward' 所有客户端请求发送给 A。当 A 崩溃时,代理检测到(可能是当它发现所有转发的请求在过去 x 秒内都已超时)并切换到服务器 B。 但是,会有一小段时间 window(取决于您配置的 x 值)客户端请求将不断失败。

https://github.com/nodejitsu/node-http-proxy

听起来您正试图在应用程序级别(例如,在您的 Java/sockets 代码中)实施 "failover"。我不鼓励你那样做。

这里有一些可能更强大的替代方案:

附录:

  1. 如果您在服务器上存储了您不想在服务器关闭时丢失的任何状态,那么请将您的状态存储在两个特定的数据库服务器上 - 主服务器和副本服务器。如果您不知道选择哪个数据库服务器,请告诉我,我会问您其他问题以提供帮助。
  2. 如果使用您的服务器的客户端代码在您的控制之下,则在其中实施所有容错逻辑。执行此操作的最简单方法是 "round robin" - 您连接到随机服务器,直到找到满足您请求的服务器。 Google "round robin" 了解更多详情。
  3. 如果客户端代码不受您的控制,那么您应该使用 BGP 负载平衡。其主要思想是,一旦服务器关闭,另一台服务器将获得第一个服务器的 IP 地址,例如在客户端,一切都是完美的。更多详情只需 google "bgp load balancing".