DNS GoogleはラウンドロビンDNSをサポートしなくなりました



以前は、複数のサーバーに負荷を分散する必要がある場合、DNSゾーンに同じ名前の複数のAレコードを登録し、すべてが機能していました。 顧客のリクエストはほぼ均等に分配されました。 このバランス方法は、特に静的コンテンツの配信に関連していました。



最近、クライアントから問題について連絡がありました。

ChNNでは、さまざまなフラッシュドライブのダウンロードで問題が始まりました-ファイルは数分間ダウンロードされました。



調査により、いずれかの配信サーバーの静的負荷が不均一になっていることが明らかになりました。他のすべてのサーバーよりも多くのトラフィックをネットワークに与えていました。 そして、あるサーバーから別のサーバーに定期的に負荷が渡されました。



次のようなものがDNSゾーンに登録されました。



 192.168.10.1のcdn.exampe.com
 192.168.12.1のcdn.exampe.com
 192.168.15.1のcdn.exampe.com
 192.168.16.1のcdn.exampe.com
 192.168.11.1のcdn.exampe.com
 192.168.19.1のcdn.exampe.com




以前は、クライアントはラウンドロビンアルゴリズムを使用してDNSサーバーから応答を受け取りましたが、問題を検索すると完全に予期しない結果になりました。



8.8.8.8のDNSサーバーへの要求は、常に同じアドレスを返しました。

ラウンドロビンなし。 TTLが終了すると、返されるアドレスは変更される場合がありますが、変更されない場合があります。



善良な企業の技術サポートは、「あなたが必要としているものをあなたよりもよく知っている」というスタイルで応えました。



DNSラウンドロビンは、負荷分散の効果的な手段ではありませんでした。今日では、アプリケーションはIPv6サポートのためにgethostbynameからgetaddrinfoに切り替えています。



homepage.ntlworld.com/jonathan.deboynepollard/FGA/dns-round-robin-is-useless.html



www.tenereillo.com/GSLBPageOfShame.htm



daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs





RRDNSはうまく機能しなかったため、さらに悪化します。 そして、IPv6が来ると、本当に悪くなります...

これは善良な企業の意見であり、ロードスケジュールは納得できません。



問題をさらに調査すると、問題はGoogleだけでなく、ゾーンがホストされているHetznerにもあることがわかりました。



問題の回数:

各Googleサーバーは、ゾーンにサービスを提供するDNSサーバーから受信したものとまったく同じ応答を送信しますが、サーバー内の何も変更しません。 各サーバーが独自のバージョンのシーケンスを受信した場合、その後のリクエストでは、Googleはランダムな順序でアドレスを提供するように見えますが、実際にはこれらの回答はランダムに選択されたサーバーから提供されます。



問題番号2:

問題のあるDNSゾーンがホストされているHetznerは、ホストのアドレスのリストを変更せずに返し始めました。

そして最終的に、すべてのGoogleサーバーが同じアドレスのシーケンスを持つことが判明しました。



TP Hetznerからの応答も喜ばれませんでした。



この機能は、DNSリゾルバーでは有効になっていません。 そのような負荷分散を使用する場合は、独自のサーバーをセットアップして使用する必要があります。







もちろん、有料のCDNサービスプロバイダーに頼るか、特定のサーバーを指すコンテンツへのリンクを生成するようにプログラマーに指示することができます(もちろん、各リクエストに対して、リンク内のサーバーがランダムに負荷を分散します)。

しかし、管理者は通常、問題を迅速に解決することを要求するため、問題はすぐに機能します。

そうして初めて、より良い解決策を探すことができます。



nginxツールを使用して、リダイレクトを特定のサーバーに返します。

split_clientsディレクティブを使用し、サーバーの能力に応じて割合を分配し、各サーバーにこのような構成を記述します。

当然、hostname cdn1.example.com; 各サーバーに固有の名前を指定します。



http { split_clients "${remote_addr}AAA" $variant { 15% 1; 15% 2; 15% 3; 15% 4; 15% 5; 15% 6; * 7; } server { listen 80; server_name cdn.example.com; return 302 http://cdn$variant.example.com/$request_uri; } server { listen 80; server_name cdn1.example.com; location / { root /srv/www/cdn.example.com/htdocs; } }
      
      







その結果、nginxはサーバーへのユーザーリダイレクトを返します。これは、クライアントのIPアドレスのハッシュに基づいて決定されます。

これがそのような負荷分散です。



PS:ゾーンをHetznerからYandexに移動しました



All Articles