sma*_*ieu 6 domain-name-system nginx failover
我们的应用程序托管在 EC2 上,但是由于应用程序的性质,它需要极高的可用性。我们有一个在 Linode 上运行的应用程序图像作为故障转移。
但是,对 Linode 进行 DNS 转换需要一些时间。我们想出了一个策略来最大限度地减少停机时间,但我想就如何最好地实施它提供一些建议。
该应用程序是一个 ROR 应用程序。我们在 EC2 上运行 6 个前端节点,并使用 Nginx 作为带有 proxy_pass 的负载均衡器。
然而,我们在 Linode 上的负载均衡器不会平衡到 Linode 节点,而是平衡到 EC2 节点。这样我们的 DNS 记录中就有了 Linode LB 的 IP。因此,当客户端连接时,DNS 循环到 EC2 或 Linode LB。然后,所选的 LB 会将请求重定向到 EC2 上的节点之一。在 EC2 中断的情况下,我们只需更改 Linode LB 的配置以平衡到它自己的节点(加上其他东西,如 DB 翻转等)。
我知道这对性能来说不是很好,但可靠性对我们来说更重要。
问题是,无论出于何种原因,Linode LB 都无法连接到 EC2。在这种情况下,Nginx 将返回 502 Bad Gateway 错误,这不会导致客户端使用 DNS 故障转移。
我们希望有一种方法可以强制客户端在出现这种情况时使用 DNS 回退。有没有办法做到这一点?最好使用 Nginx,但如果它不支持此功能,则会考虑其他解决方案。
谢谢!
我喜欢这种方法,它是我最喜欢的,如果你在旧金山,我会给你买啤酒!
两个答案,首先是你的 502 问题,你应该把它添加到你的 nginx 中,所以如果至少有一些有能力的节点,nginx 将重试(默认情况下,在 502 上它只会放弃):
http://wiki.nginx.org/HttpProxyModule#proxy_next_upstream
proxy_next_upstream
syntax: proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
Run Code Online (Sandbox Code Playgroud)
其次,为了“回到 DNS”,您需要稍微改变方法。对于这些设置,我通常所做的是将 DNS 一直拉回应用程序节点本身,这会测试从负载均衡器到终端节点的所有连接。作为奖励,您可以将 DNS 与您的应用程序集成,并在应用程序死机时关闭 DNS 服务器。这里的想法是让客户端 DNS 请求“测试”整个路径是否有效,而不仅仅是与 LB 的连接。显然你不能为此使用 NGINX,我为此使用了 pf 规则,你可以在 iptables 中做同样的事情。您只需将请求循环到后端节点并在后端服务器上运行绑定。然后的想法是确保您有多个 NS 条目,每个“LB”对应一个。客户端将负责测试每个 NS 记录,在测试中,我完成的平均故障转移时间为 2 秒,它适用于我们查看的 99% 的操作系统。让我知道这是否有意义。它比在客户端已经发出第一个 TCP 请求后尝试恢复的任何方案都更有效。
根据 Gomez 和 Keynote 监控,我使用此解决方案构建了保持 100% 可用性的站点。正如您已经提到的,它可能会导致 DNS 查找的一些初始性能损失,但该站点始终有效并且客户喜欢它(就像我的寻呼机一样)。
| 归档时间: |
|
| 查看次数: |
2367 次 |
| 最近记录: |