昨日 Multiple VIPs for internal Load Balancer GA !! という投稿を書きましたが、実際に Azure 上に構築されている AlwaysOn 可用性グループで複数リスナーを構築してみました。
Azure 上に AlwaysOn AG 構成を構築する際のリスナーについて の内容が把握できていれば、設定はスムーズにできるかと。
Azure 側の設定としては、以下のようなスクリプトで対応できるかと。
Add-AzureRmAccount
$subscription = Get-AzureRmSubscription | Out-GridView -OutputMode Single
$subscription | Select-AzureRmSubscription
$resourcegroup = Get-AzureRmResourceGroup | Out-GridView -OutputMode Single
$VMNames = @("SQL-VM-01", "SQL-VM-02", "SQL-VM-03")
$ListenerPort = 1433
$ILBIP = @("10.4.0.110", "10.4.0.111")
$ProbePort = @( 59998, 59999)
$VNET = Get-AzureRmVirtualNetwork -ResourceGroupName $resourcegroup.ResourceGroupName | Out-GridView -OutputMode Single
$Subnet = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $VNET | Out-GridView -OutputMode Single
$ILB = New-AzureRmLoadBalancer -Name "AlwaysOn-ILB" -ResourceGroupName $resourcegroup.ResourceGroupName -Location "Japan West"
$Config = $ILB
$Config = $Config | Add-AzureRmLoadBalancerBackendAddressPoolConfig -Name "SQLBE"
for ($i = 0;$i -lt $ILBIP.Count;$i++){
$Config = $config | Add-AzureRmLoadBalancerFrontendIpConfig -Name $ILBIP[$i] -PrivateIpAddress $ILBIP[$i] -SubnetId $Subnet.Id
}
for ($i = 0;$i -lt $ProbePort.Count;$i++){
$Config = $Config | Add-AzureRmLoadBalancerProbeConfig -Name $ProbePort[$i] -Protocol Tcp -Port $ProbePort[$i] -IntervalInSeconds 5 -ProbeCount 4
}
for ($i = 0;$i -lt $ILBIP.Count;$i++){
$Config = $Config | Add-AzureRmLoadBalancerRuleConfig -Name $ILBIP[$i] -FrontendIpConfiguration $Config.FrontendIpConfigurations[$i] -Probe $config.Probes[$i] -Protocol Tcp -BackendAddressPool $config.BackendAddressPools[0] -FrontendPort $ListenerPort -BackendPort $ListenerPort -EnableFloatingIP
}
$Config | Set-AzureRmLoadBalancer
foreach($VMName in $VMNames)
{
$VM = Get-AzureRmVM -ResourceGroupName $resourcegroup.ResourceGroupName -Name $VMName
$NICName = ($VM.NetworkInterfaceIDs[0].Split('/') | select -last 1)
$NIC = Get-AzureRmNetworkInterface -name $NICName -ResourceGroupName $resourcegroup.ResourceGroupName
$NIC.IpConfigurations[0].LoadBalancerBackendAddressPools = $Config.BackendAddressPools[0]
Set-AzureRmNetworkInterface -NetworkInterface $NIC
}
このスクリプトでは、
- SQL-VM-01
- SQL-VM-02
- SQL-VM-03
という 3 台の仮想マシンをバックエンドプールとして設定し、
- 10.4.0.110
- 10.4.0.111
という 2 つの IP アドレスをロードバランサーに設定しています。
負荷分散規則のプローブポートとしては、以下を設定しています。
- 10.4.0.110 は 59998
- 10.4.0.111 は 59999
これにより、59998 をリスニングしている仮想マシンに対しては、10.4.0.110、59999 をリスニングしている仮想マシンに対しては 10.4.0.111 でアクセスが可能となります。
Azure 側の設定はこれで完了となり、あとは、仮想マシン側で、AlwaysOn 可用性グループのリスナーに、 ILB 仮想 IP とプローブポートの設定を行います。
$ClusterNetworkName = "Cluster Network 1"
$IPResourceName = "10.4.0.110"
$LBIP = "10.4.0.110"
Get-ClusterResource -Name $IPResourceName | Set-ClusterParameter `
-Multiple @{
Network=$ClusterNetworkName;`
Address=$LBIP;`
ProbePort="59998";`
SubnetMask="255.255.255.255";`
OverrideAddressMatch=1;`
EnableDhcp=0
}
$IPResourceName = "10.4.0.111"
$LBIP = "10.4.0.111"
Get-ClusterResource -Name $IPResourceName | Set-ClusterParameter `
-Multiple @{
Network=$ClusterNetworkName;`
Address=$LBIP;`
ProbePort="59999";`
SubnetMask="255.255.255.255";`
OverrideAddressMatch=1;`
EnableDhcp=0
}
以上で設定は完了です。
これで、ILB に設定されている複数の IP アドレスで、AlwaysOn 可用性グループのそれぞれのリスナーに接続することが可能となります。