私は現在、負荷分散にDNSラウンドロビンを使用しています。レコードは次のようになります(TTLは120秒です)。
;; ANSWER SECTION:
orion.2x.to. 116 IN A 80.237.201.41
orion.2x.to. 116 IN A 87.230.54.12
orion.2x.to. 116 IN A 87.230.100.10
orion.2x.to. 116 IN A 87.230.51.65
すべてのISP /デバイスがそのような応答を同じ方法で扱うわけではないことを学びました。たとえば、一部のDNSサーバーは、アドレスをランダムにローテーションするか、常に循環させます。最初のエントリを伝播するだけのものもあれば、IPアドレスを調べてどちらが最適か(地域的に近い)かを判断しようとするものもあります。
ただし、ユーザーベースが十分に大きい場合(複数のISPに分散している場合など)、バランスはかなり良好です。負荷の高いサーバーから低いサーバーへの差異は、15%を超えることはほとんどありません。
ただし、システムにサーバーを追加しているという問題があり、すべてが同じ容量であるとは限りません。
現在、1 Gbpsサーバーしかないのですが、100 Mbpsサーバーと10 Gbpsサーバーも使用したいと考えています。
したがって、私が欲しいのは、重みが100の10 Gbpsのサーバー、重みが10の1 Gbpsサーバー、および重みが1の100 Mbpsサーバーを導入することです。
以前にサーバーを2回追加して、より多くのトラフィックをそれらにもたらしました(これはうまくいきました。帯域幅はほぼ2倍になりました)。しかし、10 Gbpsサーバーを100回DNSに追加するのは少しおかしいです。
そこでTTLの使用を考えました。
サーバーAにTTLを240秒、サーバーBに120秒しか与えない場合(これは、ラウンドロビンに使用するのに最低限必要な時間です。より低いTTLが指定されている場合(多くのDNSサーバーが120に設定されているため))。私はこのようなことが理想的なシナリオで起こるべきだと思います:
First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds
Second 120 seconds
50% of requests still have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds
Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B (from the 50% of Server A that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec
Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...
ご覧のとおり、これは予測がかなり複雑になり、実際にはこのように機能しないことは確かです。しかし、それは間違いなくディストリビューションに影響を与えるはずです!
重み付けされたラウンドロビンが存在し、ルートサーバーによって制御されるだけであることは知っています。応答時にDNSレコードを循環し、重み付けに対応する設定された確率でDNSレコードを返します。私のDNSサーバーはこれをサポートしておらず、私の要件はそれほど正確ではありません。重量が完全にかからない場合は問題ありませんが、正しい方向に進むはずです。
TTLフィールドを使用すると、よりエレガントで簡単なソリューションになると思います。また、動的にこれを制御するDNSサーバーを必要とせず、リソースを節約できます。これは、DNSの負荷分散とハードウェアの負荷分散の要点です。
私の質問は次のとおりです。DNSレコードのTTL属性を使用してラウンドロビン分散を重み付けするためのベストプラクティス/方法/経験則はありますか?
編集:
システムはフォワードプロキシサーバーシステムです。帯域幅の量(要求ではない)は、イーサネットを備えた単一のサーバーが処理できる量を超えています。そのため、帯域幅を複数のサーバーに分散するバランスソリューションが必要です。DNSを使用する以外の方法はありますか?もちろん、ファイバーチャネルなどを備えたロードバランサーを使用することもできますが、コストはばかげており、ボトルネックの幅のみを増やし、それを排除することもできません。私が考えることができるのはエニーキャスト(エニーキャストかマルチキャストか)IPアドレスだけですが、そのようなシステムをセットアップする手段がありません。