web-dev-qa-db-ja.com

DNSラウンドロビン:ブラウザは、オンラインである限り、1つのIPに固執しますか?

ほとんどのブラウザがDNSサーバーから複数のAレコードを取得した場合、どのように動作しますか?到達可能である限り、1つのIPを使用しますか(IPがダウンしている場合にのみ別のIPを使用します)?または、理由もなくいつでも切り替えますか?

現在のブラウザの大半が1つのIPに固執している場合、単純なフェイルオーバーソリューションとしてはDNS-RRで十分です。

15
HiPerFreak

各ブラウザーには、ラウンドロビンDNSを処理する独自の方法があります。本日はこの問題の調査に少し時間を費やしてきましたが、実装の証拠が見つかり、ブラウザーの動作を公開するブラウザーへの回答が制限されるため、回答を更新し続けます。

Google Chrome

Google Chrome(v58を使用)は、アドレス(A、AAAA、CNAME)のすべてのホストエントリを要求し、それらを配列( address_list )に入れます。Chromeは、最初から最後の順に、各IPアドレスでソケットを開こうとします、chromeは、最速または最も近いIPを試行せず、最初のIP(上流のDNSリゾルバーによって与えられた)が最高のIPです。私のテストでは、バインドとWindows DNSサーバーはルックアップごとに異なる順序のIPを提供し、各IPの帯域幅が50/50に分割されているように見えます。この機能はchrome://net-internals/#events&q=type:SOCKET%20is:active

Curl(libcurl/7.54.0)

Curlにもこのフェイルオーバー機能がありますが、--connect-timeoutはchromeのデフォルトよりはるかに長く、chromeはすぐにフェイルオーバーしますが、Curlはフェイルオーバーしません。libcurlを使用しており、1つのIPが失敗したラウンドロビンDNSインスタンスを存続させたい場合は、 chromeですがコード内ではありません)では、この値を低く指定してください。

DEFAULT_CONNECT_TIMEOUT: これはcurlでは不可能だと思いました。

* After 149990ms connect time, move on!

両方ブラウザーで、IPはstickyではなく、DNSで指定されたTTLそして、そのttlが期限切れになると(chromeはこれを内部的に維持し、curlは各リクエストで要求します)、IP選択は上記のように毎回実行されます。

これは何を意味するのでしょうか? DNS-RRは一部のシステムでは問題ありませんが、フェイルオーバー用に設計されていません。 DNSルックアップからのすべての結果が(真の情報源)有効であり、トラフィックを処理するために利用できることを期待する必要があります。仮想フロートIP、BGP /ルーティングトリックなど、IPの可用性を保証する多くの方法がありますそれらを使用してください

IPv4のみの環境で実行されるすべてのテストは、テストに十分なインフラストラクチャが利用可能になると、デュアルスタックの結果を返します。

これらの変更はIPv6-Fallback RFC Happy Eyeballs の副作用であると推測します

Update有用な考慮事項です。RRDNSは、アプリケーションの障害ではなく、ロードバランシングのみを支援できます。ノードの1つに503がある場合、40〜60のサービスを提供します。トラフィックが503秒の場合は%。 reachableの場合、リストされたすべてのIPが有効な作業エンドポイントであると想定されます。

9
Jacob Evans

この私の質問(と回答)を参照してください: ブラウザが複数のIPを処理する方法

まもなく-ラウンドロビンDNSは可用性をまったく改善しません。ブラウザは1つのIPを選択し、応答しない場合でもそれを使用します。 (FFとクロムで確認)。

ブラウザのDNSキャッシュが期限切れになると、ホスト名が再度解決され、IPが応答されたかどうかに関係なく、プロセスが繰り返されます。

基本的なHAの場合、動的DNSまたはさまざまなIPベースのアプローチを使用できます。

編集:この動作は、アクセスできないホストが「ブラックホール」として機能する場合に発生します。ホストが代わりに着信接続を断固として拒否した場合、ブラウザは1つのIPを試し、拒否してすぐに別のIPを使用するため、かなりうまくフェイルオーバーします。

3
Sandman4

edit:HiPerFreakが教えてくれたので、私の回答を編集しています。

DNSサーバーは、指定されたホスト名に対して持っているすべてのAレコードのリストを返します。ラウンドロビンが発生するのは、リストの順序を変更する場合です。 lainが投稿したリンクは、Webブラウザがそのリストをどのように利用するかを示す良い例です。

ラウンドロビンは非常に原始的な形のロードバランシングに使用できますが、ラウンドロビンローテーションのホストの1つがダウンした場合、DNSサーバーは賢くなく、依然としてダウンしたノードのIPアドレスをリストに追加します。

2
Ryan Ries

IPを切り替えますが、フェイルオーバーソリューションではありません。

ブラウザはOSに名前解決を行わせます。たとえば、Linuxは常にIPアドレスをランダム化しますHost google.comを数回試します。 IPはランダムな順序で送られます。

0
Stone

DNSはリスト内のすべてのIPを返しますが、リストの順序を変更します。この順序はランダムではなく、1が失敗しても変更されませんが、ロードバランシングの理由で常に同じ順序でIPを返します。ブラウザがリストを受け取ったとき、私はそれが非稼働として知られていなければリストの最初を選ぶと思います。

0
laurent