URL単位の負荷分散が出来ない
同じ仮想IPアドレス宛ての通信であっても、URL単位で異なるサーバーに振り分ける事が出来ます。URL単位の負荷分散は、管理者が違う等の理由で、異なるサーバーにコンテンツが配置されている場合に使われます。
本項では、URL単位の負荷分散が正常に出来ない時に、考えられるトラブルについて説明します。
現象
sales1、sales2サーバーは管理者A、public1、public2サーバーは管理者Bが管理しており、異なるコンテンツが配置されている。このため、example.com/sales、example.com/publicというURLを使って、それぞれのサーバーにURL単位で、コネクション毎に負荷分散する設定をした。
しかし、salesに通信した後、リンクをクリックしてpublicに移動しようとしても、通信出来たり出来なかったりする。
切り分け方法
sales側に通信した後、すぐにリンクをクリックしてpublicと通信出来ない事を確認します。
その後、少し時間を置いてリンクをクリックし、public側と通信出来る事を確認します。
原因
暫くすると通信出来る場合は、キープアライブによりコネクションが維持されており、URL単位の負荷分散が正常動作していない可能性があります。
HTTPによる通信で、Webページに沢山の画像があった場合、画像を転送する度にコネクションを張ると、何度も3ウェイハンドシェイク等を行う必要があり、非効率です。
キープアライブは、これを1つのコネクションで済ませるようにします。
キープアライブが有効な場合、通信がなくなってから一定時間はコネクションを終わらせません。このため、負荷分散装置では通信が継続していると判断し、同じサーバーに振り分けしてしまいます。
キープアライブによりコネクションを継続する時間のデフォルトは、Apacheで5分間、IISで2分間です。
対処
ApacheやIISでは、デフォルトでキープアライブが有効です。このため、同一コネクションにならないよう、キープアライブを無効にします。
キープアライブが無効になると、1ファイル転送毎にコネクションが終わるため、salesにアクセスした後、すぐにリンクをクリックしてもpublicと通信可能です。
又、負荷分散装置によっては、サーバーとの間で常時コネクションを張っておき、通信があるとそのコネクションを利用して負荷分散する機能を持っています。
このような機能を有効にすると、パソコンからの3ウェイハンドシェイクがなくても、既にあるサーバーとのコネクションを利用して、URL単位に異なるサーバーに振り分けが可能です。つまり、キープアライブを有効にしたままでURL単位に負荷分散出来る可能性があります。
- 応用編「サーバー負荷分散」
- トラブル対応「同一サブネット内で負荷分散不可」