例如,我在同一网络中有两台服务器,具有相同的代码/软件。如果主服务器出现故障,我希望第二个服务器成为主服务器。
我听说过以下方法:
上述方法的优点和缺点是什么?实现这一目标的最佳做法是什么?
答案 0 :(得分:1)
我对CARP不太熟悉,但我可以尝试帮助其余两个选项:
Round-Robin DNS 为您提供负载平衡,但如果服务器出现故障,它仍会收到请求(也会失败)
即:DNS www.example.com指向xxx1和xxx2
如果xxx2死亡,DNS仍将被解析为xxx2,客户端仍将尝试从中请求,因此这会带来您的失败率停机期间的一半要求(不好)
即使您在停机期间将DNS更改为仅指向x.x.x.1; DNS传播需要很长时间,您仍然会丢失请求。
在我的诚实意见中,将负载均衡器(代理服务器)放在堆栈前是唯一的方法 我非常喜欢HAProxy,但它绝不是唯一的解决方案(找到适合你的方法)
代理服务器以高可用性(HA)的形式为您提供对应用程序堆栈的更多控制权
您可以在2到N个后端服务器之间进行负载平衡,并且可以释放任意数量的服务器,并且仍在运行
您可以在一天中的任何时间安排停机时间进行维护或部署,而不是影响您的客户
内置运行状况检查可以轮询后端服务器,并根据需要将其从负载中取出,并在它们恢复后将其放回原位。
HA负载平衡的缺点通常是为了保持会话正确或路由特殊情况而必须设置的规则数。是的,它可以变得复杂,但社区中有很多的支持,并且它易于学习。
HA负载平衡的另一个缺点是代理服务器本身成为单点故障,但这可以通过heartbeatd和第二个代理服务器轻松克服。
希望这能回答你的一些问题
答案 1 :(得分:1)
使您的应用程序容错的好方法是使用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。