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.
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 escolhendoRedHat: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.
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.
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
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
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
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
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
Remova qualquer configuração de cluster existente de todos os nós. Execute o seguinte comando:
sudo pcs cluster destroy sudo systemctl enable pacemaker
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
- Ao executar o
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
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:
- Aceder a https://portal.azure.com.
- Abra o painel Propriedades do ID do Microsoft Entra e anote o
Tenant ID
arquivo . - Selecione Registos de aplicações.
- Selecione Novo registo.
- Insira um Nome como
<resourceGroupName>-app
. Para tipos de conta suportados, selecione Contas somente neste diretório organizacional (somente Microsoft - Locatário único). - 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. - Escolha Certificados e segredos para seu novo registro de aplicativo e, em seguida, selecione Novo segredo do cliente.
- Insira uma descrição para uma nova chave (segredo do cliente) e selecione Adicionar.
- Anote o valor do segredo. Ele é usado como a senha para a entidade de serviço.
- 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.
- Aceda a https://portal.azure.com
- Abrir o painel Todos os recursos
- Selecione a máquina virtual do primeiro nó de cluster
- Selecione Controlo de acesso (IAM)
- Selecione Adicionar uma atribuição de função
- Selecione a função
Linux Fence Agent Role-<username>
na lista Função - Na lista Selecionar, digite o nome do aplicativo que você criou anteriormente,
<resourceGroupName>-app
- Selecione Guardar
- 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.
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>';
- Substitua a
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 dovar/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
- Substitua a
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
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 osudo
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>
- Substitua
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.*
- Substitua
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.
Crie o arquivo:
sudo vi /var/opt/mssql/secrets/passwd
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.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
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
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
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
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 :
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
Use um dos seguintes comandos com base no ambiente escolhido anteriormente para criar o recurso
ag_cluster
no grupoag1
de 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
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
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
nmap
de 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.
Defina a propriedade stonith-enabled como false:
sudo pcs property set stonith-enabled=false
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
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
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
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.
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
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:
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
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 .