Freigeben über


Azure Load Balancer の新しい分散モード

このポストは、10 月 30 日に投稿された Azure Load Balancer new distribution mode の翻訳です。

Azure Load Balancer はレイヤー 4 (TCP、UDP) 型のロード バランサーで、負荷分散セットに定義されている Cloud Services 内または Virtual Machines の正常なインスタンスの間で受信トラフィックを分散します。

この機能の分散処理アルゴリズムでは、5 つのタプル (送信元の IP、送信元のポート番号、送信先の IP、送信先のポート番号、プロトコルの種類) のハッシュを使用して、利用可能なサーバーにトラフィックをマッピングします。これは、1 つのトランスポート セッションでのみ有効です。同一の TCP セッションまたは UDP セッションのパケットは、負荷分散対象のエンドポイントのうち、同一のデータ センターの IP (DIP) を持つインスタンスに転送されます。クライアントがいったん接続を切断して再接続した場合、または同一の送信元 IP から新しいセッションを開始した場合、送信元のポート番号は変更され、トラフィックは異なる DIP を持つエンドポイントに転送されます。

今回、Source IP Affinity (セッション アフィニティまたはクライアント IP アフィニティとも呼ばれます) という新しい分散モードが導入されました。これにより、Azure Load Balancer で、利用可能なサーバーにトラフィックをマッピングする際に、2 つ (送信元 IP と送信先 IP) または 3 つ (送信元 IP、送信先 IP、プロトコル) のタプルを使用するように構成できます。Source IP Affinity を使用すると、同一のクライアント コンピューターで開始された接続は同一の DIP エンドポイントに転送されます。

Source IP Affinity を使用することにより、Azure Load Balancer と RD ゲートウェイの互換性 (英語) が得られます。このため、RD ゲートウェイ ファームを単一のクラウド サービスで構築できるようになります。

他の用途としては、メディアのアップロードが挙げられます。UDP からリアルタイムでデータをアップロードしている場合でも、TCP からコントロール プレーンを操作できます。

  • クライアントは、まず負荷分散対象のパブリック アドレスに対し TCP セッションを開始し、特定の DIP に転送されます。このチャネルは、接続の正常性を監視するためにアクティブな状態が維持されます。
  • 同一のクライアント コンピューターで、同一の負荷分散対象のパブリック エンドポイントに対し新しい UDP セッションが開始されます。この接続は前の TCP 接続と同じ DIP エンドポイントに転送されます。これにより、メディアのアップロードを高速で実行すると同時に、TCP の制御チャネルが維持されます。

負荷分散セットを変更した場合 (Virtual Machines を削除または追加した場合)、クライアントの要求の分散について再計算が行われるので注意が必要です。既存のクライアント セッションからの新しい接続は、同一サーバーで処理されるとは限りません。また、Source IP Affinity 分散モードを使用すると、トラフィックが均等に分散されない場合があります。実行中のクライアントのうちプロキシを使用しているものは、1 つの一意なクライアント アプリケーションとして認識されることがあります。

シナリオ

  • PowerShell または Service Management API を使用して、Virtual Machines のエンドポイントに対して Load Balancer の分散処理を構成する
  • PowerShell または Service Management API を使用して、負荷分散エンドポイント セットに対して Load Balancer の分散処理を構成する
  • サービス モデルを使用して、Web ロールまたは Worker ロールに対して Load Balancer の分散処理を構成する

PowerShell のサンプル

最新の Azure PowerShell (10 月分、英語) をダウンロードし、インストールが完了していることを確認してください。

Azure のエンドポイントを Virtual Machines に追加して Load Balancer の分散モードを設定する

 Get-AzureVM -ServiceName "mySvc" -Name "MyVM1" | Add-AzureEndpoint -Name "HttpIn" -Protocol "tcp" -PublicPort 80 -LocalPort 8080 –LoadBalancerDistribution “sourceIP”| Update-AzureVM

LoadBalancerDistribution は、2 つのタプル (送信元 IP、送信先 IP) で負荷分散を行うときは sourceIP、3 つのタプル (送信元 IP、送信先 IP、プロトコル) で負荷分散を行うときは sourceIPProtocol、既定の 5 つのタプルで負荷分散を行うときには none に設定します。

エンドポイントの Load Balancer の分散モードの構成を取得する

 PS C:\> Get-AzureVM –ServiceName “MyService” –Name “MyVM” | Get-AzureEndpoint

VERBOSE: 6:43:50 PM - Completed Operation: Get Deployment
LBSetName : MyLoadBalancedSet
LocalPort : 80
Name : HTTP
Port : 80
Protocol : tcp
Vip : 65.52.xxx.xxx
ProbePath :
ProbePort : 80
ProbeProtocol : tcp
ProbeIntervalInSeconds : 15
ProbeTimeoutInSeconds : 31
EnableDirectServerReturn : False
Acl : {}
InternalLoadBalancerName :
IdleTimeoutInMinutes : 15
LoadBalancerDistribution : sourceIP

LoadBalancerDistribution 要素が存在しない場合、Azure Load Balancer は既定である 5 つのタプルによるアルゴリズムを使用します。

負荷分散エンドポイント セットに分散モードを設定する

エンドポイントが負荷分散エンドポイント セットの一部である場合、分散モードは負荷分散エンドポイント セットに対して設定する必要があります。

 Set-AzureLoadBalancedEndpoint -ServiceName "MyService" -LBSetName "LBSet1" -Protocol tcp -LocalPort 80 -ProbeProtocolTCP -ProbePort 8080 –LoadBalancerDistribution "sourceIP"

Cloud Services のサンプル

利用中の Cloud Services を更新するには、Azure SDK for .NET 2.5 (11 月中にリリース予定) を使用できます。

Cloud Services でのエンドポイントの設定は .csdef ファイルで行います。Cloud Services のデプロイメントに対して Load Balancer の分散モードを更新するには、デプロイメントをアップグレードする必要があります。

エンドポイントを設定する際の .csdef の変更例を次に示します。

 <WorkerRole name="worker-role-name" vmsize="worker-role-size" enableNativeCodeExecution="[true|false]">
  <Endpoints>
    <InputEndpoint name="input-endpoint-name" protocol="[http|https|tcp|udp]" localPort="local-port-number" port="port-number" certificate="certificate-name" loadBalancerProbe="load-balancer-probe-name" loadBalancerDistribution="sourceIP" />
  </Endpoints>
</WorkerRole>
<NetworkConfiguration>
  <VirtualNetworkSite name="VNet"/>
  <AddressAssignments>
    <InstanceAddress roleName="VMRolePersisted">
      <PublicIPs>
        <PublicIP name="public-ip-name" idleTimeoutInMinutes="timeout-in-minutes"/>
      </PublicIPs>
    </InstanceAddress>
  </AddressAssignments>
</NetworkConfiguration>

API のサンプル

Service Management API を使用して Load Balancer の分散処理を構成することができます。

この場合、追加する x-ms-version ヘッダーは 2014-09-01 またはそれ以降のバージョンである必要があります。

特定のデプロイメントで負荷分散セットの構成を更新する

要求のサンプル

 POST https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deployments/<deployment-name>?comp=UpdateLbSet 

x-ms-version: 2014-09-01 

Content-Type: application/xml 

<LoadBalancedEndpointList xmlns="https://schemas.microsoft.com/windowsazure" xmlns:i="https://www.w3.org/2001/XMLSchema-instance"> 

<InputEndpoint> 

<LoadBalancedEndpointSetName> endpoint-set-name </LoadBalancedEndpointSetName> 

<LocalPort> local-port-number </LocalPort> 

<Port> external-port-number </Port> 

<LoadBalancerProbe> 

<Port> port-assigned-to-probe </Port> 

<Protocol> probe-protocol </Protocol> 

<IntervalInSeconds> interval-of-probe </IntervalInSeconds> 

<TimeoutInSeconds> timeout-for-probe </TimeoutInSeconds> 

</LoadBalancerProbe> 

<Protocol> endpoint-protocol </Protocol> 

<EnableDirectServerReturn> enable-direct-server-return </EnableDirectServerReturn> 

<IdleTimeoutInMinutes>idle-time-out</IdleTimeoutInMinutes> 

<LoadBalancerDistribution>sourceIP</LoadBalancerDistribution> 

</InputEndpoint> 

</LoadBalancedEndpointList>

LoadBalancerDistribution の値は、2 つのタプルを使用するアフィニティの場合は sourceIP、3 つのタプルを使用するアフィニティの場合は sourceIPProtocol、5 つのタプルを使用する (アフィニティなし) 場合は none に設定します。

応答

 HTTP/1.1 202 Accepted 

Cache-Control: no-cache 

Content-Length: 0 

Server: 1.0.6198.146 (rd_rdfe_stable.141015-1306) Microsoft-HTTPAPI/2.0 

x-ms-servedbyregion: ussouth2 

x-ms-request-id: 9c7bda3e67c621a6b57096323069f7af 

Date: Thu, 16 Oct 2014 22:49:21 GMT