2010-10-08 83 views
2

我在IIS上有一个C#web服务,就像代理一样。我的问题是,当一个后端服务器的IP地址发生变化时,Windows DNS缓存正确更新(使用nslookup进行检查),但该服务继续对旧IP进行约40分钟的一些请求。DNS故障转移需要时间

我注意到,如果我5分钟内停止点击代理,但它不是一个可以接受的解决方案,故障切换应该是自动的。

有什么想法?

在此先感谢。

+0

你是如何查找你的Web服务中的DNS条目?通常,您不希望在每个请求中都访问DNS服务器,因此这可能不是执行故障转移的最佳方式。什么原因导致后端服务器的IP地址发生变化? – 2010-10-08 18:37:15

+0

我同意你的观点,使用DNS进行故障转移是一个坏主意。不幸的是,它是在后端服务器上完成的,我无法控制它。由于后端服务器从一个数据中心移动到另一个数据中心,IP地址发生更改。 – benfle 2010-10-08 18:46:55

+0

你能否发布错误解析IP的代码? – 2010-10-08 19:13:36

回答

0

您是否尝试将负面缓存超时设置为零?我知道你说dns缓存已经正确更新了,但是如果你的dns缓存过期了,你可能会被卡住,直到它过期。

在Windows XP中,你将它设置在注册表中:

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\的dnscache \参数 DWORD:MaxNegativeCacheTtl 值:0

有没有在这个玩Vista或Windows 7.

我很想看到无法解析后端服务器地址的代码......想知道代码本身中是否有东西保留在旧IP上。

+1

否定缓存是如何长期存储_negative_(即丢失)答案。它对_changed_答案没有影响。 – Alnitak 2010-10-10 10:50:51

+0

你是对的,我的错误 – 2010-10-11 15:48:38

0

如果您使用的是构建在windows http组件上的东西,您会发现该组件会挂接到已解析的ip上,作为性能“优化”。一旦它有一个名称/ IP匹配,它会挂在它的字面上DAYS。它完全忽略了TTL。

你为什么用空闲的延迟来克服这个问题的唯一原因是因为组件在你的特定用法中被回收。

这是一个已知的问题。 MS项目经理“有点”承认这一点。但是,它从来没有被修复过。

我们写了自己的替代品。

+0

我怀疑这样的事情,希望有人能帮我指出来。所以我无法避免“脏”的补丁......? – benfle 2010-10-09 18:13:42

2

尝试在你的服务器的Web.config设置这样的:

<configuration> 
    <system.webServer> 
     <httpProtocol allowKeepAlive="false" /> 
    </system.webServer> 
</configuration> 

这告诉服务器在it can't send back the Connection: Keep-Alive header。为每个请求创建新的连接,并以某种方式强制它更新到新的IP。当Keep Alive保持启用状态时,它将持续很长时间继续与旧IP的共享连接。