我们正在设置HAProxy来平衡我们的应用程序(在IIS上运行的ASP.NET MVC 3)。 我们希望我们的stream程不需要定期维护以进行部署。 我试图找出正确的方法来做一个“跷跷板”的方法,只在一次为新的请求提供一个版本的应用程序。 以下是我到目前为止所做的:
通过重新加载configuration从HAProxy删除前半部分的服务器:
$ sed -i 's/web01.*/& disabled/' /etc/haproxy/haproxy.cfg $ sed -i 's/web02.*/& disabled/' /etc/haproxy/haproxy.cfg $ /etc/init.d/haproxy reload
更新每个向下实例的应用程序,并用curl戳它们来加热它们。
把上半场带回去,把下半场拿下来:
$ sed -i 's/\(web01.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg $ sed -i 's/\(web02.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg $ sed -i 's/web03.*/& disabled/' /etc/haproxy/haproxy.cfg $ sed -i 's/web04.*/& disabled/' /etc/haproxy/haproxy.cfg $ /etc/init.d/haproxy reload
下半场重复第2步。
带回下半场 :
$ sed -i 's/\(web03.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg $ sed -i 's/\(web04.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg $ /etc/init.d/haproxy reload
通过上面描述的方法,现有的请求将优雅地继续使用应用程序的V1,然后V2来处理任何后续的请求。 我确定这是因为它会大大减less服务两个不同版本的机会。
但是,使用sed来replaceconfiguration看起来像一个黑客。 这是我想用的其他select:
使用UNIX套接字来做同样的“跷跷板”方法。 但是,由于UNIX套接字一次只能与一台服务器一起工作,并且部署每个服务器可能需要几秒钟的时间,因此可能导致在V2处使用HTML,而在V1中使用JavaScript。 如果有的话,向后兼容的代码比向前兼容要容易得多。 所以使用这种方法似乎可能无法正常工作。
使用UNIX套接字或运行状况检查在整个服务器上使用滚动部署。 在我的研究过程中,我发现这种方法是最受欢迎的。 但是,这会导致与UNIX套接字相同的问题 – 不得不向前写兼容的代码。
也许我完全在这个复杂化或缺less明显的东西…
所以,你担心一些资产没有相互排版版本。 这不是真正的负载均衡问题,而是代码问题。 通常的做法是使用参数来“资源化”资产。 例如,my.html可能包含:
<link rel="stylesheet" href="http://foo.com/css/blah.css?v123">
你应该在你的代码中有一个全局设置,你在发布时增加。 无论如何,您需要强制重新加载资源客户端,因为它们将被caching到那里。