sábado, 13 de junho de 2020

SQL Server AlwaysOn Configurando Replica Somente Leitura


O AlwaysOn possibilita configurar acesso somente leitura para réplicas, com redirecionamento automático a partir do acesso via  Listener. Neste post vou mostrar como configurar as rotas de acesso somente leitura de réplicas, além da configuração necessária na aplicação cliente.

O ambiente que utilizei como exemplo possui 3 servidores:

Windows 2019 Server Domain Controler: SRVWIN2019-DC
Réplica 1 SQL Server 2019: SRV2019-SQL1
Réplica 2 SQL Server 2019: SRV2019-SQL2

O acesso é feito através do Listener SRVSQL-AGL ou o IP 192.168.1.216.




A réplica SRV2019-SQL1 é o primário e a réplica SRV2019-SQL2 o secundário somente leitura, ambos utilizando o modo síncrono.

A conexão de teste foi estabelecida através do Listener, sendo direcionada para a réplica SRV2019-SQL1 (primário).


Agora que ficando claro o ambiente, vamos iniciar a configuração da conexão somente leitura redirecionada para réplica secundária.


1) Configurando a Réplica como Leitura

O padrão é a réplica não aceitar conexão quando desempenha o papel de secundária, para aceitar conexões de consulta precisamos escolher uma das duas opções abaixo:

Read-intent only – não aceita conexão direta, apenas aquelas redirecionadas via Listener.
Yes – aceita conexão direta e redirecionada.

Este ajuste pode ser feito na interface gráfica, acessando as propriedades do Availability Group, ou por T-SQL:

ALTER AVAILABILITY GROUP [SRVSQL-AG1]
MODIFY REPLICA ON N'SRV2019-SQL2' WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY))


2) URL de Redirecionamento

Cada réplica somente leitura precisa ter uma URL de redirecionamento, que pode ser definida pelo comando ALTER AVAILABILITY GROUP:

ALTER AVAILABILITY GROUP [SRVSQL-AG1] 
MODIFY REPLICA ON N'SRV2019-SQL2' WITH  
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SRV2019-SQL2:1433'))

ALTER AVAILABILITY GROUP [SRVSQL-AG1] 
MODIFY REPLICA ON N'SRV2019-SQL1' WITH  
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SRV2019-SQL1:1433'))


Veja nas propriedades do Availability Group as URLs definidas.


Podemos obter a mesma informação com a consulta abaixo.

SELECT replica_server_name as SrvReplica,
read_only_routing_url as ReplicaURL,
secondary_role_allow_connections_desc as ReplicaTipo
FROM sys.availability_replicas

ORDER BY SrvReplica



3) Criando Rotas
Terceira e última configuração necessária é definir as rotas, no caso de ser necessário um redirecionamento para conexões somente leitura. 

No comando abaixo estamos definindo o acesso somente leitura para a réplica SRV2019-SQL2 no caso de o primário ser a réplica SRV2019-SQL1.

ALTER AVAILABILITY GROUP [SRVSQL-AG1]
MODIFY REPLICA ON N'SRV2019-SQL1' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SRV2019-SQL2')))


Devemos fazer o inverso também, no caso da réplica SRV2019-SQL2 virar o primário.

ALTER AVAILABILITY GROUP [SRVSQL-AG1]
MODIFY REPLICA ON N'SRV2019-SQL2' WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SRV2019-SQL1')))

Veja agora nas propriedades do Availability Group a configuração de rota feita.


Podemos obter a mesma informação com a consulta abaixo.

SELECT b.replica_server_name as OrigemProducao,
c.replica_server_name as DestinoReplica,
c.read_only_routing_url as RotaURL,
a.routing_priority as Prioridade

FROM sys.availability_read_only_routing_lists a
JOIN sys.availability_replicas b ON a.replica_id = b.replica_id
JOIN sys.availability_replicas c ON a.read_only_replica_id = c.replica_id
JOIN sys.availability_groups d ON d.group_id = b.group_id
ORDER BY OrigemProducao



Configurando o Acesso Somente Leitura no Cliente

Com a infraestrutura toda pronta no Availability Group, basta utilizar a propriedade somente leitura no cliente, vamos testar três cenários: SQLCMD, SQL Management Studio e Reporting Service.

Para ocorrer o redirecionamento a conexão deve ser feita direto em um dos bancos de dados que pertencem ao Availability Group, no meu ambiente será o banco de dados VendasDB.

SQLCMD
Abra uma janela de prompt de comando SQLCMD utilizando “-d” para definir o banco de dados de conexão e “-k readonly” para especificar o tipo de conexão somente leitura.


SQLCMD -S SRVSQL-AGL -d VendasDB -U Teste -P Teste -K ReadOnly

Repare que a conexão foi feita no Listener e mesmo sendo a réplica SRV2019-SQL1 a primária, a conexão foi direcionada para réplica secundária somente leitura SRV2019-SQL2.

Basta remover a cláusula “-d” onde selecionei um banco de dados do Availability Group, que a conexão será estabelecida no banco de sistema MASTER, e este como não faz parte do Availability Group, a conexão permanece na réplica primária.


No SQL Server Management Studio devemos utilizar a cláusula “ApplicationIntent=ReadOnly”, para utilizar a infraestrutura de redirecionamento do AlwaysOn.


Selecionando um banco do Availability Group na conexão.


Veja que apesar da réplica primária ser SRV2019-SQL1 conectamos no SRV2019-SQL2.


No Reporting Services utilizamos a cláusula “ApplicationIntent=ReadOnly” nas propriedades do Data Source.



Se o seu Reporting Service é 2014 ou anterior, terá que atualizar .Net Framework 3.5 para SP1.


Desculpe o post ser um pouco grande, muita tela para mostrar com clareza a configuração.

Saudações Tricolores,
Landry

terça-feira, 8 de outubro de 2019

Monitorando AlwaysOn

Nos posts anteriores mostrei como configurar AlwaysOn Availability Groups (links abaixo), neste post vou mostrar como monitorar um ambiente de AlwaysOn.  As opções que irei mostrar neste post serem tanto para AlwaysOn Availability Groups quanto Read-scale Availability Group.


Links Configurando AlwaysOn Availability Groups:

O ambiente de AlwaysOn pode ser monitorado da interface gráfica ou por T-SQL, além de contadores no System Monitor.

Utilizando o SQL Server Management Studio no Object Explorer, temos acesso ao Dashboard do AlwaysOn, basta clicar com o botão direito do mouse no grupo em Availability Groups.


O Dashboard mostra todas as Réplicas e o Status de cada Banco de Dados.


Podemos acrescentar mais informações ao Dashboard, algumas bem úteis para avaliar a transferência das transações para as demais Réplicas, principalmente no modo de operação assíncrono.


Recomendo as duas colunas em destaque abaixo, para monitorar a fila de envio de transações para as Réplicas, além da fila de execução destas transações nas Réplicas.


Conseguimos obter informações similares utilizando T-SQL, acessando Views de sistema.

SELECT n.group_name as GrupoAlwaysOn,n.replica_server_name as Servidor,
db_name(drs.database_id) as BAnco,
drs.synchronization_state_desc as StatusSincronia,
drs.synchronization_health_desc as StatusAlwaysOn

FROM sys.dm_hadr_availability_replica_cluster_nodes n
join sys.dm_hadr_availability_replica_cluster_states cs on n.replica_server_name = cs.replica_server_name
join sys.dm_hadr_availability_replica_states rs on rs.replica_id = cs.replica_id
join sys.dm_hadr_database_replica_states drs on rs.replica_id=drs.replica_id


ORDER BY n.replica_server_name, db_name(drs.database_id)


SELECT r.replica_server_name as Servidor, db_name(rs.database_id) as Banco,
rs.synchronization_state_desc as StatusAlwaysOn,
isnull(convert(varchar(20),rs.last_commit_time,103) + ' ' + convert(varchar(20),rs.last_commit_time,108),'n/a') as UltimaDataHoraSinc,
isnull(rs.log_send_rate,0) as FilaEnvio,isnull(rs.log_send_queue_size,0) as FilaExecReplica

FROM sys.availability_replicas r
join sys.dm_hadr_database_replica_states rs on r.replica_id = rs.replica_id

WHERE 1=1

ORDER BY r.replica_server_name, db_name(rs.database_id)


Podemos acessar também os contadores do AlwaysOn via TSQL View “sys.dm_os_performance_counters”.

SELECT object_name,counter_name,instance_name,cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name = 'SQLServer:Availability Replica'


Até o próximo post.

Saudações Tricolores,
Landry


domingo, 6 de outubro de 2019

Configurando AlwaysOn Availability Groups - Parte 3

Seguindo com a série de posts Configurando AlwaysOn Availability Groups, estando o cluster do Windows instalado e configurado, agora vamos habilitar e configurar o AlwaysOn no SQL Server.
Configuração do AlwaysOn no SQL Server
Para habilitar o AlweysOn no SQL Server abra o SQL Server Configuration Manager, selecione SQL Server Services e clique com o botão direito no serviço do SQL Server e entre em Properties.






Configurar em todos os Nós do Cluster, habilitando o AlwaysOn no SQL Server e reiniciando o serviço.

O restante da configuração é feito no SQL Server Management Studio. No Object Explorer expandir Always On High Availability e clique com o botão direito do mouse em Avaialability Groups e selecione New Availability Group Wizard.



Atribua o nome do grupo seguindo ao padrão recomendado -AG1.



Na tela seguinte vamos selecionar os Bancos de Dados que farão parte deste Availability Group, apenas aqueles com Recovery Full estarão disponíveis!




Na tela Specify Replicas vou selecionar as opções de Failover automático e Replica com consulta disponível.





Em Backup Preferences selecione Primary, pois os outros modos não suportam Backup Diferencial.

Para definir um Listener, defina nome similar ao do Avaiabilitity Group com “L” no final: SRVSQL-AGL, porta 1433.



Para realizar a sincronia inicial (Backup / Restore) de modo automático selecione Automatic seeding.  Eu particularmente prefiro realizar antes a sincronia manual executando Backup FULL e LOG no Primário, em seguida restaurando nas Réplicas utilizando a cláusula NORECOVERY, neste caso selecione Join only.



Finalizando a configuração o Wizard irá configurar o AlwaysOn em ambos os Nós e criar o grupo de recursos no Cluster.

Abra o Cluster Manager para verificar a configuração, Nó ativo em Owner Node.



Para monitorar o AlwaysOn basta acessar o Dashboard no Management Studio.




Finalizamos a série de posts sobre AlwaysOn Availability Groups no SQL Server 2017.

Saudações Tricolores,
Landry