Website/webserver 容错 - 最佳实践

Website/webserver fault tolerance - the best practices

例如,我在同一个网络中有两台服务器,具有相同的code/software。如果主服务器出现故障,我希望第二台成为主服务器。

我听说过以下方法:

上述方法的优缺点是什么?实现这一目标的最佳做法是什么?

我对 CARP 不太熟悉,但我可以尝试帮助解决其余两个选项:

循环 DNS 为您提供负载平衡,但如果服务器出现故障,它仍会接收请求(也会失败)
即:DNS www.example.com 指向 x.x.x.1 和 x.x.x.2
如果 x.x.x.2 死掉,DNS 仍将解析为 x.x.x.2 并且客户仍会尝试从中请求,因此这会使您在停机期间的请求失败率降低一半(不好)
即使您在停机期间将 DNS 更改为仅指向 x.x.x.1; DNS 传播将花费很长时间,您仍然会丢失请求。

老实说,在你的堆栈前面放置一个负载平衡器(代理服务器)是唯一的方法
我真的很喜欢 HAProxy,但它绝不是唯一的解决方案(找到适合你的方法)

Proxy-Servers 以高可用性 (HA) 的形式让您更好地控制应用程序堆栈
您可以在 2 到 N 台后端服务器之间进行负载平衡,并丢失任意数量的后端服务器,但仍然是 运行.
您可以在一天中的任何时间安排停机时间来进行维护或部署,而不会影响您的客户。
内置健康检查轮询后端服务器并根据需要将它们从负载中取出,并在它们恢复后将它们放回原处。
HA 负载平衡的缺点通常是必须设置的规则数量,以保持会话正确或特殊情况的路由。是的,它可能会变得复杂,但在社区中有 大量 的支持并且它很容易学习。 HA 负载平衡的另一个缺点是代理服务器本身成为单点故障,但这可以通过 heartbeatd 和第二个代理服务器轻松克服。

希望这能回答您的一些问题

让您的应用程序容错的一个好方法是使用 nginx 作为您的负载平衡器。您可以进行

这样的配置
upstream some_name {
  server server_ip; 
  server server_ip2; 
};
server { 
    listen 80; 
    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For 
            $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://some_name 
     }
}

加上这个 nginx 上游对象需要进一步的标志,例如 max_fails=10 fail_timeout=20s 并且足够聪明,可以知道一个服务器是否出现故障,它会切换到下一个在线服务器等等远不止于此。 请查看此 official nginx website 了解更多信息。