Compartilhar via


Tutorial: Configurar grupos de disponibilidade para o SQL Server em máquinas virtuais RHEL no Azure

Aplica-se a: SQL Server de VM do Azure

Observação

Usamos o SQL Server 2017 (14.x) com RHEL 7.6 neste tutorial, mas é possível usar o SQL Server 2019 (15.x) no RHEL 7 ou RHEL 8 para configurar a alta disponibilidade. Os comandos para configurar os recursos do grupo de disponibilidade e cluster do Pacemake foram alterados no RHEL 8. Portanto, é importante examinar o artigo Criar recurso de grupo de disponibilidade e os recursos do RHEL 8 para obter mais informações sobre os comandos corretos.

Neste tutorial, você aprenderá a:

  • Criar um grupo de recursos, conjunto de disponibilidade e VMs (máquinas virtuais) do Linux do Azure
  • Habilitar HA (alta disponibilidade)
  • Criar um cluster do Pacemaker
  • Configurar um agente de isolamento criando um dispositivo STONITH
  • Instalar o SQL Server e mssql-tools no RHEL
  • Configurar o grupo de disponibilidade Always On do SQL Server
  • Configurar os recursos do AG (grupo de disponibilidade) no cluster do Pacemaker
  • Testar um failover e o agente de isolamento

Este tutorial usa a CLI do Azure para implantar recursos no Azure.

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.

Pré-requisitos

  • Este artigo exige a versão 2.0.30 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.

Criar um grupo de recursos

Se você tiver mais de uma assinatura, defina a assinatura na qual você deseja implantar esses recursos.

Use o comando a seguir para criar um grupo de recursos <resourceGroupName> em uma região. Substitua <resourceGroupName> por um nome de sua escolha. Estamos usando East US 2 para este tutorial. Para obter mais informações, confira o Início Rápido a seguir.

az group create --name <resourceGroupName> --location eastus2

Criar um conjunto de disponibilidade

A próxima etapa é criar um conjunto de disponibilidade. Execute o comando a seguir no Azure Cloud Shell e substitua <resourceGroupName> pelo nome do grupo de recursos. Escolha um nome para <availabilitySetName>.

az vm availability-set create \
    --resource-group <resourceGroupName> \
    --name <availabilitySetName> \
    --platform-fault-domain-count 2 \
    --platform-update-domain-count 2

Você deverá obter os seguintes resultados depois que o comando for concluído:

{
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/availabilitySets/<availabilitySetName>",
  "location": "eastus2",
  "name": "<availabilitySetName>",
  "platformFaultDomainCount": 2,
  "platformUpdateDomainCount": 2,
  "proximityPlacementGroup": null,
  "resourceGroup": "<resourceGroupName>",
  "sku": {
    "capacity": null,
    "name": "Aligned",
    "tier": null
  },
  "statuses": null,
  "tags": {},
  "type": "Microsoft.Compute/availabilitySets",
  "virtualMachines": []
}

Criar VMs do RHEL dentro do conjunto de disponibilidade

Aviso

Se você escolher a imagem de pagamento conforme o uso (PAYG) do RHEL e configurar a alta disponibilidade (HA), talvez seja necessário registrar sua assinatura. Isso pode fazer com que você pague duas vezes pela assinatura, pois você será cobrado pela assinatura do RHEL do Microsoft Azure para a VM e por uma assinatura do Red Hat. Para obter mais informações, consulte https://access.redhat.com/solutions/2458541.

Para evitar ser “cobrado duas vezes”, use uma imagem de HA do rHEL ao criar a VM do Azure. Imagens oferecidas como imagens RHEL-HA também são imagens PAYG com o repositório de HA pré-habilitado.

  1. Obtenha uma lista de imagens de VM (máquina virtual) que oferecem o RHEL com HA:

    az vm image list --all --offer "RHEL-HA"
    

    Você deve ver o seguintes resultados:

    [
      {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "7.4",
    "urn": "RedHat:RHEL-HA:7.4:7.4.2019062021",
    "version": "7.4.2019062021"
       },
       {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "7.5",
    "urn": "RedHat:RHEL-HA:7.5:7.5.2019062021",
    "version": "7.5.2019062021"
        },
        {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "7.6",
    "urn": "RedHat:RHEL-HA:7.6:7.6.2019062019",
    "version": "7.6.2019062019"
         },
         {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "8.0",
    "urn": "RedHat:RHEL-HA:8.0:8.0.2020021914",
    "version": "8.0.2020021914"
         },
         {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "8.1",
    "urn": "RedHat:RHEL-HA:8.1:8.1.2020021914",
    "version": "8.1.2020021914"
          },
          {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "80-gen2",
    "urn": "RedHat:RHEL-HA:80-gen2:8.0.2020021915",
    "version": "8.0.2020021915"
           },
           {
    "offer": "RHEL-HA",
    "publisher": "RedHat",
    "sku": "81_gen2",
    "urn": "RedHat:RHEL-HA:81_gen2:8.1.2020021915",
    "version": "8.1.2020021915"
           }
    ]
    

    Para este tutorial, vamos escolher a imagem RedHat:RHEL-HA:7.6:7.6.2019062019 para o exemplo do RHEL 7 e escolher RedHat:RHEL-HA:8.1:8.1.2020021914 para o exemplo do RHEL 8.

    Você também pode escolher o SQL Server 2019 (15.x) pré-instalado em imagens do RHEL8-HA. Para obter a lista dessas imagens, execute o seguinte comando:

    az vm image list --all --offer "sql2019-rhel8"
    

    Você deve ver o seguintes resultados:

    [
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "enterprise",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:enterprise:15.0.200317",
          "version": "15.0.200317"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "enterprise",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:enterprise:15.0.200512",
          "version": "15.0.200512"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "sqldev",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:sqldev:15.0.200317",
          "version": "15.0.200317"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "sqldev",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:sqldev:15.0.200512",
          "version": "15.0.200512"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "standard",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:standard:15.0.200317",
          "version": "15.0.200317"
       },
       {
          "offer": "sql2019-rhel8",
          "publisher": "MicrosoftSQLServer",
          "sku": "standard",
          "urn": "MicrosoftSQLServer:sql2019-rhel8:standard:15.0.200512",
          "version": "15.0.200512"
       }
    ]
    

    Se você usar uma das imagens acima para criar as máquinas virtuais, ela terá o SQL Server 2019 (15.x) pré-instalado. Ignore a seção Instalar o SQL Server e mssql-tools, conforme descrito neste artigo.

    Importante

    Os nomes de computador devem ter menos de 15 caracteres para configurar o grupo de disponibilidade. O nome de usuário não pode conter caracteres maiúsculos e as senhas devem ter mais de 12 caracteres.

  2. Queremos criar três VMs no conjunto de disponibilidade. Substitua esses valores no seguinte comando:

    • <resourceGroupName>
    • <VM-basename>
    • <availabilitySetName>
    • <VM-Size> – Um exemplo seria "Standard_D16_v3"
    • <username>
    • <adminPassword>
    for i in `seq 1 3`; do
           az vm create \
             --resource-group <resourceGroupName> \
             --name <VM-basename>$i \
             --availability-set <availabilitySetName> \
             --size "<VM-Size>"  \
             --image "RedHat:RHEL-HA:7.6:7.6.2019062019" \
             --admin-username "<username>" \
             --admin-password "<adminPassword>" \
             --authentication-type all \
             --generate-ssh-keys
    done
    

O comando acima cria as VMs e uma rede virtual padrão para essas VMs. Para obter mais informações sobre as diferentes configurações, confira o artigo az vm create.

Depois que o comando for concluído para cada VM, você deverá obter resultados semelhantes aos seguintes:

{
  "fqdns": "",
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/<VM1>",
  "location": "eastus2",
  "macAddress": "<Some MAC address>",
  "powerState": "VM running",
  "privateIpAddress": "<IP1>",
  "publicIpAddress": "",
  "resourceGroup": "<resourceGroupName>",
  "zones": ""
}

Importante

A imagem padrão criada com o comando acima cria um disco do sistema operacional de 32 GB por padrão. Possivelmente, você poderia ficar sem espaço com essa instalação padrão. Você pode usar o seguinte parâmetro adicionado ao comando az vm create acima para criar um disco do sistema operacional com 128 GB como um exemplo: --os-disk-size-gb 128.

Em seguida, você poderá configurar o LVM (Gerenciador de Volume Lógico) se precisar expandir os volumes de pastas apropriados para acomodar a instalação.

Testar a conexão com as VMs criadas

Conecte-se à VM1 ou às outras VMs usando o comando a seguir no Azure Cloud Shell. Se não for possível localizar seus IPs de VM, siga este Início Rápido no Azure Cloud Shell.

ssh <username>@publicipaddress

Se a conexão for bem-sucedida, você deverá ver a seguinte saída representando o terminal do Linux:

[<username>@<VM1> ~]$

Digite exit para sair da sessão SSH.

Habilitar alta disponibilidade

Importante

Para concluir essa parte do tutorial, você deverá ter uma assinatura do RHEL e o Complemento de Alta Disponibilidade. Se você estiver usando uma imagem recomendada na seção anterior, não é necessário registrar outra assinatura.

Conecte-se a cada nó da VM e siga a guia abaixo para habilitar a HA. Para obter mais informações, confira habilitar a assinatura de alta disponibilidade para RHEL.

Dica

Será mais fácil se você abrir uma sessão SSH para cada uma das VMs simultaneamente, pois os mesmos comandos precisarão ser executados em cada VM em todo o artigo.

Se você estiver copiando e colando vários comandos sudo e for solicitado a fornecer uma senha, os comandos adicionais não serão executados. Execute cada comando separadamente.

  1. Execute os seguintes comandos em cada VM para abrir as portas do firewall do Pacemaker:

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    
  2. Atualize e instale os pacotes do Pacemaker em todos os nós usando os seguintes comandos:

    Observação

    nmap está instalado como parte desse bloco de comandos como uma ferramenta para localizar endereços IP disponíveis em sua rede. Você não precisa instalar nmap, mas ele será útil posteriormente neste tutorial.

    sudo yum update -y
    sudo yum install -y pacemaker pcs fence-agents-all resource-agents fence-agents-azure-arm nmap
    sudo reboot
    
  3. Defina a senha do usuário padrão criado ao instalar pacotes do Pacemaker. Use a mesma senha em todos os nós.

    sudo passwd hacluster
    
  4. Use o comando a seguir para abrir o arquivo de hosts e configurar a resolução de nomes de host. Para obter mais informações, confira Configurar o AG sobre como configurar o arquivo de hosts.

    sudo vi /etc/hosts
    

    No editor vi, digite i para inserir texto e, em uma linha em branco, adicione o IP Privado da VM correspondente. Em seguida, adicione o nome da VM após um espaço ao lado do IP. Cada linha deve ter uma entrada separada.

    <IP1> <VM1>
    <IP2> <VM2>
    <IP3> <VM3>
    

    Importante

    Recomendamos que você use seu endereço IP privado no exemplo anterior. Usar o endereço IP Público nessa configuração fará a instalação falhar e não recomendamos expor sua VM a redes externas.

    Para sair do editor vi, primeiro pressione a tecla Esc e, em seguida, insira o comando :wq para gravar o arquivo e encerrar.

Criar o cluster do Pacemaker

Nesta seção, você vai habilitar e iniciar o serviço pcsd e, em seguida, configurar o cluster. Para o SQL Server em Linux, os recursos de cluster não são criados automaticamente. Você precisa habilitar e criar os recursos do Pacemaker manualmente. Para obter mais informações, confira o artigo sobre como configurar uma instância de cluster de failover para o RHEL

Habilite e inicie o serviço pcsd e o Pacemaker

  1. Execute os comandos em todos os nós. Esses comandos permitem que os nós ingressem novamente no cluster após a reinicialização de cada nó.

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  2. Remova todas as configurações de cluster existentes de todos os nós. Execute o comando a seguir:

    sudo pcs cluster destroy
    sudo systemctl enable pacemaker
    
  3. No nó primário, execute os comandos a seguir para configurar o cluster.

    • Ao executar o comando pcs cluster auth para autenticar os nós de cluster, você deverá fornecer uma senha. Insira a senha do usuário hacluster usuário criado anteriormente.

    RHEL7

    sudo pcs cluster auth <VM1> <VM2> <VM3> -u hacluster
    sudo pcs cluster setup --name az-hacluster <VM1> <VM2> <VM3> --token 30000
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    RHEL8

    Para o RHEL 8, você precisa autenticar os nós separadamente. Insira manualmente o nome de usuário e a senha do hacluster quando solicitado.

    sudo pcs host auth <node1> <node2> <node3>
    sudo pcs cluster setup <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    
  4. Execute o comando a seguir para verificar se todos os nós estão online.

    sudo pcs status
    

    RHEL 7

    Se todos os nós estiverem online, você verá uma saída semelhante à seguinte:

    Cluster name: az-hacluster
    
    WARNINGS:
    No stonith devices and stonith-enabled is not false
    
    Stack: corosync
    Current DC: <VM2> (version 1.1.19-8.el7_6.5-c3c624ea3d) - partition with quorum
    Last updated: Fri Aug 23 18:27:57 2019
    Last change: Fri Aug 23 18:27:56 2019 by hacluster via crmd on <VM2>
    
    3 nodes configured
    0 resources configured
    
    Online: [ <VM1> <VM2> <VM3> ]
    
    No resources
    
    Daemon Status:
          corosync: active/enabled
          pacemaker: active/enabled
          pcsd: active/enabled
    

    RHEL 8

    Cluster name: az-hacluster
    
    WARNINGS:
    No stonith devices and stonith-enabled is not false
    
    Cluster Summary:
      * Stack: corosync
      * Current DC: <VM2> (version 1.1.19-8.el7_6.5-c3c624ea3d) - partition with quorum
      * Last updated: Fri Aug 23 18:27:57 2019
      * Last change: Fri Aug 23 18:27:56 2019 by hacluster via crmd on <VM2>
      * 3 nodes configured
      * 0 resource instances configured
    
    Node List:
      * Online: [ <VM1> <VM2> <VM3> ]
    
    Full List of Resources:
      * No resources
    
    Daemon Status:
      * corosync: active/enabled
      * pacemaker: active/enabled
      * pcsd: active/enabled
    
  5. Defina os votos esperados no cluster ativo como 3. Esse comando afeta apenas o cluster ativo e não altera os arquivos de configuração.

    Em todos os nós, defina os votos esperados com o seguinte comando:

    sudo pcs quorum expected-votes 3
    

Configurar um agente de isolamento

Para configurar um agente de isolamento, as instruções a seguir são modificadas para este tutorial. Para obter mais informações, confira criar uma conta STONITH.

Confira a versão do agente do Azure Fence para verificar se ele está atualizado. Use o seguinte comando:

sudo yum info fence-agents-azure-arm

Você deverá ver uma saída semelhante ao exemplo abaixo.

Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Installed Packages
Name        : fence-agents-azure-arm
Arch        : x86_64
Version     : 4.2.1
Release     : 11.el7_6.8
Size        : 28 k
Repo        : installed
From repo   : rhel-ha-for-rhel-7-server-eus-rhui-rpms
Summary     : Fence agent for Azure Resource Manager
URL         : https://github.com/ClusterLabs/fence-agents
License     : GPLv2+ and LGPLv2+
Description : The fence-agents-azure-arm package contains a fence agent for Azure instances.

Registrar um novo aplicativo no Microsoft Entra ID

Para registrar um novo aplicativo no Microsoft Entra ID (antigo Azure Active Directory), execute estas etapas:

  1. Ir para https://portal.azure.com.
  2. Abra o painel de propriedades do Microsoft Entra ID e anote a Tenant ID.
  3. Selecione Registros do Aplicativo.
  4. Selecione Novo registro.
  5. Insira um Nome, como <resourceGroupName>-app. Em Tipos de conta compatíveis, selecione Somente contas neste diretório organizacional (Somente Microsoft – único locatário).
  6. Selecione Web para Redirecionar o URI e insira uma URL (por exemplo, http://localhost) e selecione Adicionar. A URL de logon pode ser qualquer URL válida. Depois de terminar, selecione Registrar.
  7. Escolha Certificados e segredos para seu novo Registro de aplicativo e selecione Novo segredo do cliente.
  8. Insira uma descrição para uma nova chave (segredo do cliente), selecione e selecione Adicionar.
  9. Anote o valor do segredo. É usado como a senha para a entidade de serviço.
  10. Selecione Visão geral. Anote a ID do Aplicativo. Ela é usada como o nome de usuário (ID de logon nas etapas a seguir) da entidade de serviço.

Criar uma função personalizada para o agente de limite

Siga o tutorial para Criar uma função personalizada do Azure usando a CLI do Azure.

Seu arquivo JSON deve ser semelhante ao seguinte exemplo:

  • Substitua <username> por um nome de sua escolha. Isso ocorre para evitar qualquer duplicação ao criar essa definição de função.
  • Substitua <subscriptionId> por sua ID da Assinatura do Azure.
{
  "Name": "Linux Fence Agent Role-<username>",
  "Id": null,
  "IsCustom": true,
  "Description": "Allows to power-off and start virtual machines",
  "Actions": [
    "Microsoft.Compute/*/read",
    "Microsoft.Compute/virtualMachines/powerOff/action",
    "Microsoft.Compute/virtualMachines/start/action"
  ],
  "NotActions": [
  ],
  "AssignableScopes": [
    "/subscriptions/<subscriptionId>"
  ]
}

Para adicionar a função, execute o seguinte comando:

  • Substitua <filename> pelo nome do arquivo.
  • Se você estiver executando o comando de um caminho, que não seja a pasta na qual o arquivo foi salvo, inclua o caminho de pasta do arquivo no comando.
az role definition create --role-definition "<filename>.json"

Você deve ver o seguinte resultado:

{
  "assignableScopes": [
    "/subscriptions/<subscriptionId>"
  ],
  "description": "Allows to power-off and start virtual machines",
  "id": "/subscriptions/<subscriptionId>/providers/Microsoft.Authorization/roleDefinitions/<roleNameId>",
  "name": "<roleNameId>",
  "permissions": [
    {
      "actions": [
        "Microsoft.Compute/*/read",
        "Microsoft.Compute/virtualMachines/powerOff/action",
        "Microsoft.Compute/virtualMachines/start/action"
      ],
      "dataActions": [],
      "notActions": [],
      "notDataActions": []
    }
  ],
  "roleName": "Linux Fence Agent Role-<username>",
  "roleType": "CustomRole",
  "type": "Microsoft.Authorization/roleDefinitions"
}

Atribuir a função personalizada à Entidade de Serviço

Atribua a função personalizada Linux Fence Agent Role-<username> que foi criada na última etapa para a Entidade de Serviço. Não mais use a função de proprietário.

  1. Acesse https://portal.azure.com
  2. Abra o painel Todos os recursos
  3. Selecione a máquina virtual do primeiro nó do cluster
  4. Selecione Controle de Acesso (IAM)
  5. Selecione Adicionar uma atribuição de função
  6. Selecione a função Linux Fence Agent Role-<username> na lista Função
  7. Na lista Selecionar, insira o nome do aplicativo criado anteriormente, <resourceGroupName>-app.
  8. Selecione Salvar
  9. Repita essas etapas em todos os nós de cluster.

Criar os dispositivos STONITH

Execute os seguintes comandos no nó 1:

  • Substitua o <ApplicationID> pelo valor da ID do seu registro de aplicativo.
  • Substitua o <servicePrincipalPassword> pelo valor do segredo do cliente.
  • Substitua o <resourceGroupName> pelo grupo de recursos da sua assinatura usada para este tutorial.
  • Substitua <tenantID> e o <subscriptionId> de sua assinatura do Azure.
sudo pcs property set stonith-timeout=900
sudo pcs stonith create rsc_st_azure fence_azure_arm login="<ApplicationID>" passwd="<servicePrincipalPassword>" resourceGroup="<resourceGroupName>" tenantId="<tenantID>" subscriptionId="<subscriptionId>" power_timeout=240 pcmk_reboot_timeout=900

Como já adicionamos uma regra ao nosso firewall para permitir o serviço de HA (--add-service=high-availability), não é necessário abrir as seguintes portas de firewall em todos os nós: 2224, 3121, 21064, 5405. No entanto, se você tiver qualquer tipo de problemas de conexão com a HA, use o comando a seguir para abrir essas portas associadas à HA.

Dica

Ou você pode adicionar todas as portas neste tutorial de uma vez para economizar tempo. As portas que precisam ser abertas são explicadas em suas seções relevantes abaixo. Se quiser adicionar todas as portas agora, adicione as portas adicionais: 1433 e 5022.

sudo firewall-cmd --zone=public --add-port=2224/tcp --add-port=3121/tcp --add-port=21064/tcp --add-port=5405/tcp --permanent
sudo firewall-cmd --reload

Instalar o SQL Server e mssql-tools

Observação

Caso tenha criado as VMs com o SQL Server 2019 (15.x) pré-instalado no RHEL8-HA, você poderá ignorar as etapas a seguir para instalar o SQL Server e mssql-tools e iniciar a seção Configurar um grupo de disponibilidade depois de configurar a senha SA em todas as VMs executando o comando sudo /opt/mssql/bin/mssql-conf set-sa-password em todas as VMs.

Use a seção abaixo para instalar o SQL Server e o mssql-tools nas VMs. Você pode escolher um dos exemplos a seguir para instalar o SQL Server 2017 (14.x) no RHEL 7 ou o SQL Server 2019 (15.x) no RHEL 8. Execute cada uma dessas ações em todos os nós. Para obter mais informações, confira Instalar o SQL Server em uma VM do Red Hat.

Instalar o SQL Server em VMs

Os seguintes comandos são usados para instalar o SQL Server:

RHEL 7 com SQL Server 2017

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo
sudo yum install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
sudo yum install mssql-server-ha

RHEL 8 com SQL Server 2019

sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo
sudo yum install -y mssql-server
sudo /opt/mssql/bin/mssql-conf setup
sudo yum install mssql-server-ha

Abrir a porta 1433 do firewall para conexões remotas

Você precisa abrir a porta 1433 na VM para se conectar remotamente. Use os seguintes comandos para abrir a porta 1433 no firewall de cada VM:

sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload

Instalar as ferramentas da linha de comando do SQL Server

Os comandos a seguir são usados para instalar as ferramentas de linha de comando do SQL Server. Para obter mais informações, confira instalar as ferramentas de linha de comando do SQL Server.

RHEL 7

sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum install -y mssql-tools unixODBC-devel

RHEL 8

sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo
sudo yum install -y mssql-tools unixODBC-devel

Observação

Para sua conveniência, adicione /opt/mssql-tools/bin/ à sua variável de ambiente PATH. Isso permite que você execute as ferramentas sem especificar o caminho completo. Execute os seguintes comandos para modificar o PATH para sessões de logon e sessões interativas/que não são de logon:

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

Verificar o status do SQL Server

Depois que você concluir a configuração, você pode verificar o status do SQL Server e se ele está em execução:

systemctl status mssql-server --no-pager

Você deve ver o seguinte resultado:

● mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/usr/lib/systemd/system/mssql-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-12-05 17:30:55 UTC; 20min ago
     Docs: https://learn.microsoft.com/sql/linux
 Main PID: 11612 (sqlservr)
   CGroup: /system.slice/mssql-server.service
           ├─11612 /opt/mssql/bin/sqlservr
           └─11640 /opt/mssql/bin/sqlservr

Configurar um conjunto de disponibilidade

Use as etapas a seguir para configurar um grupo de disponibilidade Always On do SQL Server para suas VMs. Para obter mais informações, confira Configurar grupos de disponibilidade Always On do SQL Server para alta disponibilidade no Linux.

Habilitar grupos de disponibilidade Always On e reiniciar o mssql-server

Habilite grupos de disponibilidade Always On em cada nó que hospeda uma instância do SQL Server. Em seguida, reinicie o mssql-server. Execute o seguinte script:

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

Criar um certificado

No momento, não damos suporte à autenticação do AD para o ponto de extremidade do grupo de disponibilidade. Portanto, devemos usar um certificado para a criptografia de ponto de extremidade do grupo de disponibilidade.

  1. Conecte-se a todos os nós usando o SSMS (SQL Server Management Studio) ou o sqlcmd. Execute os seguintes comandos para habilitar uma sessão AlwaysOn_health e criar uma chave mestra:

    Importante

    Se você estiver se conectando remotamente à sua instância do SQL Server, será necessário que a porta 1433 esteja aberta em seu firewall. Você também precisará permitir conexões de entrada para a porta 1433 em seu NSG para cada VM. Para obter mais informações, confira Criar uma regra de segurança para criar uma regra de segurança de entrada.

    • Substitua o <Master_Key_Password> por sua senha.
    ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
    GO
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Master_Key_Password>';
    
  2. Conecte-se à réplica primária usando o SSMS ou o sqlcmd. Os seguintes comandos criam um certificado em /var/opt/mssql/data/dbm_certificate.cer e uma chave privada em var/opt/mssql/data/dbm_certificate.pvk na sua réplica primária do SQL Server:

    • Substitua o <Private_Key_Password> por sua senha.
    CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
    GO
    
    BACKUP CERTIFICATE dbm_certificate
       TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
       WITH PRIVATE KEY (
               FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
               ENCRYPTION BY PASSWORD = '<Private_Key_Password>'
           );
    GO
    

Saia da sessão do sqlcmd executando o comando exit e volte para sua sessão SSH.

Copiar o certificado para as réplicas secundárias e criar os certificados no servidor

  1. Copie esses dois arquivos que foram criados na mesma localização em todos os servidores que hospedarão as réplicas de disponibilidade.

    No servidor primário, execute o seguinte comando scp para copiar o certificado para os servidores de destino:

    • Substitua <username> e <VM2> pelo nome de usuário e pelo nome da VM de destino que você está usando.
    • Execute este comando para todas as réplicas secundárias.

    Observação

    Você não precisa executar o sudo -i, que fornece o ambiente raiz. Você poderia simplesmente executar o comando sudo na frente de cada comando, como fizemos anteriormente neste tutorial.

    # The below command allows you to run commands in the root environment
    sudo -i
    
    scp /var/opt/mssql/data/dbm_certificate.* <username>@<VM2>:/home/<username>
    
  2. No servidor de destino, execute o seguinte comando:

    • Substitua <username> por seu nome de usuário.
    • O comando mv move os arquivos ou o diretório de um local para outro.
    • O comando chown é usado para alterar o proprietário e o grupo de arquivos, diretórios ou links.
    • Execute estes comandos para todas as réplicas secundárias.
    sudo -i
    mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/
    cd /var/opt/mssql/data
    chown mssql:mssql dbm_certificate.*
    
  3. O script Transact-SQL a seguir cria um certificado com base no backup que você criou na réplica primária do SQL Server. Atualize o script com senhas fortes. A senha de descriptografia é a mesma senha que você usou para criar o arquivo .pvk na etapa anterior. Para criar o certificado, execute o seguinte script usando o sqlcmd ou SSMS em todos os servidores secundários:

    CREATE CERTIFICATE dbm_certificate
        FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
        WITH PRIVATE KEY (
        FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
        DECRYPTION BY PASSWORD = '<Private_Key_Password>'
                );
    GO
    

Criar os pontos de extremidade de espelhamento de banco de dados em todas as réplicas

Execute o seguinte script em todas as instâncias do SQL Server usando o sqlcmd ou SSMS:

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING (
    ROLE = ALL,
    AUTHENTICATION = CERTIFICATE dbm_certificate,
ENCRYPTION = REQUIRED ALGORITHM AES
);
GO

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO

Crie o grupo de disponibilidade

Conecte-se à instância do SQL Server que hospeda a réplica primária usando o sqlcmd ou o SSMS. Execute o seguinte comando para criar o grupo de disponibilidade:

  • Substitua ag1 pelo nome do Grupo de Disponibilidade desejado.
  • Substitua os valores <VM1>, <VM2> e <VM3> pelos nomes das instâncias do SQL Server que hospedam as réplicas.
CREATE AVAILABILITY GROUP [ag1]
     WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)
     FOR REPLICA ON
         N'<VM1>'
          WITH (
             ENDPOINT_URL = N'tcp://<VM1>:5022',
             AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
             FAILOVER_MODE = EXTERNAL,
             SEEDING_MODE = AUTOMATIC
             ),
         N'<VM2>'
          WITH (
             ENDPOINT_URL = N'tcp://<VM2>:5022',
             AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
             FAILOVER_MODE = EXTERNAL,
             SEEDING_MODE = AUTOMATIC
             ),
         N'<VM3>'
         WITH(
            ENDPOINT_URL = N'tcp://<VM3>:5022',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC
            );
GO

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
GO

Criar um logon do SQL Server para o Pacemaker

Em todas as instâncias do SQL Server, crie um logon de SQL Server para o Pacemaker. O Transact-SQL a seguir cria um logon.

  • Substitua <password> por sua senha complexa.
USE [master]
GO

CREATE LOGIN [pacemakerLogin] with PASSWORD= N'<password>';
GO

ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin];
GO

Em todas as instâncias do SQL Server, salve as credenciais usadas para o logon do SQL Server.

  1. Crie o arquivo:

    sudo vi /var/opt/mssql/secrets/passwd
    
  2. Adicione as seguintes linhas ao arquivo:

    pacemakerLogin
    <password>
    

    Para sair do editor vi, primeiro pressione a tecla Esc e, em seguida, insira o comando :wq para gravar o arquivo e encerrar.

  3. Torne o arquivo apenas legível pela raiz:

    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

Ingressar réplicas secundárias ao grupo de disponibilidade

  1. Para ingressar as réplicas secundárias no grupo de disponibilidade, você precisa abrir a porta 5022 no firewall para todos os servidores. Execute o seguinte comando em sua sessão SSH:

    sudo firewall-cmd --zone=public --add-port=5022/tcp --permanent
    sudo firewall-cmd --reload
    
  2. Em suas réplicas secundárias, execute os seguintes comandos para ingressá-los ao grupo de disponibilidade:

    ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
    GO
    
  3. Execute o seguinte script Transact-SQL na réplica primária e em cada réplica secundária:

    GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::ag1 TO pacemakerLogin;
    GO
    
    GRANT VIEW SERVER STATE TO pacemakerLogin;
    GO
    
  4. Depois que as réplicas secundárias forem ingressadas, você poderá vê-las no Pesquisador de Objetos do SSMS expandindo o nó Alta Disponibilidade Always On:

    A captura de tela mostra as réplicas de disponibilidade primárias e secundárias.

Adicionar um banco de dados ao grupo de disponibilidade

Seguimos o artigo de configurar o grupo de disponibilidade ao adicionar um banco de dados.

Os comandos Transact-SQL a seguir são usados nesta etapa. Execute estes comandos na réplica primária:

CREATE DATABASE [db1]; -- creates a database named db1
GO

ALTER DATABASE [db1] SET RECOVERY FULL; -- set the database in full recovery model
GO

BACKUP DATABASE [db1] -- backs up the database to disk
   TO DISK = N'/var/opt/mssql/data/db1.bak';
GO

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1]; -- adds the database db1 to the AG
GO

Verificar se o banco de dados foi criado nos servidores secundários

Em cada réplica secundária do SQL Server, execute a seguinte consulta para ver se o banco de dados db1 foi criado e está em um estado SINCRONIZADO:

SELECT * FROM sys.databases WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

Se o synchronization_state_desc listar SINCRONIZADO para db1, isso significará que as réplicas estão sincronizadas. As secundárias estão mostrando db1 na réplica primária.

Criar recursos do grupo de disponibilidade no cluster do Pacemaker

Seguimos o guia para criar os recursos do grupo de disponibilidade no cluster do Pacemaker.

Observação

Comunicação livre de desvio

Este artigo contém referências ao termo subordinado, um termo que a Microsoft considera ofensivo quando usado neste contexto. O termo aparece neste artigo porque ele atualmente aparece no software. Quando o termo for removido do software, também o removeremos do artigo.

Criar o recurso de cluster do grupo de disponibilidade

  1. Use um dos comandos a seguir com base no ambiente escolhido antes para criar o recurso ag_cluster no grupo de disponibilidade ag1.

    RHEL 7

    sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=30s master notify=true
    

    RHEL 8

    sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=30s promotable notify=true
    
  2. Confira se os seus recursos estão online antes de continuar usando o seguinte comando:

    sudo pcs resource
    

    Você deve ver o seguinte resultado:

    RHEL 7

    [<username>@VM1 ~]$ sudo pcs resource
    Master/Slave Set: ag_cluster-master [ag_cluster]
    Masters: [ <VM1> ]
    Slaves: [ <VM2> <VM3> ]
    

    RHEL 8

    [<username>@VM1 ~]$ sudo pcs resource
    * Clone Set: ag_cluster-clone [ag_cluster] (promotable):
    * ag_cluster             (ocf::mssql:ag) :            Slave VMrhel3 (Monitoring)
    * ag_cluster             (ocf::mssql:ag) :            Master VMrhel1 (Monitoring)
    * ag_cluster             (ocf::mssql:ag) :            Slave VMrhel2 (Monitoring)
    

Criar um recurso de IP virtual

  1. Use um endereço IP estático disponível de sua rede para criar um recurso de IP virtual. Você pode encontrar um usando a ferramenta de comando nmap.

    nmap -sP <IPRange>
    # For example: nmap -sP 10.0.0.*
    # The above will scan for all IP addresses that are already occupied in the 10.0.0.x space.
    
  2. Defina a propriedade stonith-enabled como false:

    sudo pcs property set stonith-enabled=false
    
  3. Crie o recurso de IP virtual usando o comando a seguir. Substitua <availableIP> por um endereço IP não utilizado.

    sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<availableIP>
    

Adicionar restrições

  1. Para garantir que o endereço IP e o recurso do AG estejam em execução no mesmo nó, uma restrição de colocalização deve ser configurada. Execute o comando a seguir:

    RHEL 7

    sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master
    

    RHEL 8

     sudo pcs constraint colocation add virtualip with master ag_cluster-clone INFINITY with-rsc-role=Master
    
  2. Crie uma restrição de ordenação para garantir que o recurso AG esteja em funcionamento antes do endereço IP. Enquanto a restrição de colocalização implica uma restrição de ordenação, isso a impõe.

    RHEL 7

    sudo pcs constraint order promote ag_cluster-master then start virtualip
    

    RHEL 8

    sudo pcs constraint order promote ag_cluster-clone then start virtualip
    
  3. Para verificar as restrições, execute o seguinte comando:

    sudo pcs constraint list --full
    

    Você deve ver o seguinte resultado:

    RHEL 7

    Location Constraints:
    Ordering Constraints:
          promote ag_cluster-master then start virtualip (kind:Mandatory) (id:order-ag_cluster-master-virtualip-mandatory)
    Colocation Constraints:
          virtualip with ag_cluster-master (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-master-INFINITY)
    Ticket Constraints:
    

    RHEL 8

    Location Constraints:
    Ordering Constraints:
            promote ag_cluster-clone then start virtualip (kind:Mandatory) (id:order-ag_cluster-clone-virtualip-mandatory)
    Colocation Constraints:
            virtualip with ag_cluster-clone (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-clone-INFINITY)
    Ticket Constraints:
    

Reabilitar stonith

Estamos prontos para o teste. Reabilite o stonith no cluster executando o seguinte comando no Nó 1:

sudo pcs property set stonith-enabled=true

Verificar o status do cluster

Você pode verificar o status dos recursos de cluster usando o seguinte comando:

[<username>@VM1 ~]$ sudo pcs status
Cluster name: az-hacluster
Stack: corosync
Current DC: <VM3> (version 1.1.19-8.el7_6.5-c3c624ea3d) - partition with quorum
Last updated: Sat Dec  7 00:18:38 2019
Last change: Sat Dec  7 00:18:02 2019 by root via cibadmin on VM1

3 nodes configured
5 resources configured

Online: [ <VM1> <VM2> <VM3> ]

Full list of resources:

 Master/Slave Set: ag_cluster-master [ag_cluster]
     Masters: [ <VM2> ]
     Slaves: [ <VM1> <VM3> ]
 virtualip      (ocf::heartbeat:IPaddr2):       Started <VM2>
 rsc_st_azure   (stonith:fence_azure_arm):      Started <VM1>

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

Failover de Teste

Para verificar se a configuração foi bem-sucedida até agora, teste um failover. Para obter mais informações, confira Failover do grupos de disponibilidade Always On no Linux.

  1. Execute o comando a seguir para fazer failover manual da réplica primária para <VM2>. Substitua <VM2> pelo valor do nome do servidor.

    RHEL 7

    sudo pcs resource move ag_cluster-master <VM2> --master
    

    RHEL 8

    sudo pcs resource move ag_cluster-clone <VM2> --master
    

    Você também pode especificar uma opção adicional para que a restrição temporária criada para mover o recurso para um nó desejado seja desabilitada automaticamente e não seja necessário executar as etapas 2 e 3 nas instruções abaixo.

    RHEL 7

    sudo pcs resource move ag_cluster-master <VM2> --master lifetime=30S
    

    RHEL 8

    sudo pcs resource move ag_cluster-clone <VM2> --master lifetime=30S
    

    Outra alternativa para automatizar as etapas 2 e 3 abaixo que desmarcam a restrição temporária no próprio comando de movimentação de recursos é combinar vários comandos em uma única linha.

    RHEL 7

    sudo pcs resource move ag_cluster-master <VM2> --master && sleep 30 && pcs resource clear ag_cluster-master
    

    RHEL 8

    sudo pcs resource move ag_cluster-clone <VM2> --master && sleep 30 && pcs resource clear ag_cluster-clone
    
  2. Se você verificar suas restrições novamente, verá que outra restrição foi adicionada devido ao failover manual:

    RHEL 7

    [<username>@VM1 ~]$ sudo pcs constraint list --full
    Location Constraints:
          Resource: ag_cluster-master
            Enabled on: VM2 (score:INFINITY) (role: Master) (id:cli-prefer-ag_cluster-master)
    Ordering Constraints:
            promote ag_cluster-master then start virtualip (kind:Mandatory) (id:order-ag_cluster-master-virtualip-mandatory)
    Colocation Constraints:
            virtualip with ag_cluster-master (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-master-INFINITY)
    Ticket Constraints:
    

    RHEL 8

    [<username>@VM1 ~]$ sudo pcs constraint list --full
    Location Constraints:
          Resource: ag_cluster-master
            Enabled on: VM2 (score:INFINITY) (role: Master) (id:cli-prefer-ag_cluster-clone)
    Ordering Constraints:
            promote ag_cluster-clone then start virtualip (kind:Mandatory) (id:order-ag_cluster-clone-virtualip-mandatory)
    Colocation Constraints:
            virtualip with ag_cluster-clone (score:INFINITY) (with-rsc-role:Master) (id:colocation-virtualip-ag_cluster-clone-INFINITY)
    Ticket Constraints:
    
  3. Remova a restrição com a ID cli-prefer-ag_cluster-master usando o seguinte comando:

    RHEL 7

    sudo pcs constraint remove cli-prefer-ag_cluster-master
    

    RHEL 8

    sudo pcs constraint remove cli-prefer-ag_cluster-clone
    
  4. Verifique os recursos de cluster usando o comando sudo pcs resource; você verá que a instância primária agora é <VM2>.

    [<username>@<VM1> ~]$ sudo pcs resource
    Master/Slave Set: ag_cluster-master [ag_cluster]
         ag_cluster (ocf::mssql:ag):        FAILED <VM1> (Monitoring)
         Masters: [ <VM2> ]
         Slaves: [ <VM3> ]
    virtualip      (ocf::heartbeat:IPaddr2):       Started <VM2>
    [<username>@<VM1> ~]$ sudo pcs resource
    Master/Slave Set: ag_cluster-master [ag_cluster]
         Masters: [ <VM2> ]
         Slaves: [ <VM1> <VM3> ]
    virtualip      (ocf::heartbeat:IPaddr2):       Started <VM2>
    

Isolamento de teste

Você pode testar o isolamento executando o comando a seguir. Tente executar o comando abaixo de <VM1> para <VM3>.

sudo pcs stonith fence <VM3> --debug

Observação

Por padrão, a ação de limite desativa e ativa o nó. Se você quiser deixar o nó offline, use a opção --off no comando.

Você deverá obter o seguinte resultado:

[<username>@<VM1> ~]$ sudo pcs stonith fence <VM3> --debug
Running: stonith_admin -B <VM3>
Return Value: 0
--Debug Output Start--
--Debug Output End--

Node: <VM3> fenced

Para obter mais informações sobre como testar um dispositivo de limite, confira o artigo Red Hat a seguir.

Próxima etapa