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に移動しました

Source: https://habr.com/ru/post/J282638/


All Articles