Azure Load Balancer (ALB) と Internal Load Balancer (ILB) で同一のパブリックポートは使用できませんが、一つの環境に両方とも作成することができます。
この作成方法についてメモを。
ILB については一つしか作成できないようですので、注意しておいたほうがよさそうですね。
BadRequest: LoadBalancer already exists: AlwaysOnILB. Only one internal load balancer allowed per deployment.
ALB と ILB の両方を可用性グループのリスナーに使いたかったのですが、うまくいったりいかなかったりと挙動が安定しないので、これは別の機会に調査してみたいと思います。
# DNS の解決方法についても考慮が必要になってくるので。
ポイントとしては ALB と ILB で同一のパブリックポートを指定できない点になるかと。
以下のような構成はすることはできません。
- ALB でパブリックポート「TCP:1433」をローカルポート「TCP:1433」にリダイレクト
- ILB でパブリックポート「TCP:1433」をローカルポート「TCP:1433」にリダイレクト
このような設定をしようとした場合、ALB と ILB でパブリックポート「TCP:1433」を使用してローカルポートにリダイレクトをしようとしていることになり、設定をしようとするとエラーとなります。
Port 1433 is already in use by one of the endpoints in this deployment. Ensure that the port numbers are unique across endpoints within a deployment.
上記のエラーは ALB でパブックポート 1433 を使用した負荷分散セットをすでに作成している状態で、ILB で パブリックポート 1433 を使用した負荷分散セットを作成しようとした場合に発生したエラーとなります。
ALB と ILB でリスナーを公開する場合、以下のような構成でしたら設定することが可能です。
- ALB でパブリックポート「TCP:1433」をローカルポート「TCP:1433」にリダイレクト
- ILB でパブリックポート「TCP:1434」をローカルポート「TCP:1433」にリダイレクト
ローカルポート (仮想マシンのリスナーで使用しているポート) は TCP:1433 なのは同じですが、ALB と ILB で使用するパブリックポートが異なっています。
このような構成であれば設定することが可能です。
順番は逆でも問題ないかと思いますが、ALB → ILB の順で作成する場合は、まずは以下の PowerShell で ALB を設定します。
# Define variables $AGNodes = "SQL-01","SQL-02" # all availability group nodes containing replicas should be included, separated by commas $ServiceName = "kinmugi-mssql" # the name of the cloud service that contains the availability group nodes $EndpointName = "AlwaysOn-ALB" # name of the endpoint $PublicPort = "1433" # public port to use for the endpoint $LocalPort = "1433" # local port to use for the endpoint # Configure a load balanced endpoint for each node in $AGNodes, with direct server return enabled ForEach ($node in $AGNodes) { Get-AzureVM -ServiceName $ServiceName -Name $node | Add-AzureEndpoint -Name $EndpointName -Protocol "TCP" -PublicPort $PublicPort -LocalPort $LocalPort -LBSetName "$EndpointName" -ProbePort 59999 -ProbeProtocol "TCP" -DirectServerReturn $true | Update-AzureVM }
これで、AlwaysOn-ALB というパブリック IP 向けの負荷分散セットが作成されます。
次に ILB を作成します。
# Define variables $AGNodes = "SQL-01","SQL-02" # all availability group nodes containing replicas should be included, separated by commas $ServiceName = "kinmugi-mssql" # the name of the cloud service that contains the availability group nodes $EndpointName = "AlwaysOn-ILB" # name of the endpoint $PublicPort = "1434" # public port to use for the endpoint $LocalPort = "1433" # local port to use for the endpoint $ILBName = "AlwaysOn-ILB" # chosen name for the new ILB $SubnetName = "DB-Subnet" # subnet name that the replicas use in the VNet $ILBStaticIP = "172.0.0.8" # static IP address for the ILB in the subnet Add-AzureInternalLoadBalancer -InternalLoadBalancerName $ILBName -SubnetName $SubnetName -ServiceName $ServiceName -StaticVNetIPAddress $ILBStaticIP # Configure a load balanced endpoint for each node in $AGNodes using ILB ForEach ($node in $AGNodes) { Get-AzureVM -ServiceName $ServiceName -Name $node | Add-AzureEndpoint -Name $EndpointName -LBSetName "$EndpointName" -Protocol tcp -LocalPort $LocalPort -PublicPort $PublicPort -ProbePort 59999 -ProbeProtocol tcp -ProbeIntervalInSeconds 10 -InternalLoadBalancerName $ILBName | Update-AzureVM }
ILB を作成する際には、「1434」を指定して作成しています。
これで、ALB と ILB の両方の設定は完了です。