我想知道如果我有两台服务器,一台是“主”服务器,另一台只是备用(两台服务器都使用相同的后端代码)。如果主服务器崩溃了,我应该如何处理,让我的客户端使用另一台服务器,使他们不需要重新启动程序或任何其他操作。我已经研究了使用“ bully算法”,但我不知道如何处理客户端在第一台主服务器上使用的套接字和数据(消息),并将其用于我的第二个服务器。
听起来你正在尝试在应用程序级别(例如在Java / sockets代码中)实现“故障转移”。我建议你不要这样做。 以下是一些可能更加强大的替代方案: 实现集群Web服务器和/或集群数据库服务器: http://blog.smartbear.com/devops/high-availability-basics-for-developers/ https://www.centos.org/docs/5/html/Cluster_Suite_Overview/s1-clstr-basics-CSO.html 实现代理: http://www.haproxy.org/ http://wiki.alpinelinux.org/wiki/High_Availability_High_Performance_Web_Cache 为您的SQL数据库提供高可用性 http://blogs.msdn.com/b/sqlcat/archive/2013/11/20/sql-server-2012-alwayson-high-availability-and-disaster-recovery-design-patterns.aspx https://docs.oracle.com/cd/E11882_01/server.112/e10803/toc.htm http://dev.mysql.com/doc/mysql-ha-scalability/en/ha-overview.html 最后,为了回答您关于在应用程序级别实现故障转移的问题,以下是一些示例: Failover Socket Client (.Net) Multithreaded Forward Server Example 补充: 你可能还想看看memcached:http://www.javaworld.com/article/2078565/open-source-tools/use-memcached-for-java-enterprise-performance--part-1--architecture-and-setup.html
首先,如果服务器崩溃,除非服务器重新启动,否则您无法处理其上存储的数据(当然,这时您可以采取措施)。因此,如果您不想在出现故障时丢失数据,应使用分布式(NoSQL?)数据存储(例如Cassandra、Redis、DynamoDB等),因为它们已经以可扩展的方式解决了这个问题。其次,如果您的问题是:“当A失败时,我如何将我的请求从A路由到B”,您可以使用一个简单的(例如基于NodeJS的)代理来前端化您的A和B服务器。最初,代理将所有客户端请求转发到A。当A崩溃时,代理会检测到(可能是当它看到所有转发请求在过去x秒内一直超时时)并切换到服务器B。但是,在这个过程中会有一个小的时间窗口(取决于您配置的x值),其中客户端请求将继续失败。 https://github.com/nodejitsu/node-http-proxy
如果您在服务器上存储任何状态,并且不希望在服务器关闭时丢失该状态,则请将状态存储在两个特定的数据库服务器上 - 主服务器和副本。 如果您不知道选择哪个数据库服务器,请告诉我,我会问您其他问题以帮助您。如果使用您的服务器的客户端代码由您控制,则应在其中实现所有容错逻辑。最简单的方法是“循环式” - 您连接到一个随机服务器,直到找到为您提供服务的服务器。Google“循环式”以获取更多详细信息。如果客户端代码不在您的控制之下,则应使用BGP负载平衡。其主要思想是一旦一个服务器出现问题,另一个服务器就会获得第一个服务器的IP地址,因此客户端方面一切都完美。有关更多详细信息,请搜索“bgp负载平衡”。