2009-07-01 49 views
2

假設如下:連接字符串DNS查找是否被緩存?

我有一個數據庫建立在database.mywebsite.com,其解析爲IP 111.111.1.1,從我們的網絡上的本地DNS服務器上運行。

我有使用利用database.mywebsite.com作爲服務器名稱連接字符串無數ASP,ASP.NET和WinForms應用程序,所有來自內部網絡中運行。

然後運行數據庫的盒子就死掉了,我切換到IP爲222.222.2.2的新盒子。

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

運行它們的所有應用程序和計算機是否緩存了舊的解析IP地址?

我假設他們會有。

任何建議沿線「沒有你的IP更改每次你切換框」不太受歡迎,因爲我不能控制這方面的情況,不幸的是。我們目前正在使用盒子的機器名稱,每當它死亡時都會更改,所有的應用程序等都必須使用新的機器名稱進行更新。好痛。

回答

2

即使DNS並未緩存到本機的本地,它也可能會緩存在機器和名稱服務器之間的DNS鏈的某處,至少在一段時間內。我的理解是,這種情況通常會通過IP接管來處理,您只需製作新機器111.111.1.1即可。

可能是serverfault的問題。

1

您正在尋找DNS TTL(生存時間)我想..在我看來,應用程序可能會緩存IP至多爲TTL的值。然而,恐怕有些應用程序/技術可能實際上將其緩存時間更長(在我看來,這完全是錯誤的)

+0

尊重DNS TTL的應用程序非常罕見(其原因之一是此TTL不能從正常的getaddrinfo()...獲得)。大多數應用程序都會「釘住」。一旦名字解決了,就認爲它永遠不會改變。 – bortzmeyer 2010-03-12 08:04:53

1

每臺機器都會緩存ip地址。

它被高速緩存的時間長度是TTL(生存時間)。這是你的DNS服務器上的一個設置,如果你把它設置得非常低,比如說5分鐘,那麼你顯示的速度很快並且運行得很快。有點黑客,但它應該工作。

+1

不切實際的看法。只有DNS服務器(例如遞歸緩存)才能夠遵守TTL,而大多數應用程序不會。它們保持舊值直到重新啓動/重新加載。 – bortzmeyer 2009-07-02 10:34:13

1

是的,其他評論是正確的,因爲控制這個的是爲主機名database.mywebsite.com設置的DNS TTL。

在切換到備用地址後,如果主地址(111.111.1.1)出現故障,您必須決定您願意等待的最長時間。較低的設置將爲您提供更快的恢復時間,但也會增加DNS服務器的負載和帶寬,因爲客戶端將不得不重新查詢以更頻繁地刷新其緩存。

您可以在cmd提示符中使用-d選項來使用nslookup,以查看您正在查詢的DNS服務器的默認TTL時間和剩餘TTL時間。

 
%> nslookup -d google.com 
+0

不,TTL對於(大多數)應用程序中的緩存完全不相關。 – bortzmeyer 2010-03-12 08:05:39

0

你可以認爲他們是爲兌現之前沒有明確提到的兩個原因:

1-許多「現代」 OS家庭的版本做DNS緩存。 2-許多應用程序執行DNS緩存,或者在實時連接和/或打開新連接時檢測到錯誤/故障。這可能會包含您的數據庫客戶端。

此外,這可能沒有很好的記錄。我做了一些google搜索,發現這對MySQL:

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

它沒有明確說明其在這方面的行爲。

0

我有一個類似的問題,與一個網站,禁用應用程序池回收功能,並運行數週。有時,羣集SQL Server框會重新啓動,出於某種原因,我的SqlConnection沒有重新連接。我得到的錯誤:

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to 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 

的代碼示例只是熬濃基礎 - 它應該是調整了您的情況!

0

DNS獲取緩存,但對於解析爲錯誤的IP地址的任何服務器,您可以更新服務器的HOSTS文件,並且應該立即更新IP。如果您訪問數據庫服務器的服務器數量有限,則這可能是一種解決方案。