Tutorial: configurar grupos de disponibilidade para o SQL Server em máquinas virtuais Ubuntu no Azure
Neste tutorial, você aprenderá como:
- Crie máquinas virtuais, coloque-as no conjunto de disponibilidade.
- 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 Ubuntu.
- 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
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.
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
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, confira Início Rápido para Bash no Azure Cloud Shell.
Se preferir executar os comandos de referência da CLI localmente, instale a CLI do Azure. Para execuções no Windows ou no macOS, considere executar a CLI do Azure em um contêiner do Docker. Para saber mais, confira Como executar a CLI do Azure em um contêiner do Docker.
Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para ver outras opções de entrada, confira Conectar-se com a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar extensões com a CLI do Azure.
Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.
- 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. Este tutorial usa East US 2
. 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 a rede virtual e a sub-rede
Crie uma sub-rede nomeada com um intervalo de endereços IP pré-atribuído. Substitua esses valores no seguinte comando:
<resourceGroupName>
<vNetName>
<subnetName>
az network vnet create \ --resource-group <resourceGroupName> \ --name <vNetName> \ --address-prefix 10.1.0.0/16 \ --subnet-name <subnetName> \ --subnet-prefix 10.1.1.0/24
O comando anterior cria uma VNet e uma sub-rede que contém um intervalo de IP personalizado.
Criar VMs do Ubuntu dentro do conjunto de disponibilidade
Obtenha uma lista de imagens de máquina virtual que oferecem o sistema operacional baseado no Ubuntu no Azure.
az vm image list --all --offer "sql2022-ubuntupro2004"
Você deverá ver os seguintes resultados ao pesquisar as imagens BYOS:
[ { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "enterprise_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "enterprise_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "enterprise_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230808", "version": "16.0.230808" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "sqldev_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "sqldev_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "sqldev_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230808", "version": "16.0.230808" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "standard_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "standard_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "standard_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230808", "version": "16.0.230808" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "web_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.221108", "version": "16.0.221108" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "web_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230207", "version": "16.0.230207" }, { "architecture": "x64", "offer": "sql2022-ubuntupro2004", "publisher": "MicrosoftSQLServer", "sku": "web_upro", "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230808", "version": "16.0.230808" } ]
Este tutorial usa
Ubuntu 20.04
.Importante
Os nomes de computador devem ter menos de 15 caracteres de comprimento para configurar um grupo de disponibilidade. Os nomes de usuário não podem conter caracteres maiúsculos, e as senhas devem ter entre 12 e 72 caracteres.
Crie três VMs no conjunto de disponibilidade. Substitua esses valores no seguinte comando:
<resourceGroupName>
<VM-basename>
<availabilitySetName>
<VM-Size>
– Um exemplo seria "Standard_D16s_v3"<username>
<adminPassword>
<vNetName>
<subnetName>
for i in `seq 1 3`; do az vm create \ --resource-group <resourceGroupName> \ --name <VM-basename>$i \ --availability-set <availabilitySetName> \ --size "<VM-Size>" \ --os-disk-size-gb 128 \ --image "Canonical:0001-com-ubuntu-server-jammy:20_04-lts-gen2:latest" \ --admin-username "<username>" \ --admin-password "<adminPassword>" \ --authentication-type all \ --generate-ssh-keys \ --vnet-name "<vNetName>" \ --subnet "<subnetName>" \ --public-ip-sku Standard \ --public-ip-address "" done
O comando anterior cria as VMs usando a VNet definida anteriormente. Para obter mais informações sobre as diferentes configurações, confira o artigo az vm create.
O comando também inclui o parâmetro --os-disk-size-gb
para criar um tamanho de unidade do sistema operacional personalizado de 128 GB. Se você aumentar esse tamanho posteriormente, expanda os volumes de pasta apropriados para acomodar sua instalação, configure o LVM (Gerenciador de Volume Lógico).
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/ubuntu1",
"location": "westus",
"macAddress": "<Some MAC address>",
"powerState": "VM running",
"privateIpAddress": "<IP1>",
"resourceGroup": "<resourceGroupName>",
"zones": ""
}
Testar a conexão com as VMs criadas
Conecte-se cada VM 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>@ubuntu1 ~]$
Digite exit
para sair da sessão SSH.
Configurar o acesso SSH sem senha entre nós
O acesso SSH sem senha permite que suas VMs se comuniquem entre si usando chaves públicas SSH. Você deve configurar chaves SSH em cada nó e copiá-las para cada nó.
Gerar novas chaves SSH
O tamanho da chave SSH necessário é de 4.096 bits. Em cada VM, altere para a pasta /root/.ssh
e execute o seguinte comando:
ssh-keygen -t rsa -b 4096
Durante esta etapa, você pode ser solicitado a substituir um arquivo SSH existente. Você deve concordar com esse prompt. Você não precisa inserir uma frase secreta.
Copiar as chaves SSH públicas
Em cada VM, você deve copiar a chave pública do nó que acabou de criar usando o comando ssh-copy-id
. Se você quiser especificar o diretório de destino na VM de destino, poderá usar o parâmetro -i
.
No comando a seguir, a conta <username>
pode ser a mesma que você configurou para cada nó ao criar a VM. Você também pode usar a conta root
, mas essa opção não é recomendada em ambiente de produção.
sudo ssh-copy-id <username>@ubuntu1
sudo ssh-copy-id <username>@ubuntu2
sudo ssh-copy-id <username>@ubuntu3
Verificar o acesso sem senha de cada nó
Para confirmar se a chave pública SSH foi copiada para cada nó, use o comando ssh
de cada nó. Se você copiou as chaves corretamente, não será solicitada senha e a conexão será bem-sucedida.
Neste exemplo, estamos nos conectando ao segundo e terceiro nós da primeira VM (ubuntu1
). Novamente, a conta <username>
pode ser a mesma que você configurou para cada nó ao criar a VM.
ssh <username>@ubuntu2
ssh <username>@ubuntu3
Repita esse processo dos três nós para que cada nó possa se comunicar com os outros sem a necessidade de senhas.
Configurar a resolução de nomes
Você pode configurar a resolução de nomes usando o DNS ou editando manualmente o arquivo etc/hosts
em cada nó.
Para saber mais sobre o DNS e o Active Directory, confira Ingressar o SQL Server em um host Linux em um domínio do Active Directory.
Importante
Recomendamos que você use seu endereço IP privado no exemplo anterior. Usar o endereço IP público nessa configuração causará a falha da instalação e a exposição da sua VM a redes externas.
As VMs e seus endereços IP usados neste exemplo são listados da seguinte maneira:
ubuntu1
: 10.0.0.85ubuntu2
: 10.0.0.86ubuntu3
: 10.0.0.87
Habilitar alta disponibilidade
Use o ssh para se conectar a cada uma das 3 VMs e, uma vez conectado, execute os seguintes comandos para habilitar a alta disponibilidade.
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
Instale e configure o cluster do Pacemaker.
Para iniciar a configuração do cluster do Pacemaker, você precisa instalar os pacotes e agentes de recursos necessários. Execute os comandos abaixo em cada uma das suas VMs:
sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents csync2 python3-azure
Agora prossiga para criar a chave de autenticação no servidor primário:
sudo corosync-keygen
O authkey é gerado no local /etc/corosync/authkey
. Copie a authkey para servidores secundários neste local: /etc/corosync/authkey
sudo scp /etc/corosync/authkey username@ubuntu2:~
sudo scp /etc/corosync/authkey username@ubuntu3:~
Mova a authkey do diretório base para /etc/corosync
.
sudo mv authkey /etc/corosync/authkey
Crie o cluster usando o seguinte comando:
cd /etc/corosync/
sudo vi corosync.conf
Edite o arquivo Corosync para representar o conteúdo da seguinte maneira:
totem {
version: 2
secauth: off
cluster_name: demo
transport: udpu
}
nodelist {
node {
ring0_addr: 10.0.0.85
name: ubuntu1
nodeid: 1
}
node {
ring0_addr: 10.0.0.86
name: ubuntu2
nodeid: 2
}
node {
ring0_addr: 10.0.0.87
name: ubuntu3
nodeid: 3
}
}
quorum {
provider: corosync_votequorum
two_node: 0
}
qb {
ipc_type: native
}
logging {
fileline: on
to_stderr: on
to_logfile: yes
logfile: /var/log/corosync/corosync.log
to_syslog: no
debug: off
}
Copie o arquivo corosync.conf
para outros nós para /etc/corosync/corosync.conf
:
sudo scp /etc/corosync/corosync.conf username@ubuntu2:~
sudo scp /etc/corosync/corosync.conf username@ubuntu3:~
sudo mv corosync.conf /etc/corosync/
Reinicie o Pacemaker e o Corosync e confirme o status:
sudo systemctl restart pacemaker corosync
sudo crm status
A saída deve ser semelhante ao seguinte exemplo:
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by hacluster via crmd on ubuntu1
* 3 nodes configured
* 0 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* No resources
Configurar um agente de isolamento
Configure o isolamento no cluster. Isolamento é o cercamento do nó com falha em um cluster. Ele reinicia o nó com falha, deixando-o descer, redefinir e voltar para cima, ingressando novamente no cluster.
Para configurar o isolamento, execute as seguintes ações:
- Registre um novo aplicativo do Microsoft Entra ID e crie um novo segredo.
- Crie uma função personalizada a partir do arquivo json no powershell/CLI
- Atribua a função e o aplicativo às VMs no cluster
- Defina as propriedades do agente de isolamento
Registre um novo aplicativo do Microsoft Entra ID e crie um novo segredo.
- Vá para Microsoft Entra ID no portal e anote a ID do locatário.
- No menu à esquerda, selecione Registros de aplicativo e escolha Novo registro.
- Insira um Nome, selecione Contas apenas neste diretório de organização
- Em Tipo de Aplicativo, selecione Web, insira
http://localhost
como uma URL de logon e selecione Registrar. - No menu à esquerda, selecione Certificados e segredos e selecione Novo segredo do cliente.
- Insira uma descrição e selecione uma data de expiração.
- Anote o valor do segredo, ele é usado como a seguinte senha e o ID secreto, ele é usado como o seguinte nome de usuário.
- Selecione "Visão geral" e anote a ID do aplicativo. Ele é usado como o seguinte logon.
Crie um arquivo JSON chamado fence-agent-role.json
e adicione o seguinte (adicionando sua ID da assinatura):
{
"Name": "Linux Fence Agent Role-ap-server-01-fence-agent",
"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/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
]
}
Crie uma função personalizada a partir do arquivo json no powershell/CLI
az role definition create --role-definition fence-agent-role.json
Atribua a função e o aplicativo às VMs no cluster
- Para cada uma das VMs no cluster, selecione Controle de acesso (IAM) no menu lateral.
- Selecione Adicionar uma atribuição de função (use a experiência clássica).
- Selecione a função criada anteriormente.
- Na lista Selecionar, insira o nome do aplicativo criado acima.
Agora podemos criar o recurso de agente de isolamento usando valores anteriores e sua ID da assinatura:
sudo crm configure primitive fence-vm stonith:fence_azure_arm \
params \
action=reboot \
resourceGroup="resourcegroupname" \
resourceGroup="$resourceGroup" \
username="$secretId" \
login="$applicationId" \
passwd="$password" \
tenantId="$tenantId" \
subscriptionId="$subscriptionId" \
pcmk_reboot_timeout=900 \
power_timeout=60 \
op monitor \
interval=3600 \
timeout=120
Defina as propriedades do agente de isolamento
Execute os seguintes comandos para configurar o agente de isolamento:
sudo crm configure property cluster-recheck-interval=2min
sudo crm configure property start-failure-is-fatal=true
sudo crm configure property stonith-timeout=900
sudo crm configure property concurrent-fencing=true
sudo crm configure property stonith-enabled=true
E confirme o status do cluster:
sudo crm status
A saída deve ser semelhante ao seguinte exemplo:
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
* 3 nodes configured
* 1 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* fence-vm (stonith:fence_azure_arm): Started ubuntu1
Instalar o SQL Server e mssql-tools
Os seguintes comandos são usados para instalar o SQL Server:
Importe as chaves GPG do repositório público:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
Registre o repositório do Ubuntu.
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"
Execute os comandos a seguir para instalar o SQL Server:
sudo apt-get update sudo apt-get install -y mssql-server
Após a conclusão da instalação do pacote, execute a
mssql-conf setup
e siga os prompts para definir a senha SA e escolher sua edição. Como lembrete, as seguintes edições do SQL Server são licenciadas gratuitamente: Evaluation, Developer e Express.sudo /opt/mssql/bin/mssql-conf setup
Após concluir a configuração, verifique se o serviço está em execução:
systemctl status mssql-server --no-pager
instalar as ferramentas de linha de comando SQL Server
Para criar um banco de dados, é necessário conectar-se a uma ferramenta que pode executar instruções Transact-SQL no SQL Server. As seguintes etapas instalam as ferramentas de linha de comando do SQL Server: sqlcmd e bcp.
Use as etapas a seguir para instalar o mssql-tools18 no Ubuntu.
Observação
- Há suporte para o Ubuntu 18.04 do SQL Server 2019 CU 3 em diante.
- Há suporte para o Ubuntu 20.04 do SQL Server 2019 CU 10 em diante.
- Há suporte para o Ubuntu 22.04 do SQL Server 2022 CU 10.
Entre no modo de superusuário.
sudo su
Importe as chaves GPG do repositório público.
curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
Registre o repositório do Microsoft Ubuntu.
Para Ubuntu 22.04, use o seguinte comando:
curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
Para Ubuntu 20.04, use o seguinte comando:
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
Para Ubuntu 18.04, use o seguinte comando:
curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
Para Ubuntu 16.04, use o seguinte comando:
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
Saia do modo de superusuário.
exit
Atualize a lista de fontes e execute o comando de instalação com o pacote do desenvolvedor do unixODBC.
sudo apt-get update sudo apt-get install mssql-tools18 unixodbc-dev
Observação
Para atualizar para a versão mais recente do mssql-tools, execute os seguintes comandos:
sudo apt-get update sudo apt-get install mssql-tools18
Opcional: Adicione
/opt/mssql-tools18/bin/
à sua variável de ambientePATH
em um shell de Bash.Para tornar o sqlcmd e o bcp acessível do shell de Bash para sessões de logon, modifique o
PATH
no arquivo~/.bash_profile
com o seguinte comando:echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
Para tornar o sqlcmd e o bcp acessível do shell de Bash para sessões interativas/que não são de logon, modifique o
PATH
no arquivo~/.bashrc
com o seguinte comando:echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc source ~/.bashrc
Instalar o agente de alta disponibilidade do SQL Server
Execute o seguinte comando em todos os nós para instalar o pacote do agente de alta disponibilidade para SQL Server:
sudo apt-get install mssql-server-ha
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 e reiniciar o SQL Server
Habilite grupos de disponibilidade em cada nó que hospeda uma instância do SQL Server. Reinicie o serviço mssql-server
. Execute os seguintes comandos em cada nó:
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server
Criar um certificado
A Microsoft não dá suporte à autenticação do Active Directory para o ponto de extremidade do AG. Portanto, você deve usar um certificado para a criptografia de ponto de extremidade do grupo de disponibilidade.
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
<MasterKeyPassword>
por sua senha.
ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE = ON); GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<MasterKeyPassword>'; GO
- Substitua o
Conecte-se à réplica primária usando o SSMS ou o sqlcmd. Os comandos abaixo criam um certificado em
/var/opt/mssql/data/dbm_certificate.cer
e uma chave privada emvar/opt/mssql/data/dbm_certificate.pvk
na sua réplica primária do SQL Server:- Substitua o
<PrivateKeyPassword>
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 = '<PrivateKeyPassword>' ); GO
- Substitua o
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
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>
esles2
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. Em vez disso, você pode executar o comandosudo
na frente de cada comando.# The below command allows you to run commands in the root environment sudo -i
scp /var/opt/mssql/data/dbm_certificate.* <username>@sles2:/home/<username>
- Substitua
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.*
- Substitua
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 = '<PrivateKeyPassword>' ); 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
por seu nome AG desejado. - Substitua os valores
ubuntu1
,ubuntu2
eubuntu3
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'ubuntu1'
WITH (
ENDPOINT_URL = N'tcp://ubuntu1:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'ubuntu2'
WITH (
ENDPOINT_URL = N'tcp://ubuntu2:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = EXTERNAL,
SEEDING_MODE = AUTOMATIC
),
N'ubuntu3'
WITH (
ENDPOINT_URL = N'tcp://ubuntu3: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.
Crie o arquivo:
sudo vi /var/opt/mssql/secrets/passwd
Adicione as duas linhas abaixo 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.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
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
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 ingressadas, você poderá vê-las no Pesquisador de Objetos do SSMS expandindo o nó Alta Disponibilidade Always On:
Adicionar um banco de dados ao grupo de disponibilidade
Esta seção segue o artigo para adicionar um banco de dados a um grupo de disponibilidade.
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 mode
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;
GO
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
Para criar o recurso de grupo de disponibilidade no Pacemaker, execute o seguinte comando:
sudo crm
configure
primitive ag1_cluster \
ocf:mssql:ag \
params ag_name="ag1" \
meta failure-timeout=60s \
op start timeout=60s \
op stop timeout=60s \
op promote timeout=60s \
op demote timeout=10s \
op monitor timeout=60s interval=10s \
op monitor timeout=60s on-fail=demote interval=11s role="Master" \
op monitor timeout=60s interval=12s role="Slave" \
op notify timeout=60s
ms ms-ag1 ag1_cluster \
meta master-max="1" master-node-max="1" clone-max="3" \
clone-node-max="1" notify="true"
commit
Esse comando acima cria o recurso ag1_cluster, ou seja, o recurso do grupo de disponibilidade. Em seguida, ele cria o recurso ms-ag1 (recurso primário/secundário no Pacemaker e, em seguida, adiciona o recurso AG a ele. Isso garante que o recurso AG seja executado em todos os três nós no cluster, mas apenas um desses nós é primário).
Para exibir o recurso do grupo AG e verificar o status do cluster:
sudo crm resource status ms-ag1
sudo crm status
A saída deve ser semelhante ao seguinte exemplo:
resource ms-ag1 is running on: ubuntu1 Master
resource ms-ag1 is running on: ubuntu3
resource ms-ag1 is running on: ubuntu2
A saída deve ser semelhante ao seguinte exemplo. Para adicionar restrições de colocação e promoção, consulte Tutorial: Configurar um ouvinte do grupo de disponibilidade em Máquinas Virtuais do Linux.
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
* 3 nodes configured
* 4 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* Clone Set: ms-ag1 [ag1_cluster] (promotable):
* Masters: [ ubuntu1 ]
* Slaves : [ ubuntu2 ubuntu3 ]
* fence-vm (stonith:fence_azure_arm): Started ubuntu1
Execute o comando a seguir para criar um recurso de grupo, para que as restrições de colocação e promoção aplicadas ao ouvinte e ao balanceador de carga não precisem ser aplicadas individualmente.
sudo crm configure group virtualip-group azure-load-balancer virtualip
A saída de crm status
será parecida com o seguinte exemplo:
Cluster Summary:
* Stack: corosync
* Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
* Last updated: Wed Nov 29 07:01:32 2023
* Last change: Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
* 3 nodes configured
* 6 resource instances configured
Node List:
* Online: [ ubuntu1 ubuntu2 ubuntu3 ]
Full List of Resources:
* Clone Set: ms-ag1 [ag1_cluster] (promotable):
* Masters: [ ubuntu1 ]
* Slaves : [ ubuntu2 ubuntu3 ]
* Resource Group: virtual ip-group:
* azure-load-balancer (ocf :: heartbeat:azure-lb): Started ubuntu1
* virtualip (ocf :: heartbeat: IPaddr2): Started ubuntu1
* fence-vm (stonith:fence_azure_arm): Started ubuntu1