Criar um cluster

Esta seção passos através das tarefas de construção necessárias para criar o Windows Server Failover Cluster (WSFC) e o grupo de disponibilidade.

Este guia assume que você:

  • Tenha pelo menos dois servidores executando o Windows 2019 e o SQL Server 2019 para cluster.
  • Tenha um host de bastião com acesso à Internet externo.
  • Ter implementado o diretório ativo.

Instalar o recurso Failover Clustering

  1. RDP para o primeiro servidor SQL usando um usuário da conta do grupo SQL Admins e abra uma sessão PowerShell.

  2. Inclua o grupo de Admins SQL no grupo de Usuários de Gerenciamento Remoto local para que os usuários neste grupo, possam executar comandos remotos.

  3. Permitir a porta TCP de entrada 5022 no servidor já que esta porta é usada para tráfego de grupo de disponibilidade. Instale o recurso de Clustering de Failover e, em seguida, reinicie o servidor:

    $domainnb = "<NB_Domain>"
    $group = $domainnb + "\SQLAdmins"
    Add-LocalGroupMember -Group "Remote Management Users" -Member $group
    New-NetFirewallRule -DisplayName 'SQL-AG-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5022
    Install-WindowsFeature –Name Failover-Clustering –IncludeManagementTools
    Restart-Computer -Force
    
  4. Repita para o segundo servidor SQL.

Crie um WSFC e ative o SQL Always On

  1. RDP para o primeiro servidor SQL usando um usuário da conta do grupo SQL Admins e abra uma sessão PowerShell.

  2. Executar um teste de validação de cluster. Ignore qualquer aviso de "one pair of network interfaces", já que isso é normal para esta implementação.

  3. Se não houver erros eles criem um cluster WSFC com um nome de wsfc01 que inclui os dois servidores SQL <hostname1> e <hostname2>. A opção -ManagementPointNetworkType Distributed usa o endereço IP do nó do servidor virtual o que significa que o endereçamento IP secundário na interface não é necessário. Esta opção cria um Nome de Rede Distribuída (DNN), que roteia o tráfego para o recurso de clustered apropriado.

  4. O quorum de cluster é então configurado para Node e Maioria de Disco usando um compartilhamento de arquivos em fs01, \\fs01\clusterwitness-wsfc01

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    Test-Cluster -Node $sqldb01, $sqldb02
    New-Cluster -Name wsfc01 -Node $sqldb01, $sqldb02 -ManagementPointNetworkType Distributed
    Set-ClusterQuorum -NodeAndFileShareMajority \\fs01\clusterwitness-wsfc01
    Enable-SqlAlwaysOn -ServerInstance sqldb01, sqldb02 -Force
    

Esta atividade não tem que ser repetida no segundo nó

Criar um compartilhamento de arquivos

O banco de dados a ser replicado deve ser apoiado e restaurado para as instâncias secundárias, é necessário um compartilhamento de arquivos para facilitar esta operação. No servidor de bastion crie um diretório e compartilhe-o para que ele possa realizar um backup de banco de dados do servidor SQL primário e restaurado para servidor SQL secundário. O diretório e o compartilhamento devem ser acessíveis pela conta do SQL Service, já que o backup é realizado pela conta de serviço para o banco de dados.

  1. No host de bastion, abra uma sessão PowerShell.

    $domainnb = "<NB_Domain>"
    $user = $domainnb + "\sqlsvc"
    New-Item -Path "C:\" -Name "TempShare" -ItemType "directory"
    $ACL=Get-ACL -Path "C:\TempShare"
    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($user,"FullControl","Allow")
    $ACL.SetAccessRule($AccessRule)
    $ACL | Set-Acl -Path "C:\TempShare"
    New-SmbShare -Name "TempShare" -Path "C:\TempShare" -FullAccess $user
    

Criar os endpoints

  1. RDP para o primeiro servidor SQL usando um usuário da conta do grupo SQL Admins e abra uma sessão PowerShell.

  2. Para participar de grupos de disponibilidade Always On, uma instância do servidor requer seu próprio terminal, que usa a porta TCP 5022 para enviar e receber tráfego entre as instâncias do servidor hospedando réplicas de disponibilidade.

  3. Os seguintes comandos PowerShell são usados para configurar esses terminais, Hadr_endpoint nas instâncias SQL padrão (DEFAULT) nos servidores SQL; <hostname1>`` and <hostname2> e possibilita a criptografia entre os terminais:

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $domainnb = "<NB_Domain>"
    $user = $domainnb + "\sqlsvc"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 + "\DEFAULT"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb02 + "\DEFAULT"
    $endpoint1 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb01 -Encryption Required -EncryptionAlgorithm Aes -Owner $user
    Set-SqlHadrEndpoint -InputObject $endpoint1 -State "Started"
    $endpoint2 = New-SqlHadrEndpoint Hadr_endpoint -Port 5022 -Path $pathsqldb02 -Encryption Required -EncryptionAlgorithm Aes -Owner $user
    Set-SqlHadrEndpoint -InputObject $endpoint2 -State "Started"
    

Para conceder permissões de conexão ao serviço de domínio utilizado pelos terminais são necessários os seguintes passos. Se esta etapa não for feita então as portas do terminal não iniciarão e não aparecerão em uma listagem netstat -a :

  1. Ative o SQL Server Management Studio (SSMS) no host de réplica primária e conecte-se à réplica primária.
  2. Expanda Segurança, clique com o botão direito em Logins e selecione Novo Login.
  3. Clique em Pesquisar e digite a conta de usuário \sqlserver\sqlsvc, em seguida, clique em OK.
  4. Clique com o botão direito do mouse no login criado e selecione Propriedades.
  5. Clique em Securables e, em seguida, Pesquisar.
  6. No diálogo Add Objects, selecione Objetos específicos e clique em OK.
  7. No diálogo Select Objects, clique em Tipos de Objetos e selecione Terminais.
  8. Clique em Procurar para selecionar o nome do objeto.
  9. Selecione Hadr_endpoint e clique em OK.
  10. Na permissão para Hadr_endpoint, conceder explicitamente permissão de conexão a este objeto.

Criar um banco de dados teste

Para configurar um grupo de disponibilidade, um banco de dados deve estar disponível no nó primário e, em seguida, uma cópia deste banco de dados disponível no nó secundário. Esta tarefa cria um banco de dados de teste e, em seguida, usando uma operação de backup e restauração, através de um compartilhamento de arquivos, copia o banco de dados para o nó secundário.

  1. RDP para o primeiro servidor SQL usando um usuário da conta do grupo SQL Admins e abra uma sessão PowerShell. É importante configurar o modo de Recuperação para Full para bancos de dados utilizados em grupos de disponibilidade:

    $sql = "
    CREATE DATABASE [TestDatabase]
     CONTAINMENT = NONE
     ON  PRIMARY
    ( NAME = N'TestDatabase', FILENAME = N'D:\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 1048576KB , FILEGROWTH = 262144KB )
     LOG ON
    ( NAME = N'MyDatabase_log', FILENAME = N'E:\MSSQL15.MSSQLSERVER\MSSQL\Logs\TestDatabase_log.ldf' , SIZE = 524288KB , FILEGROWTH = 131072KB )
    GO
    
    USE [master]
    GO
    ALTER DATABASE [TestDatabase] SET RECOVERY FULL
    GO
    
    ALTER AUTHORIZATION ON DATABASE::[TestDatabase] TO [sa]
    GO "
    Invoke-SqlCmd -ServerInstance sqldb01 -Query $sql
    
  2. Prepare o banco de dados secundário usando os comandos Backup-SqlDatabase e Restore-SqlDatabase para criar um backup do TestDatabase em <hostname1> em TempShare , em <file_share_host>, a instância do servidor SQL que hospeda a réplica primária. Restae o backup para <hostname2>, que hospeda a réplica secundária. O parâmetro de restauração NoRecovery deve ser usado.

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $filesharehost = "<file_share_host>"
    $backupfiledata = "\\" + $filesharehost +"\TempShare\TestDatabase.bak"
    $backupfilelog = "\\" + $filesharehost +"\TempShare\TestDatabase.trn"
    Backup-SqlDatabase -Database "TestDatabase" -ServerInstance $sqldb01 -BackupFile $backupfiledata -CopyOnly
    Backup-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb01 -BackupAction Log -CopyOnly
    Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfiledata -ServerInstance $sqldb02 -NoRecovery  
    Restore-SqlDatabase -Database "TestDatabase" -BackupFile $backupfilelog -ServerInstance $sqldb02 -RestoreAction Log -NoRecovery
    

O novo banco de dados secundário está no estado RESTAURANDO. Até que ele seja unido ao grupo de disponibilidade, ele não é acessível.

Criar um grupo de disponibilidade

Bancos de dados incluídos em um grupo de disponibilidade são conhecidos como bancos de dados de disponibilidade. Ao adicionar bancos de dados, o banco de dados deve ser um banco de dados online, de leitura e existir na instância do servidor que irá hospedar a réplica primária no WSFC. Quando adicionado, o banco de dados se junta ao grupo de disponibilidade como um banco de dados primário e permanece disponível para os clientes. Nenhum banco de dados secundário existe até que os backups do banco de dados primário sejam restaurados para a instância do servidor que se tornará a réplica secundária. O novo banco de dados secundário está no estado RESTAURANDO até que ele seja unido ao grupo de disponibilidade. Consulte Use o seeding automático para inicializar uma réplica secundária para um grupo Always On availability se o método de backup e restauração não for usado.

  1. RDP para o primeiro servidor SQL usando um usuário da conta do grupo SQL Admins e abra uma sessão PowerShell.

  2. Para garantir que você não obtenha erros de caminho então use Invoke-SQLCmd o que obriga o carregamento da biblioteca do SQL PowerShell que é então acessível através da árvore da unidade PowerShell. O PowerShell trata os objetos no SQL Server semelhantes a arquivos em um diretório. Substitua <hostname1> pelo o hostname do servidor SQL:

    invoke-sqlcmd
    cd SQLSERVER:\SQL\<hostname1>
    
  3. Para criar o grupo de disponibilidade, o comando New-SqlAvailabilityReplica com o parâmetro -AsTemplate, é usado para criar um objeto de disponibilidade in-memory-objeto de réplica para cada uma das duas réplicas de disponibilidade a serem incluídas no grupo de disponibilidade. Em seguida, o grupo de disponibilidade é criado usando o comando New-SqlAvailabilityGroup e referenciando os objetos de replica de disponibilidade. O AutomatedBackupPreference Primary é usado para especificar que os backups devem sempre ocorrer na réplica primária enquanto -FailureConditionLevel OnCriticalServerErrors especifica que o failover automático é acionado quando ocorre um erro de servidor crítico. É possível utilizar a opção -SeedingMode Automatic que possibilita o plantio direto já que este método não requer o backup e a restauração de uma cópia do banco de dados primário. Para o SQL 2019, o número da versão é 15.

    Consulte a documentação New-SqlDisponabilityGroup para descrições de outros parâmetros.

    $sqldb01 = "<hostname1>"
    $sqldb02 = "<hostname2>"
    $sqldb01fqdn = "<fqdn1>"
    $sqldb02fqdn = "<fqdn2>"
    $endpointurl1 "TCP://" + $sqldb01fqdn + ":5022"
    $endpointurl2 "TCP://" + $sqldb02fqdn + ":5022"
    $pathsqldb01 = "SQLSERVER:\SQL\" + $sqldb01 +" \DEFAULT"
    $primaryReplica = New-SqlAvailabilityReplica -Name $sqldb01 -EndpointURL $endpointurl1 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate  
    $secondaryReplica = New-SqlAvailabilityReplica -Name $sqldb02 -EndpointURL $endpointurl2 -AvailabilityMode "SynchronousCommit" -FailoverMode "Automatic" -Version 15 -AsTemplate
    New-SqlAvailabilityGroup -Name "AG01" -Path $pathsqldb01 -AvailabilityReplica @($primaryReplica,$secondaryReplica) -Database "TestDatabase" -ClusterType WSFC -AutomatedBackupPreference Primary -FailureConditionLevel OnCriticalServerErrors
    
  4. Junte a réplica secundária ao grupo de disponibilidade com os seguintes comandos. Junte-se a colocar o banco de dados secundário no estado ONLINE e inicia a sincronização de dados com o banco de dados primário correspondente. A sincronização de dados é o processo pelo qual as mudanças em um banco de dados primário são reproduzidas em um banco de dados secundário. A sincronização de dados envolve o banco de dados primário enviando registros de log de transações para o banco de dados secundário.

    $sqldb02 = "<hostname2>"
    $pathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT"
    Join-SqlAvailabilityGroup -Path $pathsqldb02 -Name "AG01" -ClusterType WSFC
    
  5. Iniciar a sincronização de dados, unindo cada banco de dados secundário ao grupo de disponibilidade:

    $sqldb02 = "<hostname2>"
    $agpathsqldb02 = "SQLSERVER:\SQL\" + $sqldb02 + " \DEFAULT\AvailabilityGroups\AG01"
    Add-SqlAvailabilityDatabase -Path $agpathsqldb02 -Database "TestDatabase"
    
  6. Use o comando dir para verificar o conteúdo do novo grupo de disponibilidade, e.g. dir SQLSERVER:\SQL\sqldb01\DEFAULT\AvailabilityGroups\AG01.

Criar o nome de rede distribuído do grupo de disponibilidade

Com o SQL Server no IBM Cloud VPC, o DNN (Distributed Network Name) roteia o tráfego para o recurso de clustered apropriado. O atendente (DNN) substitui o tradicional atendente do grupo de disponibilidade do Virtual Network Name (VNN) quando usado com grupos de disponibilidade Always On e simplifica a implementação em um ambiente em nuvem.

Os ouvintes DNN são projetados para ouvir em uma porta exclusiva. A entrada DNS para o nome do atendente irá resolver para todos os endereços IP das réplicas no grupo de disponibilidade. Já que o SQL Server atende na porta 1433, a porta 1433 não pode ser usada para nenhum ouvinte do DNN.

RDP ao primeiro servidor SQL usando um usuário da conta do grupo SQL Admins e abrir uma sessão PowerShell e utilizar os seguintes comandos; para criar um recurso DNN com o nome de dnnlsnr-6789, configura DNS no servidor AD DNS do recurso DNN, inicia o recurso DNN, adiciona a dependência do recurso do grupo de disponibilidade ao recurso DNN e, finalmente, reconfigura o recurso do grupo de disponibilidade.

$ag = "AG01"
$dns = "dnnlsnr"
$port = "6789"
Add-ClusterResource -Name $port -ResourceType "Distributed Network Name" -Group $ag
Get-ClusterResource -Name $port | Set-ClusterParameter -Name DnsName -Value $dns
Start-ClusterResource -Name $port
$Dep = Get-ClusterResourceDependency -Resource $ag
if ( $Dep.DependencyExpression -match '\s*\((.*)\)\s*' ) {$DepStr = "$($Matches.1) or [$port]"} else {$DepStr = "[$port]"}
Set-ClusterResourceDependency -Resource $ag -Dependency "$DepStr"
Stop-ClusterResource -Name $ag
Start-ClusterResource -Name $ag

Use o seguinte comando para permitir o TCP 6789 através do firewall do Windows:

New-NetFirewallRule -DisplayName 'SQL-dnnlsnr-6789-Inbound' -Profile Domain -Direction Inbound -Action Allow -Protocol TCP -LocalPort 6789