2009-07-01 7 views
2

は、次のように仮定します接続文字列DNSルックアップはキャッシュされますか?

私たちのネットワーク上のローカルDNSサーバーから実行しているIP 111.111.1.1、に解決database.mywebsite.comに設定したデータベースを、持っています。

database.mywebsite.comを使用して、すべてが内部ネットワークから実行されている接続文字列を使用する無数のASP、ASP.NETおよびWinFormsアプリケーションがあります。

データベースを実行しているボックスが消えて、222.222.2.2のIPを持つ新しいボックスに切り替わります。

database.mywebsite.comのDNSを222.222.2.2に更新しました。

それらを実行しているすべてのアプリケーションとコンピュータが、解決済みの古いIPアドレスをキャッシュしますか?

私は彼らが持っていると仮定しています。

の行に沿った提案は、「あなたがスイッチボックスごとにIPを変更しない」は残念なことにこの状況を制御できないのであまり歓迎していません。私たちは現在、ボックスのマシン名を使用しています。このマシン名は、死ぬたびに変更され、すべてのアプリケーションなどを新しいマシン名で更新する必要があります。それは痛い。

答えて

2

DNSがマシンのローカルにキャッシュされていなくても、マシンとネームサーバーの間のDNSチェーンのどこかにキャッシュされている可能性があります。私の理解では、このような状況は通常、新しいマシン111.111.1.1を作成するIPテイクオーバーで処理されます。

おそらくserverfaultの質問です。

1

あなたはDNS TTL(Time To Live)を探しています。私の意見では、アプリケーションは最大でTTLの値でIPをキャッシュするかもしれません。しかし、私はいくつかのアプリケーション/技術が実際にそれを長くキャッシュするかもしれません(私の意見では完全に間違っています)。

+0

DNS TTLを尊重するアプリケーションは非常にまれです(このTTLが通常のgetaddrinfo()から利用できない理由の1つです)。ほとんどのアプリケーションは「固定」します。名前が解決されると、決して変更されないものとみなされます。 – bortzmeyer

1

各マシンはIPアドレスをキャッシュします。

キャッシュされる時間は、TTL(Time To Live)です。これはあなたのDNSサーバー上の設定です。5分という非常に低い値に設定した場合、あなたはきちんと動作していると表示されます。ハックのビットが動作するはずです。

+1

非現実的なビュー。 DNSサーバ(再帰キャッシュなど)のみがTTLを尊重しますが、ほとんどのアプリケーションではそうではありません。それらは再起動/再ロードされるまで古い値を保持します。 – bortzmeyer

1

はい、他のコメントは、これを制御するものがホスト名database.mywebsite.comのDNS TTLセットであるという点で正しいです。

セカンダリアドレスに切り替えた後で、プライマリアドレス(111.111.1.1)に障害が発生した場合は、最大待機時間を決定する必要があります。設定値を低くすると回復時間が短縮されますが、DNSサーバーの負荷と帯域幅が増加します。これは、クライアントがキャッシュを頻繁にリフレッシュする必要があるためです。

nslookupを使用すると、cmdプロンプトの-dオプションを使用して、照会するDNSサーバーのデフォルトのTTL時間と残りのTTL時間を確認できます。

 
%> nslookup -d google.com 
+0

いいえ.TTLは(ほとんどの)アプリケーションのキャッシングとはまったく関係ありません。 – bortzmeyer

0

あなたは、彼らがはっきりする前に言及していない二つの理由のために換金されていることを前提とすべきである:OSファミリーの

の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

これは明らかに、この点でその動作を説明していません。

0

私は、アプリケーションプールのリサイクル機能を無効にし、数週間何週間も実行するWebサイトで同様の問題が発生しました。場合によっては、クラスタ化された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を直ちに更新する必要があります。データベースサーバーにアクセスするサーバーの数が限られている場合は、これが解決策になります。