使用多个Nginx负载均衡器的DNS故障转移

我们的应用程序托pipe在EC2上,但是由于应用程序的性质,它需要极高的可用性。 我们有一个在Linode上运行的应用程序的图像作为故障转移

然而,做一个DNS翻转Linode将需要一些时间。 我们提出了一个减less这种停机时间的策略,但是我想就如何最好地实施这个方面提供一些build议。

该应用程序是一个ROR应用程序。 我们在EC2上运行6个前端节点,并使用Nginx作为proxy_pass的负载均衡器。

然而,我们在Linode上的负载平衡器不能平衡到Linode节点,而是平衡到EC2节点。 这是因为我们的DNSlogging中有我们的Linode LB的IP。 所以当一个客户端连接时,DNS循环到EC2或者Linode LB。 所select的LB将把请求redirect到EC2上的一个节点。 在EC2中断的情况下,我们只需要改变Linode LB的configuration,以平衡自己的节点(加上其他的东西,比如数据库翻转等等)。

我知道这对性能不是很好,但可靠性对我们来说更重要。

为了问题,我们在出于任何原因而出现问题时,Linode LB无法连接到EC2。 在这种情况下,Nginx会返回502错误的网关错误,这不会导致客户端使用DNS故障转移。

我们希望有一种方法来迫使客户在出现这种情况时使用DNS后备。 有没有办法做到这一点? 最好使用Nginx,但是如果不支持这种解决scheme,则会考虑其他解决scheme。

谢谢!

我喜欢这种方式,这是我最喜欢的,如果你在旧金山,我会给你买一瓶啤酒!

两个答案,首先对你的502问题,你应该添加到你的nginx,所以如果有至less有一些有能力的节点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]; 

其次,对于你“回到DNS”,你需要稍微改变方法。 对于这些设置,我所做的通常是将DNS一直拉回到应用程序节点本身,从而通过负载平衡器和端节点testing连接。 作为奖励,您可以将DNS与您的应用程序集成在一起,并在应用程序死机时closuresDNS服务器。 这里的想法是让客户的DNS请求“testing”整个path的工作,而不仅仅是连接到LB. 显然你不能使用NGINX,我已经使用了pf规则,你可以在iptables中做同样的事情。 您只需将循环请求循环到后端节点并在后端服务器上运行绑定即可。 这个想法是确保你有多个NS条目,每个“LB”你有。 客户端将负责testing每个NSlogging,在testing中,我已经完成了平均故障转移时间为2秒,并且它适用于我们查看的99%的操作系统。 让我知道,如果这是有道理的。 在客户端发出第一个TCP请求后,它将比任何尝试恢复的场景都更好。

有了这个解决scheme,我已经build立了根据Gomez和Keynote监控保持100%可用性的站点。 正如你已经提到的那样,它可能会导致一些初步的性能损失的DNS查找,但该网站总是工作,客户喜欢(如我的传呼机)。