Windows Azure

Microsoft Azureに複数のロールをデプロイして、ロードバランサーのテストをしていると、ロードバランサーが動作していないように感じます。

  1. クライアントからの全てのリクエストが一つのインスタンスで受信される。二つ目のインスタンスは受信しない。
  2. 複数のクライアントを使用した時のみ、時々2つ目のインスタンスが呼び出される。

1つのクライアントから複数のリクエストをしても同じマシンにアクセスし続ける。

 

2つのクラインと殻リクエストをすると、1つ目のクライアントは1つ目のマシンに、2つ目のクライアントは2つ目のマシンにアクセスし続ける。

結論

Azureのロードバランサーは新しいTCPコネクションを受信するとラウンドロビンでロードバランシングしますが、新しいHTTPリクエストの受信ではラウンドロビンしません。

cloudapp.netのURLにリクエストを送信すると、LBはTCPコネクションでルーティングします。アプリケーションがHTTPリクエストを送信するときに同じTCPコネクションを利用するので、同じマシンにアクセスします。

別のマシンにラウンドロビンさせるには、TCPコネクションをブレイクして、新しいTCPコネクションを接続する必要があります。既存のTCPコネクションがKillされるまで、HTTPリクエストは同じマシンにルーティングされ続けます。

HTTPリクエストの変わりに新しいTCPコネクションを作成するには、たとえば同じクライアント上の複数のブラウザを使用することで対応できます。

Connections To Azure Role Not Getting Load Balanced Between Instancesを一部意訳しました。