Este tutorial descreve como implantar um sistema de banco de dados Microsoft SQL Server no Linux usando um grupo de disponibilidade Always On (AOAG) e Pacemaker como uma solução de alta disponibilidade (HA) e recuperação de desastres (DR). Para os fins deste documento, um desastre é um evento no qual um banco de dados primário falha ou fica indisponível.
Um banco de dados primário pode falhar quando a região em que está localizado falhar ou se tornar inacessível. Mesmo que uma região esteja disponível e operando normalmente, um banco de dados primário poderá falhar devido a um erro do sistema. Nestes casos, a recuperação de desastres é o processo de disponibilizar um banco de dados secundário aos clientes para processamento contínuo.
Este tutorial é destinado a arquitetos, administradores e engenheiros de banco de dados.
Objetivos
- Implantar SQL Server no Linux
- Crie um grupo de disponibilidade Always On para alta disponibilidade e recuperação de desastres
- Instalar e configurar o Pacemaker para gerenciar o failover do cluster do SQL Server
- Configure um balanceador de carga para rotear o tráfego para seu grupo de disponibilidade com SQL Server
- Configure uma cerca STONITH (atire no outro nó na cabeça) para garantir a integridade do HA
- Execute um teste de failover para garantir que o cluster do SQL Server esteja funcionando conforme esperado
Custos
Este tutorial usa componentes faturáveis de Google Cloud, incluindo:
Use a calculadora de preços para gerar uma estimativa de custo com base no uso projetado.
Antes de começar
Para este tutorial, você precisa de um Google Cloud projeto. Você pode criar um novo ou selecionar um projeto já criado:
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
Prepare o projeto e a rede
Para preparar o seu Google Cloud projeto e VPC para a implantação de grupos de disponibilidade Always On do SQL Server, faça o seguinte:
No Google Cloud console, abra o Cloud Shell clicando no botão Ativar Cloud Shell
botão.
Defina seu ID de projeto padrão:
gcloud config set project
PROJECT_ID
Substitua
PROJECT_ID
pelo ID do seu Google Cloud projeto.Defina sua região padrão:
gcloud config set compute/region
REGION
Substitua
REGION
pelo ID da região na qual você deseja implantar.Defina sua zona padrão:
gcloud config set compute/zone
ZONE
Substitua
ZONE
pelo ID da zona na qual você deseja implantar. Deve ser uma zona válida na região especificada na etapa anterior.
Crie VMs Linux
Para obter alta disponibilidade e quorum para o cluster do SQL Server, implante três VMs (máquinas virtuais) Linux para hospedar o cluster do SQL Server.
Inicialize as seguintes variáveis:
PD_SIZE=30 MACHINE_TYPE=n2-standard-8
Crie as VMs Linux:
gcloud compute instances create node-1 \ --project=
PROJECT_ID
\ --zoneREGION
-a \ --machine-type $MACHINE_TYPE \ --subnetSUBNET_NAME
\ --create-disk=auto-delete=yes,boot=yes,device-name=node-1,image=projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20240426,mode=rw,size=$PD_SIZE,type=projects/PROJECT_ID
/zones/REGION
-a/diskTypes/pd-balanced \ --scopes=https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/devstorage.read_write gcloud compute instances create node-2 \ --project=PROJECT_ID
\ --zoneREGION
-b \ --machine-type $MACHINE_TYPE \ --subnetSUBNET_NAME
\ --create-disk=auto-delete=yes,boot=yes,device-name=node-2,image=projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20240426,mode=rw,size=$PD_SIZE,type=projects/PROJECT_ID
/zones/REGION
-b/diskTypes/pd-balanced \ --scopes=https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/devstorage.read_write gcloud compute instances create node-3 \ --project=PROJECT_ID
\ --zoneREGION
-c \ --machine-type $MACHINE_TYPE \ --subnetSUBNET_NAME
\ --create-disk=auto-delete=yes,boot=yes,device-name=node-3,image=projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20240426,mode=rw,size=$PD_SIZE,type=projects/PROJECT_ID
/zones/REGION
-c/diskTypes/pd-balanced \ --scopes=https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/trace.append,https://www.googleapis.com/auth/devstorage.read_writeSubstitua
SUBNET_NAME
pelo nome da sua sub-rede VPC.Atualize o arquivo hosts em
node-1
,node-2
enode-3
:- Conecte-se a cada uma das suas VMs usando SSH. Consulte a documentação Conectar-se a VMs Linux para obter mais informações.
Abra o arquivo hosts para edição.
sudo vi /etc/hosts
Encontre o endereço IP interno de cada VM Linux e anexe as entradas do host na parte inferior do arquivo.
NODE1_INTERNAL_IP
node-1NODE2_INTERNAL_IP
node-2NODE3_INTERNAL_IP
node-3Substitua
NODE1_INTERNAL_IP
,NODE2_INTERNAL_IP
eNODE3_INTERNAL_IP
pelo endereço IP interno de cada VM Linux.
Verifique a comunicação entre suas VMs. Todas as VMs que participam do grupo de disponibilidade Always On devem poder se comunicar com outras VMs:
Retorne a cada VM Linux, execute os comandos de cada VM e verifique se todas as VMs podem se comunicar entre si.
ping -c 4 node-1 ping -c 4 node-2 ping -c 4 node-3
Instalar e configurar o SQL Server
Baixe, instale e configure o mecanismo SQL Server nas três VMs Linux que participarão do grupo de disponibilidade Always On.
SSH para
node-1
,node-2
enode-3
e execute as seguintes etapas:Importe as chaves do repositório público.
wget -qO- https://packages.microsoft.com/keys/microsoft.asc \ | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
Registre o repositório SQL Server Ubuntu.
sudo add-apt-repository \ "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2019.list)"
Atualize os arquivos de índice do pacote e instale o SQL Server.
sudo apt-get update sudo apt-get install -y mssql-server
Configurar o SQL Server:
Execute a ferramenta mssql-conf.
sudo /opt/mssql/bin/mssql-conf setup
Escolha a edição Developer para a edição do SQL Server e aceite o contrato de licença.
A edição para desenvolvedores inclui todos os recursos empresariais, mas você pode usá-la apenas para ambientes que não sejam de produção. Mais informações estão disponíveis sobre edições do SQL Server e licenças da Microsoft .
Especifique uma senha para a conta SA.
Verifique se o serviço
mssql-server
está em execução.systemctl status mssql-server --no-pager
Se você tiver um firewall habilitado em suas VMs, abra o firewall do SQL Server:
Verifique se
Uncomplicated Firewall
está instalado e habilitado executando o seguinte comando.sudo ufw status
Se o status estiver ativo, execute os seguintes comandos para abrir as portas.
sudo ufw allow 1433 sudo ufw allow 5022 sudo ufw reload
Conecte-se ao SQL Server
Neste ponto, o SQL Server está instalado. Para se conectar a ele, crie uma máquina Windows na mesma VPC, instale o SQL Server Management Studio (SSMS) para se conectar à instância recém-criada do SQL Server em suas VMs:
Crie uma VM do Windows:
Retorne ao Cloud Shell e execute o comando a seguir.
gcloud compute instances create node4 \ --project=
PROJECT_ID
\ --zoneZONE
\ --subnetSUBNET_NAME
\ --machine-type=n2-standard-4 \ --create-disk=auto-delete=yes,boot=yes,device-name=node4,image=projects/windows-cloud/global/images/windows-server-2022-dc-v20240415,mode=rw,size=50,type=projects/p3rf-sqlserver/zones/ZONE
/diskTypes/pd-balanced
Conecte-se à VM do Windows no
node-4
usando a Área de Trabalho Remota:Atualize o arquivo hosts no
node-4
:- Abra o bloco de notas no modo administrador.
Clique em Arquivo > Abrir e abra o arquivo hosts.
c:\Windows\System32\drivers\etc\hosts
Anexe as entradas do host ao final do arquivo.
NODE1_INTERNAL_IP
node-1NODE2_INTERNAL_IP
node-2NODE3_INTERNAL_IP
node-3Substitua
NODE1_INTERNAL_IP
,NODE2_INTERNAL_IP
eNODE3_INTERNAL_IP
pelo respectivo endereço IP interno de cada VM.Salve e saia.
Verifique a conectividade com as VMs do Linux:
- Conecte-se à VM do Windows no
node-4
- Clique no botão Iniciar e digite powershell na barra de pesquisa.
- Clique para abrir o aplicativo ISE do Windows PowerShell.
Testa a conectividade executando os comandos a seguir.
ping node-1 ping node-2 ping node-3
- Conecte-se à VM do Windows no
Instale o Microsoft SQL Server Management Studio (SSMS) com as seguintes etapas:
Conecte-se à VM do Windows no
node-4
usando a Área de Trabalho Remota.Na sua sessão RDP, minimize todas as janelas e inicie o aplicativo Windows PowerShell ISE.
No prompt do PowerShell, baixe e execute o instalador do SSMS.
Start-BitsTransfer ` -Source "https://aka.ms/ssmsfullsetup" ` -Destination "$env:Temp\ssms-setup.exe" & $env:Temp\ssms-setup.exe
No instalador do SSMS, clique em Instalar .
Aceite o prompt para permitir que alterações sejam feitas.
Quando a instalação for concluída, clique em Reiniciar para reiniciar a máquina remota. Isso fecha a sessão RDP.
Conecte-se à instância do SQL Server no nó-1:
Retorne à VM
node-4
usando RDP.Abra o SSMS e conecte-se ao
node-1
usando os parâmetros a seguir.Server name: node-1 Authentication: SQL Server Authentication Login: sa
Para obter mais informações, consulte conectar-se a uma instância do SQL Server usando a documentação do SQL Server Management Studio .
Digite a senha da conta SA criada durante a instalação.
Selecione Certificado de servidor confiável .
Clique em Conectar .
Habilitar grupo de disponibilidade Always On
No Linux, você deve primeiro criar um grupo de disponibilidade antes de poder adicioná-lo como um recurso a ser gerenciado pelo Pacemaker:
Habilite o recurso de grupo de disponibilidade Always On para cada instância do SQL Server participante do grupo de disponibilidade. Execute os seguintes comandos em
node-1
,node-2
enode-3
:sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1 sudo systemctl restart mssql-server
Conecte-se à instância que é o host principal no grupo de disponibilidade usando SSMS:
Abra uma nova janela de consulta.
Execute o trecho de código a seguir para criar uma chave de criptografia, um certificado e uma chave privada.
USE MASTER; CREATE MASTER KEY ENCRYPTION BY PASSWORD = '
ENCRYPTION_KEY_PASSWORD
'; CREATE CERTIFICATE my_ag_certificate WITH SUBJECT = 'my_ag_cert'; BACKUP CERTIFICATE my_ag_certificate TO FILE = '/var/opt/mssql/data/my_ag_certificate.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/my_ag_certificate.pvk', ENCRYPTION BY PASSWORD = 'PRIVATE_KEY_PASSWORD
' );Substitua
ENCRYPTION_KEY_PASSWORD
ePRIVATE_KEY_PASSWORD
pelas senhas da chave de criptografia e da chave privada.
Transferir o certificado e os arquivos de chave
O certificado e os arquivos de chave criados nas etapas anteriores precisam ser movidos para os nós secundários do SQL Server. Existem vários métodos para mover o certificado e os arquivos de chave para os nós secundários em node-2
e node-3
.
Para outras opções de transferência, consulte Transferir arquivos para VMs Linux
Transfira o certificado e os arquivos de chave usando o Cloud Storage
Crie um Cloud Storage para transferir arquivos dos nós do cluster primário para o secundário.
Crie um intervalo do Cloud Storage:
Retorne ao Cloud Shell e execute o seguinte comando:
gcloud storage buckets create gs://
BUCKET_NAME
\ --project=PROJECT_ID
\ --location=REGION
\ --public-access-preventionSubstitua
BUCKET_NAME
pelo nome do bucket a ser criado. SubstituaPROJECT_ID
pelo ID do seu Google Cloud projeto e substituaREGION
pelo ID da região onde você deseja que o bucket seja implantado.
Para obter mais informações, consulte Criar buckets .
Retorne ao SSh em
node-1
,node-2
enode-3
para inicializar o Google Cloud CLI:Execute o comando a seguir para inicializar a CLI do Google Cloud.
gcloud init
Escolha
option [1]
para usar a conta de serviço pré-instalada.Digite o nome do seu projeto.
Insira
n
na pergunta para configurar a região e zona padrão.
Retorne ao
node-1
para copiar os arquivos para o Cloud Storage:Faça upload dos dois arquivos recém-criados para seu Cloud Storage usando os comandos a seguir.
sudo gcloud storage cp /var/opt/mssql/data/my_ag_certificate.cer gs://
BUCKET_NAME
/ sudo gcloud storage cp /var/opt/mssql/data/my_ag_certificate.pvk gs://BUCKET_NAME
/Substitua
BUCKET_NAME
pelo nome do bucket criado.
Volte para
node-2
enode-3
para copiar os arquivos do Cloud Storage:Baixe os dois arquivos do Cloud Storage para
node-2
.sudo gcloud storage cp gs://
BUCKET_NAME
/my_ag_certificate.cer /var/opt/mssql/data/ sudo gcloud storage cp gs://BUCKET_NAME
/my_ag_certificate.pvk /var/opt/mssql/data/Substitua
BUCKET_NAME
pelo nome do bucket criado.Altere a propriedade dos arquivos no
node-2
enode-3
executando o comando em um shell raiz.chown mssql:mssql /var/opt/mssql/data/my_ag_certificate.* chmod 660 /var/opt/mssql/data/my_ag_certificate.*
Configurar ponto de extremidade de espelhamento de banco de dados
Nesta seção, você criará o endpoint do banco de dados usando uma chave de criptografia e um certificado compartilhado por cada nó no cluster do SQL Server para garantir a replicação segura dos dados.
Retorne à VM do Windows no
node-4
para criar os pontos de extremidade de espelhamento de banco de dados:Conecte-se aos bancos de dados do SQL Server em
node-1
,node-2
enode-3
usando SSMS. Siga as etapas de Conectar-se ao SQL Server usandonode-1
,node-2
enode-3
como o nome do servidor e as respectivas senhas definidas para a conta SA.Crie o certificado nas VMs secundárias
node-2
enode-3
a partir dos arquivos copiados. Use as senhas fornecidas ao criar o certificado e a chave no nó primário.USE MASTER; CREATE MASTER KEY ENCRYPTION BY PASSWORD = '
ENCRYPTION_KEY_PASSWORD
'; CREATE CERTIFICATE my_ag_certificate FROM FILE = '/var/opt/mssql/data/my_ag_certificate.cer' WITH PRIVATE KEY ( FILE = '/var/opt/mssql/data/my_ag_certificate.pvk', DECRYPTION BY PASSWORD = 'PRIVATE_KEY_PASSWORD
' );Substitua
ENCRYPTION_KEY_PASSWORD
ePRIVATE_KEY_PASSWORD
pelas senhas da chave de criptografia e da chave privada.Retorne ao SSMS para criar pontos de extremidade de espelhamento de banco de dados executando o comando T-SQL para
node-1
,node-2
enode-3
.CREATE ENDPOINT [my_ag_endpoint] AS TCP (LISTENER_PORT = 5022) FOR DATABASE_MIRRORING ( ROLE = ALL, AUTHENTICATION = CERTIFICATE my_ag_certificate, ENCRYPTION = REQUIRED ALGORITHM AES ); ALTER ENDPOINT [my_ag_endpoint] STATE = STARTED;
Criar e configurar o grupo de disponibilidade Always On
Em seguida, crie o grupo de disponibilidade Always On do SQL Server usando o SQL Server Management Studio e use os pontos de extremidade criados anteriormente para replicação.
Retorne à VM do Windows e abra o SSMS:
- Conecte-se ao mecanismo de banco de dados SQL Server no
node-1
e abra uma nova janela de consulta.
- Conecte-se ao mecanismo de banco de dados SQL Server no
Crie um banco de dados e faça backup dele em preparação para replicação:
USE MASTER; CREATE DATABASE [bookshelf]; ALTER DATABASE [bookshelf] SET RECOVERY FULL; BACKUP DATABASE [bookshelf] TO DISK = N'/var/opt/mssql/data/bookshelf.bak';
Crie o grupo de disponibilidade Always On:
Execute o seguinte comando T-SQL no SSMS em
node-1
,node-2
enode-3
. Isso garantirá que os pontos de extremidade estejam habilitados e que o SQL Server em cada nó esteja pronto para replicação de dados.IF (SELECT state FROM sys.endpoints WHERE name = N'my_ag_endpoint') <> 0 BEGIN ALTER ENDPOINT [my_ag_endpoint] STATE = STARTED END GO IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER WITH (STARTUP_STATE=ON); END IF NOT EXISTS(SELECT * FROM sys.dm_xe_sessions WHERE name='AlwaysOn_health') BEGIN ALTER EVENT SESSION [AlwaysOn_health] ON SERVER STATE=START; END GO
Execute o seguinte comando T-SQL no
node-1
para criar o AOAG.USE [master] GO CREATE AVAILABILITY GROUP [aoag1] WITH ( AUTOMATED_BACKUP_PREFERENCE = SECONDARY, DB_FAILOVER = OFF, DTC_SUPPORT = NONE, CLUSTER_TYPE = EXTERNAL, REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 0 ) FOR DATABASE [bookshelf] REPLICA ON N'node-1' WITH ( ENDPOINT_URL = N'TCP://node-1:5022', FAILOVER_MODE = EXTERNAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)), N'node-2' WITH (ENDPOINT_URL = N'TCP://node-2:5022', FAILOVER_MODE = EXTERNAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO)), N'node-3' WITH (ENDPOINT_URL = N'TCP://node-3:5022', FAILOVER_MODE = EXTERNAL, AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO) ); GO
Execute o comando T-SQL a seguir
node-2
enode-3
para cada instância do SQL Server para ingressar no novo grupo de disponibilidade.ALTER AVAILABILITY GROUP [aoag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL); GO ALTER AVAILABILITY GROUP [aoag1] GRANT CREATE ANY DATABASE; GO
Você criou um novo banco de dados denominado bookshelf e adicionou o novo banco de dados a um novo grupo de disponibilidade denominado aoag1 na instância do SQL Server em execução no
node-1
.Node-2
enode-3
foram adicionados ao grupo de disponibilidade e os dados no banco de dados bookshelf serão replicados de forma síncrona nas instâncias do SQL Server em todos os três nós.
Instalar e configurar o Pacemaker
Pacemaker é um software gerenciador de recursos de alta disponibilidade de código aberto, usado com o mecanismo Corosync Cluster. Nesta seção você instala e configura o Pacemaker em cada uma de suas VMs.
Crie um logon do SQL Server para o gerenciador de cluster do pacemaker
Nesta seção, você criará uma nova conta do SQL Server para o Pacemaker usar para fazer login em cada instância do SQL Server e gerenciar o grupo de disponibilidade.
Execute o seguinte comando T-SQL em
node-1
,node-2
enode-3
:USE [master]; CREATE LOGIN [pacemaker] with PASSWORD= N'
PACEMAKER_LOGIN_PASSWORD
'; GOSubstitua
PACEMAKER_LOGIN_PASSWORD
por uma senha para a conta do marcapasso.Execute o comando T-SQL para conceder permissões de login do marcapasso ao grupo de disponibilidade:
GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::[aoag1] TO [pacemaker]; GRANT VIEW SERVER STATE TO [pacemaker]; GO
Retorne ao SSH em
node-1
,node-2
enode-3
para executar os comandos para salvar o login e a senha do Pacemaker na pasta de segredos do SQL Server:echo 'pacemaker' >> ~/pacemaker-passwd echo '
PACEMAKER_LOGIN_PASSWORD
' >> ~/pacemaker-passwd sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd sudo chown root:root /var/opt/mssql/secrets/passwd sudo chmod 400 /var/opt/mssql/secrets/passwdSubstitua
PACEMAKER_LOGIN_PASSWORD
pela senha da conta do marcapasso.
Instale o marcapasso
Em seguida, instale o Pacemaker e configure uma conta de logon em todas as VMs Linux para gerenciamento de recursos.
Abra portas de firewall para marcapasso:
Verifique se
Uncomplicated Firewall
está instalado e habilitado executando o seguinte comando emnode-1
,node-2
enode-3
.sudo ufw status
Se o ufw estiver habilitado, abra as portas do firewall em
node-1
,node-2
enode-3
.sudo ufw allow 2224/tcp sudo ufw allow 3121/tcp sudo ufw allow 5405/udp sudo ufw allow 21064/tcp sudo ufw allow 1433/tcp sudo ufw allow 5022/tcp sudo ufw reload
Instale o Pacemaker em
node-1
,node-2
enode-3
:sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents corosync python3-azure pcs
Defina uma nova senha para o usuário
hacluster
emnode-1
,node-2
enode-3
:sudo passwd hacluster
Configurar o Corosync
Agora você configurará o Corosync para gerenciar a associação do cluster e as mensagens em todo o cluster.
Crie uma chave de autenticação para Corosync no
node-1
:sudo corosync-keygen
Modifique o arquivo de configuração do Corosync:
Retorne ao
node-1
e modifique o arquivocorosync.conf
.sudo vi /etc/corosync/corosync.conf
Atualize as seções destacadas. Após a edição, o arquivo deverá ficar semelhante ao exemplo a seguir.
# Please read the corosync.conf.5 manual page totem { version: 2 # Corosync itself works without a cluster name, but DLM needs one. # The cluster name is also written into the VG metadata of newly # created shared LVM volume groups, if lvmlockd uses DLM locking. cluster_name: my_agcluster # crypto_cipher and crypto_hash: Used for mutual node authentication. # If you choose to enable this, then do remember to create a shared # secret with "corosync-keygen". # enabling crypto_cipher, requires also enabling of crypto_hash. # crypto works only with knet transport transport: udpu crypto_cipher: none crypto_hash: none } logging { # Log the source file and line where messages are being # generated. When in doubt, leave off. Potentially useful for # debugging. fileline: off # Log to standard error. When in doubt, set to yes. Useful when # running in the foreground (when invoking "corosync -f") to_stderr: yes # Log to a log file. When set to "no", the "logfile" option # must not be set. to_logfile: yes logfile: /var/log/corosync/corosync.log # Log to the system log daemon. When in doubt, set to yes. to_syslog: yes # Log debug messages (very verbose). When in doubt, leave off. debug: off # Log messages with time stamps. When in doubt, set to hires (or on) #timestamp: hires logger_subsys { subsys: QUORUM debug: off } } quorum { # Enable and configure quorum subsystem (default: off) # see also corosync.conf.5 and votequorum.5 provider: corosync_votequorum } nodelist { # Change/uncomment/add node sections to match cluster configuration node { # Hostname of the node name: node-1 # Cluster membership node identifier nodeid: 1 # Address of first link ring0_addr:
NODE1_INTERNAL_IP
# When knet transport is used it's possible to define up to 8 links #ring1_addr: 192.168.1.1 } node { name: node-2 nodeid: 2 ring0_addr:NODE2_INTERNAL_IP
} node { name: node-3 nodeid: 3 ring0_addr:NODE3_INTERNAL_IP
} # ... }Substitua
NODE1_INTERNAL_IP
,NODE2_INTERNAL_IP
eNODE3_INTERNAL_IP
pelos endereços IP internos de cada nó.
Transfira os arquivos de configuração usando o Cloud Storage
Faça upload da chave de autenticação gerada e dos arquivos de configuração do corosync do
node-1
para seu bucket do Cloud Storage:sudo gcloud storage cp /etc/corosync/authkey gs://
BUCKET_NAME
/ sudo gcloud storage cp /etc/corosync/corosync.conf gs://BUCKET_NAME
/Substitua
BUCKET_NAME
pelo nome do bucket criado anteriormente.Baixe os arquivos Authkey e de configuração para
node-2
enode-3
:sudo gcloud storage cp gs://
BUCKET_NAME
/authkey /etc/corosync/ sudo gcloud storage cp gs://BUCKET_NAME
/corosync.conf /etc/corosync/Substitua
BUCKET_NAME
pelo nome do bucket para onde os arquivos de configuração do Corosync foram transferidos.Atualize as permissões dos arquivos em
node-2
enode-3
:sudo chmod 400 /etc/corosync/authkey sudo chmod 400 /etc/corosync/corosync.conf
Reinicie e verifique a comunicação do cluster
Reinicie os serviços Pacemaker e Corosync em
node-1
,node-2
enode-3
:sudo systemctl restart pacemaker corosync
Confirme o status do cluster executando o comando no
node-1
:sudo crm status
Você deverá ver todos os três nós online.
Configure o cluster
Em seguida, você configurará o cluster Pacemaker criando um novo recurso para o grupo de disponibilidade Always On do SQL Server.
Execute o seguinte comando no
node-1
para definir as propriedades do cluster:sudo crm configure property stonith-enabled=false sudo crm configure property cluster-recheck-interval=2min sudo crm configure property start-failure-is-fatal=true
Para obter mais informações, consulte Opções de cluster .
Autorize os nós no cluster executando o comando em
node-1
. Use a senha definida anteriormente para a contahacluster
:sudo pcs cluster auth -u hacluster
Você deverá ver que todos os três nós estão autorizados.
Instale o agente de recursos do SQL Server para integração com o Pacemaker em
node-1
,node-2
enode-3
:sudo apt-get install mssql-server-ha
Retorne ao
node-1
e crie um recurso de grupo de disponibilidade no cluster:Execute o Gerenciador de Recursos de Cluster.
sudo crm
Digite
configure
para entrar no menu de configuração.Insira a seguinte configuração.
primitive aoag1-cluster \ ocf:mssql:ag \ params ag_name="aoag1" \ 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 aoag1-cluster \ meta master-max="1" master-node-max="1" clone-max="3" \ clone-node-max="1" notify="true"
Digite
commit
para confirmar as alterações.Digite
exit
para sair do gerenciador de recursos de cluster.Verifique a configuração.
sudo crm status
Você deverá ver que
node-1
foi promovido para o nó primário.Node-2
enode-3
devem ser definidos como nós secundários.
Configurar o balanceador de carga e o ouvinte do grupo de disponibilidade
Nesta seção, você cria um endereço IP virtual e um recurso de verificação de integridade no cluster usando um balanceador de carga TCP de passagem interna que roteia o tráfego para o grupo de disponibilidade.
Retorne ao Cloud Shell e reserve um endereço IP estático que você usará como IP do cluster:
gcloud compute addresses create aoag1-cluster \ --region
REGION
\ --subnetSUBNET_NAME
CLUSTER_ADDRESS=$(gcloud compute addresses describe aoag1-cluster \ --region $(gcloud config get-value compute/region) \ --format=value\(address\)) && \ echo "Cluster IP address: $CLUSTER_ADDRESS"Substitua
REGION
eSUBNET_NAME
pela região e sub-rede onde as VMs do Linux estão implantadas.Crie grupos de instâncias não gerenciadas para cada um dos nós do cluster e atribua-os ao grupo de instâncias recém-criado. Execute os seguintes comandos no Cloud Shell:
gcloud compute instance-groups unmanaged create node-1-uig \ --zone=
REGION
-a gcloud compute instance-groups unmanaged add-instances node-1-uig \ --zone=REGION
-a \ --instances=node-1 gcloud compute instance-groups unmanaged create node-2-uig \ --zone=REGION
-b gcloud compute instance-groups unmanaged add-instances node-2-uig \ --zone=REGION
-b \ --instances=node-2 gcloud compute instance-groups unmanaged create node-3-uig \ --zone=REGION
-c gcloud compute instance-groups unmanaged add-instances node-3-uig \ --zone=REGION
-c \ --instances=node-3Substitua
REGION
pela região onde as VMs do Linux estão implantadas.Crie uma verificação de integridade do TCP. Os balanceadores de carga usam verificações de integridade para determinar quais instâncias de back-end respondem adequadamente ao tráfego.
gcloud compute health-checks create tcp aoag1-healthcheck \ --port=
HEALTH_CHECK_PORT
--proxy-header=NONE \ --check-interval=10 --timeout=10 --unhealthy-threshold=2 \ --healthy-threshold=2Escolha e substitua
HEALTH_CHECK_PORT
pelo valor de uma porta livre e no intervalo privado de 49152-65535 . Por exemplo, 60.000.Para obter mais informações, leia a visão geral das verificações de integridade .
Adicione tags de rede aos nós do cluster. A tag de rede é usada pela regra de firewall para a verificação de integridade:
gcloud compute instances add-tags node-1 \ --tags
NETWORK_TAG_NAME
\ --zoneREGION
-a gcloud compute instances add-tags node-2 \ --tagsNETWORK_TAG_NAME
\ --zoneREGION
-b gcloud compute instances add-tags node-3 \ --tagsNETWORK_TAG_NAME
\ --zoneREGION
-cSubstitua
NETWORK_TAG_NAME
por um nome para a tag de rede.Crie uma regra de firewall para permitir que as verificações de integridade cheguem aos nós do cluster com base no nome da tag:
gcloud compute firewall-rules create mssql-aoag1-fw-rule \ --network
VPC_NAME
\ --action ALLOW \ --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --target-tagsNETWORK_TAG_NAME
\ --rules tcp:HEALTH_CHECK_PORT
Para obter mais informações, consulte Regras de firewall para verificações de integridade .
Crie o serviço de back-end do balanceador de carga:
gcloud compute backend-services create aoag1-backend \ --load-balancing-scheme internal \ --health-checks aoag1-healthcheck \ --no-connection-drain-on-failover \ --drop-traffic-if-unhealthy \ --failover-ratio 1.0 \ --region
REGION
\ --global-health-checksAdicione os três grupos de instâncias não gerenciadas ao serviço de back-end:
gcloud compute backend-services add-backend aoag1-backend \ --instance-group node-1-uig \ --instance-group-zone
REGION
-a \ --regionREGION
gcloud compute backend-services add-backend aoag1-backend \ --instance-group node-2-uig \ --instance-group-zoneREGION
-b \ --failover \ --regionREGION
gcloud compute backend-services add-backend aoag1-backend \ --instance-group node-3-uig \ --instance-group-zoneREGION
-c \ --failover \ --regionREGION
Defina uma regra de encaminhamento para seu balanceador de carga. Uma regra de encaminhamento especifica o protocolo e as portas nas quais o balanceador de carga aceita tráfego:
gcloud compute forwarding-rules create aoag1-fwd-rule \ --load-balancing-scheme internal \ --address
CLUSTER_ADDRESS
\ --subnetSUBNET_NAME
\ --regionREGION
\ --backend-service aoag1-backend \ --ports ALLSubstitua
CLUSTER_ADDRESS
pelo endereço IP reservado anteriormente.Para obter mais informações, consulte Regras de encaminhamento
Para concluir a configuração e testar se o balanceador de carga de rede está configurado corretamente, instale e configure o
HAProxy tcp listener
emnode-1
,node-2
enode-3
:Instale o HAProxy.
sudo apt-get install haproxy
Escolha
Y
para concluir a instalação.Edite o arquivo
haproxy.cfg
.sudo vi /etc/haproxy/haproxy.cfg
Na seção de padrões do
haproxy.cfg file
, altere o modo paratcp
.Anexe a seguinte seção no final do arquivo
haproxy.cfg
#--------------------------------------------------------------- # Set up health check listener for SQL Server Availability Group #--------------------------------------------------------------- listen healthcheck bind *:
HEALTH_CHECK_PORT
Substitua
HEALTH_CHECK_PORT
pela porta de verificação de integridade selecionada anteriormente. Por exemplo, 6.000.Inicie o serviço para confirmar se está configurado corretamente:
sudo systemctl start haproxy.service sudo systemctl enable haproxy.service sudo systemctl restart haproxy.service
Vá para a página Balanceamento de carga e clique no seu balanceador de carga. Observe seus três grupos de instâncias não gerenciadas, eles agora devem ser relatados como íntegros.
Vá para Balanceamento de carga
Como alternativa, você pode executar o comando a seguir no Cloud Shell para ver o status do serviço de back-end.
gcloud compute backend-services get-health aoag1-backend \ --region
REGION
Substitua
REGION
pela região onde as VMs do Linux estão implantadas.
Depois que todos os três grupos de instâncias não gerenciadas apresentarem relatórios íntegros, passe para a próxima etapa.
sudo systemctl restart haproxy.service
Crie o recurso de verificação de integridade no Pacemaker:
SSH para
node-1
e crie um recurso de verificação de integridade para o serviço HAProxy em seu cluster de marcapasso:sudo pcs resource create aoag1-healthcheck \ service:haproxy \ op monitor interval=10s timeout=20s
Verifique se o recurso de funcionamento foi iniciado no nó primário
node-1
:sudo crm status
Se o recurso de verificação de funcionamento não for iniciado no nó primário, mova-o com os seguintes comandos:
sudo pcs resource move aoag1-healthcheck node-1 sudo pcs resource clear aoag1-healthcheck
Você verá que a verificação de integridade do balanceador de carga estará íntegra apenas para
node-1
.
Crie um recurso de endereço IP virtual em seu cluster Pacemaker:
Retorne ao SSH no
node-1
e encontre o nome da interface de rede do seu nó. Você precisará dele na próxima etapa.ip -c link
Crie o recurso de endereço IP virtual.
sudo pcs resource create aoag1-vip ocf:heartbeat:IPaddr2 \ ip="
CLUSTER_ADDRESS
" nic=NIC_NAME
cidr_netmask=32 \ op monitor interval=3600s timeout=60sSubstitua
NIC_NAME
pelo nome da interface de rede da etapa anterior eCLUSTER_ADDRESS
pelo endereço IP reservado.Verifique se o recurso de endereço IP virtual foi iniciado no host primário.
sudo crm status
Se o recurso de endereço IP virtual não for iniciado no nó primário, mova-o com os comandos a seguir.
sudo pcs resource move aoag1-vip node-1
Agrupe os recursos de verificação de integridade e de endereço IP virtual.
sudo pcs resource group add aoag1-group \ aoag1-healthcheck aoag1-vip
Crie uma restrição que localize o novo grupo no mesmo nó que o primário.
sudo pcs constraint colocation add master aoag1-group with master ms-ag1 score=INFINITY
Crie um ouvinte para seu grupo de disponibilidade do SQL Server
As conexões com o SQL Server com grupos de disponibilidade devem usar um nome de ouvinte de grupo de disponibilidade em vez do nome do servidor. Se houver um failover, o ouvinte redirecionará automaticamente as conexões para o novo nó primário no cluster.
Retorne ao SSMS e conecte-se ao banco de dados
node-1
.Execute a seguinte consulta:
ALTER AVAILABILITY GROUP aoag1 ADD LISTENER 'aoag1-listener' ( WITH IP (('
CLUSTER_ADDRESS
','255.255.255.0')), PORT=1433 ); GOSubstitua
CLUSTER_ADDRESS
pelo endereço IP reservado.
Configure uma cerca STONITH
STONITH é uma estratégia de isolamento para manter a integridade dos nós em um cluster HA. O serviço STONITH funciona no nível do nó e protege o cluster contra nós que não respondem ou estão em estado desconhecido. Recomendamos o dispositivo de isolamento fence_gce
especializado para Compute Engine em Google Cloud.
Configurar dispositivos de cerca
Verifique se o agente
fence_gce
- Fence para Compute Engine está instalado emnode1
:sudo pcs stonith list | grep fence_gce
Para obter mais informações, consulte:
- Agente de vedação para Google Compute Engine .
Para ver os parâmetros associados à execução do agente.
sudo pcs stonith describe fence_gce
Em
node-1
, crie os recursos do tipo fencefence_gce
para cada um dos nós participantes:sudo pcs stonith create node-1-fence fence_gce \ plug=node-1 \ zone=
REGION
-a \ project=PROJECT_ID
\ pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \ op monitor interval="300s" timeout="120s" \ op start interval="0" timeout="60s" sudo pcs stonith create node-2-fence fence_gce \ plug=node-2 \ zone=REGION
-b \ project=PROJECT_ID
\ pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \ op monitor interval="300s" timeout="120s" \ op start interval="0" timeout="60s" sudo pcs stonith create node-3-fence fence_gce \ plug=node-3 \ zone=REGION
-c \ project=PROJECT_ID
\ pcmk_reboot_timeout=300 pcmk_monitor_retries=4 pcmk_delay_max=30 \ op monitor interval="300s" timeout="120s" \ op start interval="0" timeout="60s"Substitua
REGION
pela região onde as VMs do Linux estão implantadas e substituaPROJECT_ID
pelo ID do seu projeto.Você pode testar o status dos agentes de fence executando o comando status:
sudo fence_gce -o status -n node-1 --zone=
REGION
-a sudo fence_gce -o status -n node-2 --zone=REGION
-b sudo fence_gce -o status -n node-3 --zone=REGION
-cCrie restrições de localização para seus dispositivos de fence para garantir que eles estejam sendo executados somente nas instâncias pretendidas:
sudo pcs constraint location node-1-fence avoids node-1 sudo pcs constraint location node-2-fence avoids node-2 sudo pcs constraint location node-3-fence avoids node-3
Habilite o isolamento em seu cluster de marcapasso e defina o tempo limite do isolamento do cluster:
sudo pcs -f stonith_cfg property set stonith-enabled=true sudo pcs property set stonith-timeout="300s"
Verifique o status do cluster:
sudo crm status
Teste os dispositivos de cerca
Após a configuração dos dispositivos de cerca, recomendamos testá-los seguindo as etapas a seguir.
Pare a cerca no
node-2
:Conecte-se ao
node-1
e execute o seguinte comando para testar o dispositivo fence associado aonode-2
do seu cluster.fence_gce -o off -n node-2 --zone=
REGION
-bVerifique o status do cluster.
sudo crm status
Você também verá que
node-2
está desativado no Compute Engine.
Reinicie a cerca no
node-2
:Retorne ao
node-1
e reinicie a instância novamente executando o comando a seguir.fence_gce -o on -n node-2 --zone=
REGION
-bVerifique o status do cluster no Pacemaker e no Compute Engine. Após um curto período de tempo, você verá que
node-2
está online novamente.sudo crm status
Configure o Corosync para reinicialização atrasada
Para evitar problemas de tempo e garantir uma ordem adequada de operações executadas no caso de uma ação de esgrima, recomendamos atrasar a reinicialização do serviço Corosync por 60 segundos.
Para obter mais informações, consulte o artigo da base de conhecimento da Red Hat .
Crie um arquivo drop-in do systemd que defina um atraso no início do serviço Corosync em
node-1
,node-2
enode-3
:Abra o corosync.service para edição.
sudo systemctl edit corosync.service
Anexe as seguintes linhas, salve o arquivo e saia do editor.
[Service] ExecStartPre=/bin/sleep 60
Recarregue o gerenciador de serviços e verifique se a configuração foi levada em consideração.
sudo systemctl daemon-reload systemctl status corosync.service --no-pager
Se você vir a seção Drop-In, então as configurações em seu arquivo drop-in foram levadas em consideração com sucesso
Failover de teste
Agora você está pronto para testar se o failover funciona conforme esperado.
- Conecte-se à VM do Windows no
node-4
por meio da Área de Trabalho Remota: - Abra uma sessão do PowerShell:
Execute o seguinte script:
while ($True){ $Conn = New-Object System.Data.SqlClient.SqlConnection $Conn.ConnectionString = "Server=
CLUSTER_ADDRESS
;User ID=sa;Password=SA_PASSWORD
;Initial Catalog=master" $Conn.Open() $Cmd = New-Object System.Data.SqlClient.SqlCommand $Cmd.Connection = $Conn $Cmd.CommandText = "SELECT @@SERVERNAME" $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd $Data = New-Object System.Data.DataSet $Adapter.Fill($Data) | Out-Null $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss") Start-Sleep -Seconds 2 }Substitua
CLUSTER_ADDRESS
pelo endereço IP do ouvinte eSA_PASSWORD
pela senha da conta SA no SQL Server.A cada 2 segundos, o script se conecta ao SQL Server usando o ouvinte do grupo de disponibilidade ou o ouvinte DNN e consulta o nome do servidor.
Deixe o script em execução.
Retorne ao SSH no
node-1
e execute os comandos para acionar um failover nonode-2
:sudo pcs resource move ms-ag1 node-2 --master sudo pcs resource move aoag1-group node-2 sudo pcs resource move aoag1-vip node-2
Retorne à sessão do PowerShell no
node-4
:- Observe a saída do script em execução e observe que o nome do servidor muda de
node-1
paranode-2
como resultado do failover.
- Observe a saída do script em execução e observe que o nome do servidor muda de
Retorne ao
node-1
e inicie um failback paranode-1
:sudo pcs resource move ms-ag1 node-1 --master sudo pcs resource move aoag1-group node-1 sudo pcs resource move aoag1-vip node-1
Retorne ao Powershell no
node-4
e interrompa o script pressionandoCtrl+C
.
Limpar
Depois de concluir o tutorial, você poderá limpar os recursos criados para que eles parem de usar a cota e de incorrer em cobranças. As seções a seguir descrevem como excluir ou desativar esses recursos.
Excluindo o projeto
A maneira mais fácil de eliminar o faturamento é excluir o projeto que você criou para o tutorial.
Para excluir o projeto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.