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

Aplica-se a:SQL Server na VM do Azure

Nota

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 o cluster do Pacemaker e os recursos do grupo de disponibilidade foram alterados no RHEL 8, e você desejará consultar o artigo Criar recurso de grupo de disponibilidade e Recursos do RHEL 8 para obter mais informações sobre os comandos corretos.

Neste tutorial, irá aprender a:

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

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

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

Pré-requisitos

  • Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.

  • Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.

    • Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.

    • Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.

    • Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.

  • Este artigo requer a versão 2.0.30 ou posterior da CLI do Azure. Se estiver 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 para a qual deseja implantar esses recursos.

Use o comando a seguir para criar um grupo <resourceGroupName> de recursos 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, consulte o seguinte Guia de início rápido.

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

Criar um conjunto de disponibilidade

A próxima etapa é criar um conjunto de disponibilidade. Execute o seguinte comando no Azure Cloud Shell e substitua <resourceGroupName> pelo nome do seu 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ê deve obter os seguintes resultados assim 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 RHEL dentro do conjunto de disponibilidade

Aviso

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

Para evitar ser "cobrado duas vezes", use uma imagem RHEL HA ao criar a VM do Azure. As imagens oferecidas como imagens RHEL-HA também são imagens PAYG com repositório HA pré-ativado.

  1. Obtenha uma lista de imagens de máquinas virtuais que oferecem RHEL com HA:

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

    Deverá ver os 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, estamos escolhendo a imagem RedHat:RHEL-HA:7.6:7.6.2019062019 para o exemplo RHEL 7 e escolhendo RedHat:RHEL-HA:8.1:8.1.2020021914 para o exemplo RHEL 8.

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

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

    Deverá ver os 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 máquina 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 3 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 cria uma rede virtual padrão para essas VMs. Para obter mais informações sobre as diferentes configurações, consulte o artigo az vm create .

Você deve obter resultados semelhantes aos seguintes quando o comando for concluído para cada VM:

{
  "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 de sistema operacional de 32 GB por padrão. Você pode ficar sem espaço com essa instalação padrão. Você pode usar o seguinte parâmetro adicionado ao comando acima az vm create para criar um disco do sistema operacional com 128GB como exemplo: --os-disk-size-gb 128.

Em seguida, você pode configurar o LVM (Logical Volume Manager) se precisar expandir os volumes de pasta apropriados para acomodar sua instalação.

Testar a conexão com as VMs criadas

Conecte-se ao VM1 ou a outras VMs usando o seguinte comando no Azure Cloud Shell. Se você não conseguir encontrar seus IPs de VM, siga este Guia de início rápido no Azure Cloud Shell.

ssh <username>@publicipaddress

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

[<username>@<VM1> ~]$

Digite exit para sair da sessão SSH.

Habilite a alta disponibilidade

Importante

Para concluir esta parte do tutorial, você deve ter uma assinatura do RHEL e do complemento de alta disponibilidade. Se estiver a utilizar uma imagem recomendada na secção anterior, não tem de registar outra subscrição.

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

Gorjeta

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 ao longo do artigo.

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

  1. Para abrir as portas de firewall do Pacemaker, execute os seguintes comandos em cada VM:

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

    Nota

    O nmap é instalado como parte deste bloco de comandos como uma ferramenta para encontrar endereços IP disponíveis na sua rede. Você não precisa instalar o nmap, mas ele será útil mais tarde 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 para o usuário padrão que é criado ao instalar pacotes Pacemaker. Use a mesma senha em todos os nós.

    sudo passwd hacluster
    
  4. Use o comando a seguir para abrir o arquivo hosts e configurar a resolução de nomes de host. Para obter mais informações, consulte Configurar AG na configuração do arquivo 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 utilize o seu endereço IP privado no exemplo anterior. Usar o endereço IP público nessa configuração fará com que a instalação falhe e não recomendamos expor sua VM a redes externas.

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

Criar o cluster Pacemaker

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

Ativar e iniciar o serviço pcsd e Pacemaker

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

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  2. Remova qualquer configuração de cluster existente de todos os nós. Execute o seguinte comando:

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

    • Ao executar o pcs cluster auth comando para autenticar os nós do cluster, será solicitada uma senha. Digite a senha para o usuário hacluster 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 seguinte comando 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 ao exemplo a seguir:

    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 ao vivo para 3. Este comando afeta apenas o cluster dinâmico 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 o agente de esgrima

Para configurar um agente de esgrima, as instruções a seguir são modificadas para este tutorial. Para obter mais informações, consulte Criar um dispositivo STONITH.

Verifique a versão do Azure Fence Agent para garantir que ele seja atualizado. Utilize o seguinte comando:

sudo yum info fence-agents-azure-arm

Você deve 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 registar uma nova aplicação no Microsoft Entra ID (anteriormente Azure Ative Directory), siga estes passos:

  1. Aceder a https://portal.azure.com.
  2. Abra o painel Propriedades do ID do Microsoft Entra e anote o Tenant IDarquivo .
  3. Selecione Registos de aplicações.
  4. Selecione Novo registo.
  5. Insira um Nome como <resourceGroupName>-app. Para tipos de conta suportados, selecione Contas somente neste diretório organizacional (somente Microsoft - Locatário único).
  6. Selecione Web para REDIRECIONAR URI, insira uma URL (por exemplo,http://localhost ) e selecione Adicionar. O URL de início de sessão pode ser qualquer URL válido. Uma vez feito, selecione Registrar.
  7. Escolha Certificados e segredos para seu novo registro de aplicativo e, em seguida, selecione Novo segredo do cliente.
  8. Insira uma descrição para uma nova chave (segredo do cliente) e selecione Adicionar.
  9. Anote o valor do segredo. Ele é usado como a senha para a entidade de serviço.
  10. Selecione Descrição geral. Anote o ID do aplicativo. Ele é usado como o nome de usuário (ID de login nas etapas a seguir) da entidade de serviço.

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

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

Seu arquivo JSON deve ser semelhante ao exemplo a seguir:

  • Substitua <username> por um nome de sua escolha. Isso é para evitar qualquer duplicação ao criar essa definição de função.
  • Substitua <subscriptionId> pela sua ID de Subscrição 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 estiver a executar o comando a partir de um caminho diferente da pasta em que o ficheiro está guardado, inclua o caminho da pasta do ficheiro no comando.
az role definition create --role-definition "<filename>.json"

Deverá 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 Linux Fence Agent Role-<username> personalizada que foi criada na última etapa à Entidade de Serviço. Não use mais a função Proprietário.

  1. Aceda a https://portal.azure.com
  2. Abrir o painel Todos os recursos
  3. Selecione a máquina virtual do primeiro nó de cluster
  4. Selecione Controlo 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, digite o nome do aplicativo que você criou anteriormente,<resourceGroupName>-app
  8. Selecione Guardar
  9. Repita estas etapas para todos os nós do cluster.

Criar os dispositivos STONITH

Execute os seguintes comandos no nó 1:

  • Substitua o <ApplicationID> pelo valor 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 o e o <tenantID><subscriptionId> da 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 HA (--add-service=high-availability), não há necessidade de abrir as seguintes portas de firewall em todos os nós: 2224, 3121, 21064, 5405. No entanto, se você estiver enfrentando qualquer tipo de problema de conexão com HA, use o comando a seguir para abrir essas portas que estão associadas com HA.

Gorjeta

Opcionalmente, você pode adicionar todas as portas neste tutorial de uma só vez para economizar algum tempo. As portas que precisam ser abertas são explicadas em suas seções relevantes que se seguem. Se você 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

Nota

Se você criou as VMs com o SQL Server 2019 (15.x) pré-instalado no RHEL8-HA, pode ignorar as etapas abaixo para instalar o SQL Server e o 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 abaixo 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, consulte Instalar o SQL Server em uma Red Hat VM.

Instalar o SQL Server nas 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

Abra a porta de firewall 1433 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 ferramentas de 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, consulte 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

Nota

Por 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 login e sessões interativas/não login:

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 de concluir a configuração, você pode verificar o status do SQL Server e verificar se ele está sendo executado:

systemctl status mssql-server --no-pager

Deverá 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 grupo 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, consulte Configurar grupos de disponibilidade Always On do SQL Server para alta disponibilidade no Linux.

Habilite grupos de disponibilidade Always On e reinicie 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 seguintes script:

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

Criar um certificado

Atualmente, não oferecemos suporte à autenticação do AD para o ponto de extremidade AG. Portanto, devemos usar um certificado para criptografia de ponto final AG.

  1. Conecte-se a todos os nós usando o SQL Server Management Studio (SSMS) ou 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, precisará ter a porta 1433 aberta no 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, consulte Criar uma regra de segurança para criar uma regra de segurança de entrada.

    • Substitua a <Master_Key_Password> por sua própria 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 SSMS ou sqlcmd. Os comandos a seguir criam um certificado em e uma chave privada em /var/opt/mssql/data/dbm_certificate.cer sua réplica principal do var/opt/mssql/data/dbm_certificate.pvk SQL Server:

    • Substitua a <Private_Key_Password> por sua própria 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 sqlcmd executando o exit comando e retorne à sua sessão SSH.

Copie o certificado para as réplicas secundárias e crie os certificados no servidor

  1. Copie os dois arquivos que foram criados para o mesmo local em todos os servidores que hospedarão réplicas de disponibilidade.

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

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

    Nota

    Você não precisa executar sudo -i, o que lhe dá o ambiente raiz. Você pode simplesmente executar o sudo comando 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> pelo seu nome de usuário.
    • O mv comando move os arquivos ou diretório de um lugar para outro.
    • O chown comando é usado para alterar o proprietário e o grupo de arquivos, diretórios ou links.
    • Execute esses 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 a partir do backup que você criou na réplica primária do SQL Server. Atualize o script com senhas fortes. A palavra-passe de desencriptação é a mesma palavra-passe que usou para criar o ficheiro .pvk no passo anterior. Para criar o certificado, execute o seguinte script usando 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 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

Criar o grupo de disponibilidade

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

  • Substitua ag1 pelo nome desejado do Grupo de Disponibilidade.
  • Substitua os <VM1>valores , <VM2>e 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 do SQL Server para o Pacemaker. O Transact-SQL a seguir cria um logon.

  • Substitua por sua própria senha complexa <password> .
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 ficheiro:

    pacemakerLogin
    <password>
    

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

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

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

Associar réplicas secundárias ao grupo de disponibilidade

  1. Para unir as réplicas secundárias ao AG, você precisa abrir a porta 5022 no firewall para todos os servidores. Execute o seguinte comando na 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 associá-las ao AG:

    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 unidas, você poderá vê-las no Pesquisador de Objetos do SSMS expandindo o nó Always On High Availability :

    Screenshot shows the primary and secondary availability replicas.

Adicionar um banco de dados ao grupo de disponibilidade

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

Os seguintes comandos Transact-SQL 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

Verifique 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 as synchronization_state_desc listas SINCRONIZADAS para db1, isso significa que as réplicas estão sincronizadas. Os secundários são mostrados db1 na réplica primária.

Criar recursos de grupo de disponibilidade no cluster do Pacemaker

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

Nota

Comunicação sem preconceitos

Este artigo contém referências ao termo slave, um termo que a Microsoft considera ofensivo quando usado neste contexto. O termo aparece neste artigo porque aparece atualmente no software. Quando o termo for removido do software, iremos removê-lo do artigo.

Criar o recurso de cluster AG

  1. Use um dos seguintes comandos com base no ambiente escolhido anteriormente para criar o recurso ag_cluster no grupo ag1de disponibilidade.

    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. Certifique-se de que seus recursos estão online antes de continuar, usando o seguinte comando:

    sudo pcs resource
    

    Deverá 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 IP virtual

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

    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 IP virtual usando o seguinte comando. 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 AG estejam sendo executados no mesmo nó, uma restrição de colocation deve ser configurada. Execute o seguinte comando:

    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 ativo e funcionando antes do endereço IP. Embora a restrição de colocation implique 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
    

    Deverá 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:
    

Reativar o stonith

Estamos prontos para testes. Reative o stonith no cluster executando o seguinte comando no Nó 1:

sudo pcs property set stonith-enabled=true

Verificar o estado do cluster

Você pode verificar o status dos recursos do 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

Ativação pós-falha de teste

Para garantir que a configuração tenha sido bem-sucedida até agora, testamos um failover. Para obter mais informações, consulte Failover de grupo de disponibilidade Always On no Linux.

  1. Execute o seguinte comando para fazer failover manualmente 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 que foi criada para mover o recurso para um nó desejado seja desabilitada automaticamente e você não precise executar as etapas 2 e 3 nas instruções a seguir.

    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, que eliminam a restrição temporária no próprio comando resource move, é combinando 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 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 do cluster usando o comando sudo pcs resource, e 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>
    

Teste de vedação

Você pode testar a vedação executando o seguinte comando. Tente executar o comando abaixo a partir de <VM1> para <VM3>.

sudo pcs stonith fence <VM3> --debug

Nota

Por padrão, a ação de cerca desliga e depois ativa o nó. Se você quiser apenas colocar o nó offline, use a opção --off no comando.

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 cerca, consulte o seguinte artigo da Red Hat .

Próximo passo