6

ご存知のように、Google には複数の IP アドレスがあります。ウェブサイトhttps://toolbox.googleapps.com/apps/dig/#A/google.com@8.8.8.8を使用すると、Google の複数の IP アドレスが生成されます。

次のコマンドを実行すると、シナリオが異なります。

gyan@localhost:~/codes/java/net$ dig google.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11777
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;google.com.            IN  A

;; ANSWER SECTION:
google.com.     269 IN  A   216.58.220.46

;; Query time: 0 msec
;; SERVER: 10.100.171.1#53(10.100.171.1)
;; WHEN: Fri Nov 04 16:18:07 IST 2016
;; MSG SIZE  rcvd: 55

gyan@localhost:~/codes/java/net$ 

返された IP アドレスは 1 つだけで、上記の Web サイトによって返されたものとは異なります。この IP アドレスも時々変化しています。

しかし、amazon.com に対して dig コマンドを実行すると、次のようになります。

gyan@localhost:~/codes/java/net$ dig amazon.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55090
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;amazon.com.            IN  A

;; ANSWER SECTION:
amazon.com.     34  IN  A   54.239.26.128
amazon.com.     34  IN  A   54.239.17.7
amazon.com.     34  IN  A   54.239.25.192
amazon.com.     34  IN  A   54.239.25.208
amazon.com.     34  IN  A   54.239.25.200
amazon.com.     34  IN  A   54.239.17.6

;; Query time: 74 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Fri Nov 04 16:23:17 IST 2016
;; MSG SIZE  rcvd: 135

gyan@localhost:~/codes/java/net$ 

これらの 6 つの IP アドレスは、amazon.com で変更されることはありません。また、ウェブサイト https://toolbox.googleapps.com/apps/dig/#A/amazon.com@8.8.8.8も同じ 6 つの IP アドレスを返します。

私の疑問は、google.com の DNS ルックアップが amazon.com とどう違うのか? amazon のように複数のレコードではなく、なぜ google は 1 つのレコードしか返さないのでしょうか?

4

1 に答える 1

9

ご存知のように、Google には複数の IP アドレスがあります。

真実。しかし、それは、クライアントがそれらを複数知っている必要があるという意味ではありません。

以前は、負荷分散を実行するために、サービスが DNS クエリに複数の IP アドレスで応答することは非常に一般的でした。多くの場合、応答はランダム化されます。つまり、クライアントは、すべて同じように動作するサーバーのアドレスの大規模なプールから、いくつかのアドレスのランダムなサブセットを取得します。

DNS ベースの負荷分散は、常にハックでした。キャッシングによる問題があります。ISP の DNS リゾルバーが応答をキャッシングしている場合、多数のユーザーがすべてそれらの少数の IP アドレスに接続し、負荷分散の効果が低下します。これを回避するには、レコードの TTL を下げて、エントリがキャッシュ内に短時間留まるようにし、その後新しいクエリが実行されるようにします。たとえば、投稿したdig出力のamazon.com AレコードのTTLは34秒に設定されています。

この方法はあまりうまくいきません。TTL をさらに減らすと、小さな HTTP リクエストのレイテンシが増加します。また、DNS 負荷分散の結果は、サーバーが負荷を均一に処理することを保証しないという意味で、少し予測できません。

ただし、ネットワーク レベルで動作するロード バランサーがある場合 (リバース NAT ボックスと考えてください。1 つの IP がインターネットに面しており、トラフィックをその背後にある多数のサーバーに多重化します)、多数の接続を処理できます。アップタイムも良好で、DNS レベルで負荷分散を行う必要はありません。

そのため、接続先の Google データセンターでは DNS 負荷分散を使用していない可能性がありますが、Amazon では使用しています。

もう 1 つの質問は、ツールボックスから 8.8.8.8 をクエリすると複数のアドレスが取得されるのに、自分のマシンからクエリを実行すると 1 つのアドレスしか取得できない理由です。

まず、ツールボックスからクエリを実行する場合、DNS クエリを送信するのは Web サーバーであり、コンピューターではないことを理解することが重要です。

DNS サーバーは、異なるクライアントに同一の応答を返す必要はありません。実際には、クライアントの地理的な場所に基づいて異なる応答を返すのが一般的です。たとえば、ヨーロッパのユーザーが google.com にクエリを実行すると、米国ではなくヨーロッパのデータセンターの IP アドレスが取得されます。

この場合、DNS ジオロケーションが一部のクライアントに使用され、他のクライアントには使用されていないと思います。クエリが送信されるネットワークのサイズと、ネットワーク ロード バランサーの容量に関係している可能性があります。たとえば、ロード バランサーが 1,000,000 の同時接続を処理でき、クエリの送信元のネットワークに 100,000 の IP がある場合、DNS 負荷分散を行う必要はありません。ただし、ネットワークが大きい場合 (ツールボックスを実行しているデータセンターのサイズの例では、ネットワーク ロード バランサーが処理できない可能性があるため、DNS 負荷分散が有効になり、プールから複数のランダム IP アドレスを取得します。

注: 「ネットワーク」とは、すべてが同じ DNS リゾルバーを使用する一連のマシンを意味します。

複数の IP アドレスを返すもう 1 つの理由は、DNS ベースのフェールオーバーを行うためです。マシンの 1 つが動作を停止すると、クライアントは別のマシンに接続しようとします。しかし、これはフェイルオーバーの優れた方法ではありません。一部のアプリケーションはすべての IP アドレスを保存するとは限らず (ほとんどのブラウザーは保存すると思いますが)、DNS キャッシュが邪魔になるからです。

于 2016-11-04T15:24:04.990 に答える