Criar e configurar um grupo de disponibilidade para SQL Server em Linux

Aplica-se a: SQL Server no Linux

Este tutorial mostra como criar e configurar um AG (grupo de disponibilidade) para o SQL Server no Linux. Ao contrário do SQL Server 2016 (13.x) e das versões anteriores no Windows, você pode habilitar um Grupo de Disponibilidade (AG) com ou sem criar primeiro o cluster do Pacemaker subjacente. A integração com o cluster, se necessário, acontece mais tarde.

O tutorial inclui as seguintes tarefas:

  • Habilitar grupos de disponibilidade.
  • Criar pontos de extremidade do grupo de disponibilidade e certificados.
  • Use SQL Server Management Studio (SSMS) ou Transact-SQL para criar um grupo de disponibilidade.
  • Crie o logon SQL Server e as permissões para o Pacemaker.
  • Criar recursos de grupo de disponibilidade em um cluster do Pacemaker (tipo externo somente).

Pré-requisitos

Implante o cluster de alta disponibilidade do Pacemaker. Para mais informações, veja Implantar um cluster Pacemaker para SQL Server em Linux.

Habilitar o recurso grupos de disponibilidade

Ao contrário do Windows, você não pode usar o PowerShell nem o SQL Server Configuration Manager para habilitar o recurso de AG (grupos de disponibilidade). No Linux, você pode habilitar o recurso de grupos de disponibilidade de duas maneiras: usar o mssql-conf utilitário ou editar o mssql.conf arquivo manualmente.

Importante

Você deve habilitar o recurso AG para réplicas somente de configuração, até mesmo no SQL Server Express.

Use a mssql-conf utilidade

Em um prompt, execute o seguinte comando:

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1

Editar o arquivo mssql.conf

Você também pode modificar o mssql.conf arquivo, localizado na /var/opt/mssql pasta. Adicione as seguintes linhas:

[hadr]

hadr.hadrenabled = 1

Reiniciar SQL Server

Depois de habilitar grupos de disponibilidade, você deve reiniciar o SQL Server. Use o seguinte comando:

sudo systemctl restart mssql-server

Criar os pontos de extremidade do grupo de disponibilidade e certificados

Um grupo de disponibilidade usa pontos de extremidade TCP para comunicação. No Linux, o SQL Server dará suporte a pontos de extremidade para um AG apenas se você usar certificados para autenticação. Você deve restaurar o certificado de uma instância em todas as outras instâncias que participam como réplicas no mesmo AG. Você precisa do processo de certificado até mesmo para uma réplica somente de configuração.

Você só pode criar endpoints e restaurar certificados usando Transact-SQL. Você também pode usar certificados não gerados pelo SQL Server. Você também precisará de um processo para gerenciar e substituir todos os certificados que expirarem.

Importante

Se planejar usar o assistente SQL Server Management Studio para criar o AG, ainda precisará criar e restaurar os certificados usando o Transact-SQL no Linux.

Para obter a sintaxe completa nas opções disponíveis para os vários comandos (incluindo segurança), consulte:

Note

Embora você esteja criando um grupo de disponibilidade, o tipo de endpoint usa FOR DATABASE_MIRRORING, porque o tipo de endpoint compartilha aspectos subjacentes com esse recurso agora obsoleto.

Este exemplo cria certificados para uma configuração de três nós. Os nomes das instâncias são LinAGN1, LinAGN2 e LinAGN3.

  1. Execute o seguinte script no LinAGN1 para criar a chave mestra, o certificado e o ponto de extremidade, e para fazer backup do certificado. Para este exemplo, o endpoint usa a típica porta TCP 5022.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN1_Cert
    WITH SUBJECT = 'LinAGN1 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN1_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN1_Cert,
        ROLE = ALL
    );
    GO
    
  2. Faça o mesmo no LinAGN2:

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
    WITH SUBJECT = 'LinAGN2 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN2_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN2_Cert,
        ROLE = ALL
    );
    GO
    
  3. Por fim, execute a mesma sequência no LinAGN3:

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
    WITH SUBJECT = 'LinAGN3 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN3_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN3_Cert,
        ROLE = ALL
    );
    GO
    
  4. Use scp outra ferramenta para copiar os backups do certificado para cada nó do qual você deseja que faça parte do AG.

    Para este exemplo:

    • Copie LinAGN1_Cert.cer para LinAGN2 e LinAGN3.
    • Copie LinAGN2_Cert.cer para LinAGN1 e LinAGN3.
    • Copie LinAGN3_Cert.cer para LinAGN1 e LinAGN2.
  5. Altere a propriedade e o grupo associado aos arquivos de certificado copiados para o mssql.

    sudo chown mssql:mssql <CertFileName>
    
  6. Crie os logons e os usuário associados a LinAGN2 e LinAGN3 no LinAGN1 no nível da instância.

    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    

    Caution

    Sua senha deve seguir a política de senha padrão do SQL Server. Por padrão, a senha precisa ter pelo menos oito caracteres e conter caracteres de três dos seguintes quatro conjuntos: letras maiúsculas, letras minúsculas, dígitos de base 10 e símbolos. As senhas podem ter até 128 caracteres. Use senhas que sejam tão longas e complexas quanto possível.

  7. Restaure LinAGN2_Cert e LinAGN3_Cert no LinAGN1. Os certificados das outras réplicas são essenciais para a comunicação e segurança da AG.

    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  8. Conceda permissão aos logons associados a LinAGN2 e LinAGN3 para se conectarem ao ponto de extremidade no LinAGN1.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    
  9. Crie os logons e os usuário associados a LinAGN1 e LinAGN3 no LinAGN2 no nível da instância.

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    
  10. Restaure LinAGN1_Cert e LinAGN3_Cert no LinAGN2.

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  11. Conceda permissão aos logons associados a LinAGN1 e LinAGN3 para se conectarem ao ponto de extremidade no LinAGN2.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    GO
    
  12. Crie os logons e os usuário associados a LinAGN1 e LinAGN2 no LinAGN3 no nível da instância.

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
  13. Restaure LinAGN1_Cert e LinAGN2_Cert no LinAGN3.

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
  14. Conceda permissão aos logons associados a LinAGN1 e LinAGN2 para se conectarem ao ponto de extremidade no LinAGN3.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GO
    

Crie o grupo de disponibilidade

Esta seção mostra como usar o SSMS (SQL Server Management Studio) ou Transact-SQL para criar o grupo de disponibilidade para o SQL Server.

Use SQL Server Management Studio.

Esta seção mostra como criar um AG com um tipo de cluster Externo usando SSMS com o Assistente de Grupo de Nova Disponibilidade.

  1. No SSMS, expanda Always On High Availability, clique com o botão direito do mouse em Grupos de Disponibilidade e selecione Assistente de Criação de Novo Grupo de Disponibilidade.

  2. No diálogo de Introdução , selecione Próximo.

  3. Na caixa de diálogo Especificar Opções do Grupo de Disponibilidade, insira o nome do AG e selecione um tipo de cluster de EXTERNAL ou NONE na lista suspensa. Use EXTERNAL quando implantar o Pacemaker. Use NONE para cenários especializados, como expansão de leitura. É opcional a seleção da opção de detecção de integridade em nível do banco de dados. Para saber mais sobre essa opção, confira a Opção de failover de detecção de integridade em nível do banco de dados do grupo de disponibilidade. Selecione Próximo.

    Captura de tela de Criar Grupo de Disponibilidade mostrando o tipo de cluster.

  4. No diálogo Selecionar Bancos de Dados , selecione os bancos de dados nos quais deseja participar do AG. Cada banco de dados deve ter um backup completo antes de poder ser adicionado a um grupo de disponibilidade (AG). Selecione Próximo.

  5. No diálogo Especificar Réplicas , selecione Adicionar Réplica.

  6. No diálogo Conectar ao Servidor, insira o nome da instância Linux do SQL Server para a réplica secundária e as credenciais para se conectar. Selecione Conectar.

  7. Repita as duas etapas anteriores para a instância que conterá uma réplica somente de configuração ou outra réplica secundária.

  8. Todas as três instâncias aparecem na janela de Especificar Réplicas . Se você usar um tipo de cluster de Externa, para a réplica secundária que é uma verdadeira secundária, certifique-se de que o modo de disponibilidade corresponda ao da réplica primária e defina o modo de failover para Externo. Para a réplica somente de configuração, selecione um modo de disponibilidade somente de Configuração.

    O exemplo a seguir mostra um AG com duas réplicas, um tipo de cluster Externo e uma réplica somente de configuração.

    Captura de tela de Criar Grupo de Disponibilidade mostrando a opção secundária para leitura.

    O exemplo a seguir mostra um AG com duas réplicas, um tipo de cluster Nenhum e uma réplica somente de configuração.

    Captura de tela de Criar um Grupo de Disponibilidade mostrando a página Réplicas.

  9. Se quiser mudar as preferências de backup, selecione a aba Preferências de Backup . Para mais informações sobre preferências de backup com AGs, veja Configurar backups em réplicas secundárias de um grupo de disponibilidade Always On.

  10. Se usar secundários legíveis ou criar um AG com um tipo de cluster de Nenhum para escala de leitura, você poderá criar um ouvinte. Para fazer isso, selecione a guia Ouvinte. Também será possível adicionar um ouvinte depois. Para criar um ouvinte, selecione a opção Criar um ouvinte de grupo de disponibilidade e insira um nome, uma porta TCP/IP e se deve usar um endereço IP DHCP estático ou atribuído automaticamente. Para um AG com um tipo de cluster de Nenhum, use um IP estático que corresponda ao endereço IP do primário.

    Captura de tela de Criar Grupo de Disponibilidade mostrando a opção de ouvinte.

  11. Se você criar um ouvinte para cenários legíveis, o SSMS permite a criação de roteamento somente leitura no assistente. Você também pode adicioná-lo depois usando SSMS ou Transact-SQL. Para adicionar o roteamento somente leitura agora:

    1. Selecione a abaRead-Only Roteamento .

    2. Insira as URLs para as réplicas somente leitura. Essas URLs são semelhantes aos pontos de extremidade, exceto pelo fato de usarem a porta da instância, e não o ponto de extremidade.

      1. Selecione cada URL e, na parte inferior, selecione as réplicas legíveis. Para selecionar vários, mantenha pressionada a tecla Shift ou select-drag.
  12. Selecione Próximo.

  13. Escolha como inicializar as réplicas secundárias. O padrão é usar semeadura automática, que requer o mesmo caminho em todos os servidores que participam do AG. Você também pode levar o assistente a fazer backup, copiar e restaurar (a segunda opção); pedir que participe se você tiver feito backup, cópia e restauração manual do banco de dados nas réplicas (terceira opção); ou adicionar o banco de dados posteriormente (última opção). Assim como acontece com os certificados, se você estiver fazendo backups manualmente e copiando-os, defina permissões nos arquivos de backup nas outras réplicas. Selecione Próximo.

  14. No diálogo de Validação , se o assistente não devolver Sucesso em todas as verificações, investigue mais a fundo. Alguns avisos são aceitáveis e não fatais, como se você não criar um ouvinte. Selecione Próximo.

  15. No diálogo Resumo , selecione Terminar. O processo de criação do AG começa agora.

  16. Quando a criação do AG estiver concluída, selecione Fechar na página de Resultados . Agora você pode ver o AG nas réplicas nas exibições de gerenciamento dinâmico, bem como na pasta Alta Disponibilidade Always On no SSMS.

Utilizar o Transact-SQL

Esta seção mostra exemplos de criação de um AG usando Transact-SQL. Você pode configurar ouvinte e o roteamento somente leitura após criar o AG. Você pode modificar o ag em si usando ALTER AVAILABILITY GROUP, mas não é possível alterar o tipo de cluster no SQL Server 2017 (14.x). Se você não pretender criar um AG com um tipo de cluster Externo, deverá excluí-lo e recriá-lo com um tipo de cluster Nenhum.

Para mais informações e outras opções, veja:

Exemplo A: duas réplicas com uma réplica somente de configuração (tipo de cluster External)

Esse exemplo mostra como criar um AG de duas réplicas que usa uma réplica somente de configuração.

  1. Execute a seguinte instrução no nó réplica primário, que contém a cópia de leitura/gravação dos bancos de dados. Este exemplo usa semeadura automática.

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE <DBName>
    REPLICA ON
    N'LinAGN1' WITH (
       ENDPOINT_URL = N' TCP://LinAGN1.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT
    ),
    N'LinAGN2' WITH (
       ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
       SEEDING_MODE = AUTOMATIC
    ),
    N'LinAGN3' WITH (
       ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
       AVAILABILITY_MODE = CONFIGURATION_ONLY
    );
    GO
    
  2. Em uma janela de consulta conectada à outra réplica, execute a seguinte instrução para unir a réplica ao AG e iniciar a seed da réplica primária para a secundária.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. Em uma janela de consulta conectada à réplica apenas de configuração, execute a seguinte instrução para conectá-la ao AG.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    

Exemplo B: Três réplicas com roteamento somente leitura (tipo de cluster externo)

Este exemplo mostra como configurar o roteamento somente leitura como parte da criação inicial do AG para três réplicas completas.

  1. Execute a instrução a seguir no nó que atua como a réplica primária e contém a cópia de leitura/gravação total dos bancos de dados. Este exemplo usa semeadura automática.

    CREATE AVAILABILITY GROUP [<AGName>] WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE < DBName > REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN2.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:1433')
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:1433')
        ),
        N'LinAGN3' WITH (
            ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN2.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN3.FullyQualified.Name:1433')
        )
        LISTENER '<ListenerName>' (
            WITH IP = ('<IPAddress>', '<SubnetMask>'), Port = 1433
        );
    GO
    

    Alguns pontos a serem observados sobre essa configuração:

    • AGName é o nome do AG.
    • DBName é o nome do banco de dados que você usa com o AG. Também pode ser uma lista de nomes separada por vírgulas.
    • ListenerName é um nome que difere de qualquer um dos servidores ou nós subjacentes. Você registra no DNS junto com IPAddress.
    • IPAddress é o endereço IP para ListenerName. Também é único e não combina com nenhum dos servidores ou nós. Aplicativos e usuários finais usarão ListenerName ou IPAddress para se conectarem ao AG.
      • SubnetMask é a máscara de sub-rede do IPAddress. No SQL Server 2019 (15.x) e nas versões anteriores, esse valor é 255.255.255.255. No SQL Server 2022 (16.x) e versões posteriores, esse valor é 0.0.0.0.
  2. Em uma janela de consulta conectada à outra réplica, execute a instrução a seguir para inserir a réplica no AG e iniciar o processo de propagação da réplica primária para a secundária.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. Repita a Etapa 2 para a terceira réplica.

Exemplo C: duas réplicas com roteamento somente leitura (tipo de cluster de None)

Este exemplo cria uma configuração de duas réplicas que usa um tipo de cluster chamado Nenhum. Use essa configuração para o cenário de escala de leitura onde você não espera failover. Essa etapa cria o ouvinte que é a réplica primária e configura o roteamento somente leitura com funcionalidade round-robin.

  1. Execute a instrução a seguir no nó que atua como a réplica primária e contém a cópia de leitura/gravação total dos bancos de dados. Este exemplo usa semeadura automática.

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = NONE)
    FOR DATABASE <DBName> REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name: <PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(
                ALLOW_CONNECTIONS = READ_WRITE,
                READ_ONLY_ROUTING_LIST = (('LinAGN1.FullyQualified.Name'.'LinAGN2.FullyQualified.Name'))
            ),
            SECONDARY_ROLE(
                ALLOW_CONNECTIONS = ALL,
                READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:<PortOfInstance>'
            )
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                     ('LinAGN1.FullyQualified.Name',
                        'LinAGN2.FullyQualified.Name')
                     )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfInstance>')
        ),
        LISTENER '<ListenerName>' (WITH IP = (
                 '<PrimaryReplicaIPAddress>',
                 '<SubnetMask>'),
                Port = <PortOfListener>
        );
    GO
    

    Neste exemplo:

    • AGName é o nome do AG.
    • DBName é o nome do banco de dados que você usa com o AG. Também pode ser uma lista de nomes separada por vírgulas.
    • PortOfEndpoint é o número da porta do endpoint que você cria.
      • PortOfInstanceé o número de porta para a instância do SQL Server.
    • ListenerName é um nome provisório que é diferente de qualquer uma das réplicas subjacentes.
    • PrimaryReplicaIPAddress é o endereço IP da réplica primária.
      • SubnetMask é a máscara de sub-rede do IPAddress. No SQL Server 2019 (15.x) e nas versões anteriores, esse valor é 255.255.255.255. No SQL Server 2022 (16.x) e versões posteriores, esse valor é 0.0.0.0.
  2. Ingresse a réplica secundária no AG e inicie a propagação automática.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = NONE);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    

Criar o logon SQL Server e as permissões para o Pacemaker

Um cluster de alta disponibilidade do Pacemaker que usa o SQL Server no Linux precisa de acesso à instância do SQL Server e permissões no próprio AG. Essas etapas criam o logon e as permissões associadas, juntamente com um arquivo que informa ao Pacemaker como autenticar no SQL Server.

  1. Em uma janela de consulta conectada à primeira réplica, execute o seguinte script.

    CREATE LOGIN PMLogin
        WITH PASSWORD = '<password>';
    GO
    
    GRANT VIEW SERVER STATE TO PMLogin;
    GO
    
    GRANT ALTER, CONTROL, VIEW DEFINITION
    ON AVAILABILITY GROUP::<AGThatWasCreated> TO PMLogin;
    GO
    
  2. No Nó 1, adicione as seguintes duas linhas ao /var/opt/mssql/secrets/passwd arquivo:

    PMLogin
    
    <password>
    

    Talvez você precise aumentar suas permissões para sudo editar esse arquivo.

  3. Bloqueie o arquivo:

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  4. Repita as Etapas 1 a 5 nos outros servidores que servem como réplicas.

Crie os recursos do grupo de disponibilidade em um cluster do Pacemaker (somente tipo External)

Depois de criar um AG no SQL Server, você deve criar os recursos correspondentes no Pacemaker quando especificar um tipo de cluster externo. Um AG precisa de dois recursos: o recurso do grupo de disponibilidade e um recurso de endereço IP. Configurar o recurso de endereço IP é opcional se você não estiver usando um ouvinte. No entanto, é recomendável quando você precisa de funcionalidades de escuta.

O recurso de AG que você cria é um tipo de recurso chamado clone. O recurso AG possui cópias em cada nó, e um recurso controlador chamado recurso promovido . O recurso promovido corresponde ao servidor que hospeda a réplica principal. Os outros recursos hospedam réplicas secundárias (regulares ou apenas de configuração), e podem ser promovidos em um failover.

Note

No SQL Server 2025 (17.x) com Atualização Cumulativa (CU) 3 e versões posteriores, o agente de HA do Pacemaker v2 (versão prévia) está disponível para RHEL (Red Hat Enterprise Linux) e Ubuntu via o pacote mssql-server-ha. Você pode avaliar o agente HA do Pacemaker v2 em implantações não produtivas. O agente HA existente do Pacemaker (v1) ainda é totalmente suportado para implantações em produção. Para obter mais informações, consulte o agente de HA do Pacemaker v2 (versão prévia).

Agente de HA do Pacemaker v1

  1. Crie o recurso de AG no Pacemaker usando o agente de HA do Pacemaker (v1): (ocf:mssql:ag)

    sudo pcs resource create <NameForAGResource> ocf:mssql:ag ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    Neste exemplo, NameForAGResource é o nome exclusivo que você dá a esse recurso de cluster para o AG e AGName é o nome do AG que você criou.

  2. Crie o recurso de endereço IP para o AG que você associa à funcionalidade do ouvinte.

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    Neste exemplo, NameForIPResource é o nome exclusivo do recurso IP e IPAddress é o endereço IP estático que você atribui ao recurso.

  3. Para garantir que o endereço IP e o recurso de AG são executados no mesmo nó, configure uma restrição de colocação.

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    Neste exemplo, NameForIPResource é o nome do recurso de IP e NameForAGResource é o nome do recurso de AG.

  4. Crie uma restrição de ordenação para garantir que o recurso AG esteja rodando antes do endereço IP. Embora a restrição de colocação implique uma restrição de ordenação, esta etapa a aplica.

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    Neste exemplo, NameForIPResource é o nome do recurso de IP e NameForAGResource é o nome do recurso de AG.

Agente de HA do Pacemaker v2 (versão preliminar)

O agente HA do Pacemaker v2 utiliza uma arquitetura baseada em serviços. O agente funciona como um serviço de sistema dedicado chamado mssql-pcsag, que é responsável por lidar com operações de alta disponibilidade específicas do SQL Server e comunicação com o Pacemaker.

Você gerencia o mssql-pcsag serviço por meio de controles padrão de serviço do sistema. Inicie, pare, reinicie e verifique o status desse serviço conforme necessário com os seguintes comandos:

sudo systemctl start mssql-pcsag  # Start the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl stop mssql-pcsag  # Stop the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl restart mssql-pcsag  # Restart the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl status mssql-pcsag  # Check the status of the Pacemaker HA agent v2 (mssql-pcsag) service

O Pacemaker interage com grupos de disponibilidade do SQL Server por meio do mssql-pcsag serviço. Para que o monitoramento e o failover do grupo de disponibilidade funcionem corretamente:

  • O cluster Pacemaker deve estar em execução.
  • O mssql-pcsag serviço deve estar em execução.

Embora o Pacemaker e mssql-pcsag sejam componentes separados, eles operam juntos em tempo de execução. Se o Pacemaker ou o mssql-pcsag serviço pararem, as operações de failover do grupo de disponibilidade não funcionam como esperado.

Note

Reiniciar o serviço não reinicia o mssql-pcsag SQL Server. Da mesma forma, reiniciar o SQL Server não reinicia automaticamente o agente de HA do Pacemaker. Verifique se ambos os serviços estão em execução durante a solução de problemas.

O agente de HA do Pacemaker v2 apresenta melhorias de confiabilidade e desempenho em relação ao agente anterior, incluindo:

  • Performance de failover aprimorada para reduzir tanto os tempos de failover planejados quanto os não planejados.

  • Suporte para políticas flexíveis de failover automático, incluindo a configuração do nível de condição de falha e do tempo limite de verificação de integridade.

    Exemplo: a instrução Transact-SQL a seguir altera o nível de condição de falha de um grupo de disponibilidade existente chamado AG1 para o nível 2:

    ALTER AVAILABILITY GROUP AG1 SET (FAILURE_CONDITION_LEVEL = 2);
    

    Exemplo: a instrução Transact-SQL a seguir altera o limite de tempo limite de verificação de integridade de um grupo de disponibilidade existente chamado AG1 para 60.000 milissegundos (60 segundos).

    ALTER AVAILABILITY GROUP AG1 SET (HEALTH_CHECK_TIMEOUT = 60000);
    

    Exemplo: depois de aplicar a configuração, use a seguinte instrução Transact-SQL para verificar o nível de condição de falha configurado e o tempo limite de verificação de integridade para grupos de disponibilidade.

    SELECT failure_condition_level,
           health_check_timeout
    FROM sys.availability_groups;
    
  • Suporte para TLS 1.3 para comunicação entre o cluster pacemaker e o SQL Server.

  1. Crie o recurso de Grupo de Disponibilidade (AG) no Pacemaker usando o agente de Alta Disponibilidade (HA) do Pacemaker v2: (ocf:mssql:agv2)

    sudo pcs resource create <NameForAGResource> ocf:mssql:agv2 ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    Se estiver atualizando do agente de HA do Pacemaker v1 para v2, remova o recurso de AG existente antes de criar o recurso agv2:

    sudo pcs resource delete <NameForAGResource>
    

    Essa operação interrompe temporariamente a sincronização de AG enquanto o recurso está sendo recriado. Excluir e recriar o recurso de AG do Pacemaker não exclui o AG. Depois que o recurso é recriado, o Pacemaker retoma automaticamente o gerenciamento e a sincronização de AG.

  2. Crie o recurso de endereço IP para o AG que você associa à funcionalidade do ouvinte.

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    Neste exemplo, NameForIPResource é o nome exclusivo do recurso IP e IPAddress é o endereço IP estático que você atribui ao recurso.

  3. Para garantir que o endereço IP e o recurso de AG são executados no mesmo nó, configure uma restrição de colocação.

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    Neste exemplo, NameForIPResource é o nome do recurso de IP e NameForAGResource é o nome do recurso de AG.

  4. Crie uma restrição de ordenação para garantir que o recurso AG esteja em funcionamento antes do endereço IP. Embora a restrição de colocação implique uma restrição de ordenação, esta etapa a aplica.

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    Neste exemplo, NameForIPResource é o nome do recurso de IP e NameForAGResource é o nome do recurso de AG.