AlwaysOn no Azure

Outro dia estava fazendo um estudo e pretendia fazer um teste completo AlwaysOn no SQL 2012 com 4 replicas + AD. Isto extrapolaria minha quantidade de atual de memória RAM no notebook, então resolvi utilizar outro modo de virtualização, por que não o AZURE, é simples, rápido e barato (Você paga por HORA que utiliza, não conta se você desalocar a máquina).

Muito bem neste artigo não vou detalhar o processo de criação de maquinas virtuais e do AlwaysOn pois este processo já é bem documentado e vou colocar os links no final do post

*UPDATE (26/08/2014) : Agora o Azure tem TEMPLATE pronto de AlwaysON o que facilita a montagem deste tipo de ambiente (https://blogs.technet.com/b/dataplatforminsider/archive/2014/08/25/sql-server-alwayson-offering-in-microsoft-azure-portal-gallery.aspx

 

Referente minha arquitetura, montei minha rede no Azure criei algumas subnets e coloquei as maquinas conforme diagrama abaixo.


 
IMPORTANTE: A única observação é que você deve criar as todas maquinas de AlwaysOn sobre um mesmo serviço de nuvem. Este serviço de nuvem é como um ip virtual o qual você usa para fazer acesso as maquinas virtuais então se você criar o
XPTO.cloudapp.net, o acesso remoto a elas ficam

  • XPTO.cloudapp.net:PORTA 1
  • XPTO.cloudapp.net:PORTA 2
  • XPTO.cloudapp.net:PORTA X

esta porta é um número dinâmico normalmente por volta dos 50000


  

Depois desta montagem foi feito a configuração do AD, montagem do cluster, seguido pela instalação do SQL Servers em cada uma das maquinas e criação do listener.

IMPORTANTE: A instalação do SQL Server é a simples, não confundir com instalação de cluster que é outra solução de alta disponibilidade

Ao fazer o teste você acaba percebendo que apenas o dono do recurso (IP + Nome) do Listener era capaz de escutar ele, após algumas pesquisas verifiquei que existe algumas restrições na rede do Azure que não permite o DSR (Direct Server Return) que permite conexão de cliente para a VM.

Para resolver isso você precisa rodar alguns comandos em Powershell tanto fora do Azure como dentro da VM.

Primeiramente baixe o Powershell para Windows Azure para sua máquina local que te permite executar comandos Powershell remotamente https://azure.microsoft.com/pt-br/downloads/

Abra o Windows Azure Powershell

Execute o comando

 

Get-AzurePublishSettingsFile

 

Ele irá baixar um arquivo que aponta para sua conta do Azure (XXXXXXXXXX.publishsettings)

Depois execute o comando abaixo, fazendo as devidas configurações.

Para cada nó ele irá criar uma porta publica, neste caso usei a famosa 1433, mas poderia ser qualquer uma, que aponta para uma porta interna 59999 (DSR)

 

Import-AzurePublishSettingsFile -PublishSettingsFile "C:\SERGIO.publishsettings"

# Define variables

$AGNodes = "SQL-AON-01","SQL-AON-02" # all availability group nodes should be included, separated by commas

$ServiceName = "SQL-AON" # the name of the cloud service that contains the availability group nodes

$EndpointName = "AlwaysOnListener" # name of the endpoint (QQ NOME)

$EndpointPort = "1433" # public 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 $EndpointPort -LocalPort $EndpointPort -LBSetName "$EndpointName-LB" -ProbePort 59999 -ProbeProtocol "TCP" -DirectServerReturn $true | Update-AzureVM

}

 

Agora vá para máquina virtual, a que é a PRIMARY neste momento e abra o powershell lá de dentro e execute o comando, fazendo as devidas configurações

IMPORTANTE: Este script não irá deletar o listener do seu SQL, ou seja, se já existir delete ele primeiro, depois execute o script. Caso você tenha rodado ele gera algum tipo de erro e talvez você tenha que ir no cluster manager no resource do AlwaysOn e deletar o recurso de ip e nome que ele estava tentando criar.

 

$ag = "AG-AON" # The availability group name

$serviceName = "SQL-AON" # The cloud service name

$networkName = "Cluster Network 1" # The cluster network name, usually "Cluster Network 1" if the nodes are in the same subnet

$listenerPort = "1433" # Listener port. Same as the endpoint port.

$aglistener = $ag + "Listener"

 

$agendpoint = (Resolve-DnsName -Name "$serviceName.cloudapp.net").IPAddress 

Import-Module FailoverClusters

# Add IP address resource for the listener to AG resource group. The probe port is set so the AG owner node will respond to probes from Windows Azure.

Add-ClusterResource "IP Address $agendpoint" -ResourceType "IP Address" -Group $ag | Set-ClusterParameter -Multiple @{"Address"="$agendpoint";"ProbePort"="59999";SubnetMask="255.255.255.255";"Network"="$networkName";"OverrideAddressMatch"=1;"EnableDhcp"=0}

# Add Network Name resource for the listener to AG resource group

Add-ClusterResource -Name $aglistener -ResourceType "Network Name" -Group $ag | Set-ClusterParameter -Multiple @{"Name"=$aglistener;"DnsName"=$aglistener}

# Set dependency for the Network Name resource on the IP address resource 

Get-ClusterResource -Name $aglistener | Set-ClusterResourceDependency "[IP Address $agendpoint]"

# Start the listener resource

Start-ClusterResource -Name $aglistener

# Set dependency for the AG resource group on the listener's network name

Get-ClusterResource -Name $ag | Set-ClusterResourceDependency "[$aglistener]"

# Change port number on the listener to 1433

Set-SqlAvailabilityGroupListener -Path SQLSERVER:\SQL\$env:COMPUTERNAME\DEFAULT\AvailabilityGroups\$ag\AvailabilityGroupListeners\$aglistener -Port $listenerPort

 

O que ele faz na verdade é associando o IP Virtual do serviço de nuvem aquele que citei no início e que todas maquinas do AlwaysOn fazem parte, como dependência do resource do Always On. Então quando você acessar, será pelo IP VIRTUAL

Finalmente chegou a hora de testar e vem mais uma observação, pois você tem que fazer o teste de uma máquina que não esteja no mesmo serviço da nuvem, ou seja, um cliente externo, outra máquina virtual por exemplo.

Não esqueça que existem portas para se configurar no firewall, mas caso ainda não esteja conseguindo existem mais alguns testes que podem ser feitos seguindo o link abaixo (Troubleshooting Availability Group Listener in Windows Azure)

Outra observação importante é que esta configuração é válida enquanto a máquina estiver ativa, se você desalocar as maquinas elas perdem esta configuração e tem de fazer novamente

Espero que isto ajude vocês

  • Tutorial: AlwaysOn Availability Groups in Windows Azure (GUI)

https://msdn.microsoft.com/en-us/library/dn249504.aspx

  • Tutorial: Listener Configuration for AlwaysOn Availability Groups in Azure

https://msdn.microsoft.com/en-us/library/dn376546.aspx

  • Troubleshooting Availability Group Listener in Windows Azure

https://msdn.microsoft.com/en-us/library/dn495646.aspx

  • Availability Group Listener in Windows Azure Now Supported! (And Scripts for Cloud-Only Configuration)

https://blogs.msdn.com/b/sqlalwayson/archive/2013/08/06/availability-group-listener-in-windows-azure-now-supported-and-scripts-for-cloud-only-configuration.aspx