【问题标题】:Do connection string DNS lookups get cached?连接字符串 DNS 查找是否被缓存?
【发布时间】:2009-07-01 13:00:03
【问题描述】:

假设如下:

我在 database.mywebsite.com 上设置了一个数据库,它解析为 IP 111.111.1.1,从我们网络上的本地 DNS 服务器运行。 p>

我有无数的 ASP、ASP.NET 和 WinForms 应用程序,它们使用以 database.mywebsite.com 作为服务器名称的连接字符串,所有这些都从内部网络运行。

然后运行数据库的机器死掉了,我切换到一个 IP 为 222.222.2.2 的新机器。

因此,我将 database.mywebsite.com 的 DNS 更新为指向 222.222.2.2

所有应用程序和运行它们的计算机是否都缓存了旧的解析 IP 地址?

我假设他们会有。

任何类似于 “每次切换盒子时不要更改 IP” 的建议都不太受欢迎,因为我无法控制这方面的情况,很遗憾。我们目前正在使用盒子的机器名称,它每次死机时都会更改,并且所有应用程序等都必须使用新的机器名称进行更新。好痛。

【问题讨论】:

    标签: sql-server database caching dns connection-string


    【解决方案1】:

    即使 DNS 没有缓存到计算机本地,它也可能会缓存在计算机和名称服务器之间的 DNS 链上的某个位置,至少会缓存一小段时间。我的理解是这种情况通常会通过 IP 接管来处理,您只需将新机器设为 111.111.1.1。

    可能是服务器故障的问题。

    【讨论】:

      【解决方案2】:

      我猜您正在寻找 DNS TTL(生存时间)。在我看来,应用程序最多可以将 IP 缓存为 TTL 的值。但是,我担心某些应用程序/技术实际上可能会将其缓存更长时间(在我看来完全错误)

      【讨论】:

      • 支持 DNS TTL 的应用程序非常很少见(原因之一是这个 TTL 不能从普通的 getaddrinfo()... 获得)。大多数应用程序都会“固定”。一旦名称被解析,就假定它永远不会改变。
      【解决方案3】:

      每台机器都会缓存ip地址。

      缓存的时间长度是 TTL(生存时间)。这是您的 DNS 服务器上的一个设置,如果您将其设置得非常低,例如 5 分钟,那么您将显示启动并运行得相当快。有点小技巧,但它应该可以工作。

      【讨论】:

      • 不切实际的观点。只有 DNS 服务器(例如递归缓存)支持 TTL,大多数应用程序不支持。它们保留旧值,直到重新启动/重新加载。
      【解决方案4】:

      是的,其他 cmets 是正确的,因为控制它的是为主机名 database.mywebsite.com 设置的 DNS TTL。

      在切换到辅助地址后,如果您的主地址 (111.111.1.1) 出现故障,您必须决定愿意等待的最长时间。较低的设置将使您的恢复时间更快,但也会增加 DNS 服务器的负载和带宽,因为客户端将不得不重新查询它以更频繁地刷新其缓存。

      您可以通过 cmd 提示符中的 -d 选项使用 nslookup 来查看您正在查询的 DNS 服务器的默认 TTL 时间和剩余 TTL 时间。

      %> nslookup -d google.com

      【讨论】:

      • 没有。 TTL 与(大多数)应用程序中的缓存完全无关。
      【解决方案5】:

      你应该假设他们被兑现有两个之前没有明确提到的原因:

      1- 许多“现代”版本的操作系统系列都进行 DNS 缓存。 2- 许多应用程序执行 DNS 缓存或对实时连接和/或打开新连接的错误/故障检测很差。这可能包括您的数据库客户端。

      此外,这可能没有很好的记录。我做了一些谷歌搜索,发现这个是 MySQL 的:

      http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-connecting-connection-string.html#connector-net-programming-connecting-errors

      它没有清楚地解释它在这方面的行为。

      【讨论】:

        【解决方案6】:

        我在一个禁用应用程序池回收功能并连续运行数周的网站上遇到了类似的问题。有时,群集 SQL Server 框会重新启动,并且由于某种原因,我的 SqlConnection 没有重新连接。我收到了错误:

        与网络相关或特定于实例的 建立时发生错误 连接到 SQL Server。服务器 未找到或无法访问。 验证实例名称是否为 正确,并且 SQL Server 是 配置为允许远程 连接。 (提供者:命名管道 提供者,错误:40 - 无法打开 连接到 SQL Server)

        服务器在那里 - 并且正在运行 - 事实上,如果我只是回收应用程序池,该应用程序会正常工作 - 但我不喜欢回收应用程序池!

        连接池中的连接不知何故使用了旧的连接信息,而这可能是旧的 IP 地址。这似乎与发帖者的问题非常相似,它似乎是缓存的 DNS 信息,因为一旦清除了某种缓存,应用程序就可以正常工作。

        这就是我解决它的方法 - 通过强制重新创建池中的所有连接:

        Try
            ' Example: SqlDependency, but this could also be any SqlConnection.Open call
            Dim result As Boolean = SqlClient.SqlDependency.Start(ConnStr)
        Catch sqlex As SqlClient.SqlException
            SqlClient.SqlConnection.ClearAllPools()
        End Try
        

        代码示例只是简化的基础知识 - 它应该根据您的情况进行调整!

        【讨论】:

          【解决方案7】:

          DNS 被缓存,但是对于任何解析到错误 ip 地址的服务器,您可以更新服务器的 HOSTS 文件,并且应该立即更新 ip。如果您访问数据库服务器的服务器数量有限,这可能是一个解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多