Como DBAs, geralmente encontramos nossos clientes reclamando que o Servidor de Produção atual não é capaz de manter a carga no servidor e se a carga pode ser balanceada com o Servidor Secundário. Isso é possível com um banco de dados no DR Server com banco de dados somente leitura no Log Shipping e réplicas do SQL Server Secundário no Always On Availability Group. A maior vantagem do Always On Groups é que ele nos permite configurar HA em nível de grupo para qualquer número de bancos de dados e podemos criar até quatro réplicas secundárias e isso é uma combinação de Clustering, Log Shipping e Database Mirroring onde a transmissão de dados é mais flexível e funcional.
Always On Readable Secondary Replica tem um recurso para lidar com determinadas solicitações de conexão somente leitura chamadas roteamento somente leitura. Geralmente, por padrão, tanto a leitura quanto a intenção de leitura são direcionadas para a réplica primária e nada é destinado às réplicas secundárias. Agora, as réplicas secundárias podem ser usadas não apenas para fins de backup, DBCC e relatórios, mas também podem ser consultadas no futuro usando ‘ReadOnly’ como sua intenção do aplicativo na cadeia de conexão do aplicativo.
Temos três réplicas SQL1, SQL2 e SQL3 no cluster de failover do Windows. Cada nó tem uma instância autônoma do SQL Server 2012 instalada e configurada com Always On AG. Estamos sempre no Grupo AG chamado “CODEAG” com o nome do ouvinte “CODELIS”
Na captura de tela a seguir, SQL1 é uma réplica primária, SQL2 é uma réplica secundária e SQL3 é uma réplica secundária.
Como configurar a lista de roteamento somente leitura em grupos de disponibilidade sempre ativados
Etapa 1:
As conexões são feitas com o Grupo de Disponibilidade usando o nome ou IP do Ouvinte. Agora, para criar vários ouvintes para um grupo de disponibilidade, siga o procedimento abaixo.
Para criar ou configurar manualmente um ouvinte para um grupo de disponibilidade
- No Pesquisador de Objetos, conecte-se à instância que contém a réplica primária do grupo de disponibilidade.
- Expanda o Grupo AON e clique no Grupo de Disponibilidade para o qual estamos tentando configurar manualmente o ouvinte e prossiga.
- Clique com o botão direito do mouse no nó Ouvintes do Grupo de Disponibilidade e selecione Novo Comando de Ouvinte. Isso abre uma nova caixa de diálogo para configurar um ouvinte.
- O número da porta de um ouvinte existente pode ser alterado expandindo o nó de ouvintes do grupo de disponibilidade, clicando com o botão direito do mouse nos ouvintes e selecionando as propriedades.
- Agora, insira o novo número da porta e clique em OK.
Identifique o nome do ouvinte configurado para replicação Always On consultando o DMV conforme abaixo.
SELECT AV.name AS AVGName , AVGLis.dns_name AS ListenerName , AVGLis.ip_configuration_string_from_cluster AS ListenerIP FROM sys.availability_group_listeners AVGLis INNER JOIN sys.availability_groups AV on AV.group_id = AV.group_id
Na captura de tela a seguir, o nome do grupo AG é CODEAG e o IP do ouvinte AG é CODELIS.
Etapa 2:
Para configurar o roteamento somente leitura, precisamos configurar as réplicas para somente leitura para permitir conexões somente leitura para réplicas secundárias.
- Conecte-se à instância que contém a réplica primária.
- Expanda o AON High Availability Node e, em seguida, o AG Group Node.
- Clique no Grupo AG cuja réplica deve ser alterada.
- Clique com o botão direito do mouse na réplica e selecione as propriedades para alterar o acesso à conexão para as funções Primária e Secundária da seguinte forma.
A função Secundária tem um novo valor da lista secundária legível.
Somente com intenção de leitura
Esta opção permite o acesso de leitura dos bancos de dados secundários desta réplica. Somente conexões somente leitura são permitidas.
Sim
Esta opção permite apenas acesso de leitura, mas todas as conexões são permitidas para a réplica secundária.
Não
Isso interrompe todas as conexões do usuário com a réplica secundária e nem permite que você leia.
Defina as propriedades secundárias legíveis como Somente leitura.
Na captura de tela a seguir, as propriedades Readable Secondary de cada réplica secundária são definidas como Read-intent.
Etapa 3:
Cada réplica secundária legível pode receber uma URL de roteamento somente leitura que será usada para rotear solicitações de conexão com intenção de leitura para uma réplica secundária legível específica.
Use T-SQL para especificar uma URL de roteamento somente leitura para todas as réplicas em nosso Grupo de Disponibilidade.
ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL1' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL1' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL1.abc.com:17999')); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL2.abc.com:17999')); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL3' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL3' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL3.abc.com:17999'));
Etapa 4:
Para a réplica que estamos marcando como roteamento somente leitura quando é a réplica primária, há a necessidade de especificar uma lista de roteamento somente leitura e isso é efetivado somente quando a réplica local está sendo executada sob a função primária.
ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL1' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL3'))); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL3' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL1'))); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL3','SQL1')));
No script acima, o exemplo quando SQL1 é a réplica primária, a carga de trabalho somente leitura será redirecionada para as réplicas secundárias legíveis; o SQL2 e o SQL3 respectivamente:da mesma forma, se o SQL3 for a réplica primária, a carga de trabalho somente leitura será redirecionada para as réplicas secundárias legíveis; o SQL2 e SQL1 respectivamente.
O tráfego direcionado somente leitura será roteado para a primeira réplica disponível até que, a menos que não esteja acessível, direcione o tráfego para a próxima réplica disponível na lista de roteamento. Quando você tem mais de uma réplica, não é possível compartilhar a carga entre as réplicas até o SQL Server 2012 e 2014. Mas o SQL Server 2016 permite balancear a carga entre as réplicas somente leitura.
Exemplo:
ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('SQL3','SQL1'), ‘SQL2’)));
Esse comportamento da lista de roteamento “balanceia a carga” das conexões somente leitura entre SQL3 e SQL1. Acima, temos duas listas incorporadas na lista de roteamento:
Lista 1:'SQL3', 'SQL1'
Lista 2:'SQL2'
Roteie para as réplicas na primeira lista. SQL3 e SQL1 são acessíveis para conexões somente leitura. A primeira conexão somente leitura de entrada será roteada para SQL3, a segunda conexão somente leitura será roteada para SQL1, a terceira conexão somente leitura será roteada para SQL3, a quarta conexão somente leitura será roteada para SQL1 e assim por diante, com uma distribuição 'round-robin' de conexões somente leitura entre as duas réplicas na primeira lista.
Se alguma réplica ficar indisponível, o roteamento continuará com as réplicas restantes na primeira lista. Se SQL3 ou SQL1 se tornar inacessível para conexões somente leitura, as conexões somente leitura serão roteadas apenas para as réplicas somente leitura acessíveis na primeira lista. Por exemplo, se o SQL3 estiver em um estado não sincronizado ou ALLOW_CONNECTIONS estiver definido como NO, todas as conexões somente leitura serão roteadas para SQL1. Enquanto um dos servidores estiver disponível para conexões somente leitura, NENHUMA conexão somente leitura será roteada para SQL2.
Se todas as réplicas na primeira lista estiverem inacessíveis, roteie para réplicas na próxima lista. Se SQL3 e SQL1 se tornarem inacessíveis para conexões somente leitura, todas as conexões somente leitura serão roteadas apenas para a próxima lista de réplicas, que neste caso é SQL2.
Retome o roteamento para a primeira lista se alguma réplica estiver disponível. À medida que as réplicas secundárias com prioridade mais alta na lista se tornam acessíveis para conexões somente leitura, as futuras conexões somente leitura se conectarão a elas conforme apropriado.
No SQL Server 2016, você pode configurar o balanceamento de carga em um conjunto de réplicas somente leitura.
Etapa 5:
sys.availability_read_only_routing_lists DMV, que retorna a lista de roteamento somente leitura de cada réplica do Grupo de Disponibilidade no Grupo de Disponibilidade AlwaysOn.
SELECT AVGSrc.replica_server_name AS SourceReplica , AVGRepl.replica_server_name AS ReadOnlyReplica , AVGRepl.read_only_routing_url AS RoutingURL , AVGRL.routing_priority AS RoutingPriority FROM sys.availability_read_only_routing_lists AVGRL INNER JOIN sys.availability_replicas AVGSrc ON AVGRL.replica_id = AVGSrc.replica_id INNER JOIN sys.availability_replicas AVGRepl ON AVGRL.read_only_replica_id = AVGRepl.replica_id INNER JOIN sys.availability_groups AV ON AV.group_id = AVGSrc.group_id ORDER BY SourceReplica
Na captura de tela a seguir, o resultado mostra a URL de roteamento e a prioridade de roteamento.
Etapa 6:
Para testar o roteamento somente leitura usando SQLCMD, use o parâmetro –K ReadOnly que mostra a réplica secundária recebendo conexões de leitura de acordo com a lista de roteamento.
Na captura de tela a seguir, a réplica secundária está aceitando as conexões de leitura, ou seja, SQL2.
Etapa 7:
Failover do grupo de disponibilidade e teste o roteamento somente leitura.
- No Pesquisador de Objetos, conecte-se a uma instância de servidor que hospeda uma réplica secundária do grupo de disponibilidade que precisa passar por failover. Expanda a árvore do servidor.
- Expanda o nó AlwaysOn High Availability e o nó Grupos de Disponibilidade.
- Clique com o botão direito do mouse no grupo de disponibilidade para failover e selecione Failover.
Agora, o SQL2 se torna a réplica primária e as conexões são tratadas pelo SQL1.
A sintaxe da cadeia de conexão que o aplicativo deve usar dependerá do provedor do SQL Server.
Se for .Net Framework Data Provider 4.0.2 para SQL Server, a sintaxe será a seguinte:
Server=tcp:MyAgListener,portnumber;Database=SQL1;IntegratedSecurity=SSPI;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
Conclusão:
Para reduzir as cargas de trabalho, esse roteamento somente leitura continua sendo a melhor opção. Um aplicativo que envolva o SQL Server Reporting Services hospedado no SharePoint ou a instalação do Report Server no modo nativo pode usar a intenção somente leitura que evita o bloqueio típico, uso de memória e CPU em nós primários.