高可用性复制服务器,tomcat会话丢失。 Firefox和Chrome使用60个segs作为TTL,不尊重DNS定义的TTL

时间:2016-04-12 09:29:49

标签: google-chrome http firefox dns high-availability

我的DNS服务器上定义的http服务有4台服务器:

app.speednetwork.in.       IN      A       63.142.255.107
app.speednetwork.in.       IN      A       37.247.116.68
app.speednetwork.in.       IN      A       104.251.215.162
app.speednetwork.in.       IN      A       192.121.166.40

对于所有这些DNS服务器指定一个超过10小时的TTL(生存时间):

$ttl 38400

speednetwork.in。 IN SOA plugandplay.click。 info.plugandplay.click。 (                         1454402805                         3600                         3600                         1209600                         38400)

Firefox会忽略TTL并在每60秒后创建一个新的DNS查询,如图所示 about:config - > network.dnsCacheExpiration 60 and about about:networking - > DNS。 Chrome在这里显示chrome:// net-internals / #dns一个正确的缓存dns条目,超过10个小时,直到Expired:

    apis.google.com IPV4 216.58.210.174 2016-04-12 11:07:07.618 [Expired]
app.speednetwork.in IPV4 192.121.166.40 2016-04-12 21:45:36.592

但忽略此条目,每分钟重新查询dns,如https://groups.google.com/a/chromium.org/forum/#!topic/chromium-discuss/655ZTdxTftA所述,并在chrome:// net-internals /#events

上看到

结论和问题:每分钟两个浏览器再次查询dns,从DNS上配置的4接收新IP,转到新的IP /服务器并丢失TOMCAT会话。

作为配置,每个用户浏览器都不是一个选项,我的问题是:

1)我可以使用其他一些DNS配置来实现高可用性吗?

2)我可以使用一些http标头来指示浏览器继续使用同一天的同一IP /服务器吗?

2 个答案:

答案 0 :(得分:1)

DNS TTL值是可以缓存信息的最长时间。没有最短时间,也没有任何缓存要求。您描述的浏览器行为完全在DNS规范中,浏览器没有任何错误。如果您的服务器解决方案依赖于客户端记住DNS查找一段时间,那么您需要重新设计它。正如您已经发现的那样,它不起作用。

如今构建Tomcat服务器的负载平衡集群几乎不是火箭科学,您可以轻松地自行搜索解决方案。

答案 1 :(得分:0)

Keep-Alive标头可以成功。使用65秒的大值,浏览器会在所有会话中重复使用http连接,并且不会尝试新的DNS查询。在我的应用程序中也是如此,每分钟都有一个与服务器挂接的XMLHttpRequest连接,也许你需要更大的值。 Apache默认值为5秒。

直接使用tomcat:

response.setHeader(" Keep-Alive"," timeout = 65");

在tomcat前面使用apache(和mod_ajp):

nano /etc/apache2/apache2.conf:

{{1}}

但这不是一个完整的解决方案。断开http连接关闭后,或在几个并发服务器请求下,每个服务器请求都在多个服务器上打开,因此结果不在同一服务器会话下。 最后,我解决了这个实现CORS(跨域),修复服务器以使用(app1,app2等)并继续使用它直到此服务器失败。 服务器和客户端上的CORS标头让我可以交换数据,无论初始文件下载是来自应用程序。 (IE另一个域名)。