Always On Availability Group, sempre redireciona o usuário para a instância somente leitura

9

Temos um grupo de disponibilidade Always On com um primário e um secundário habilitado para leitura. Temos um usuário da equipe de implementação que usa o banco de dados para verificar a correção dos dados que eles pretendem colocar no banco de dados.

Os usuários têm apenas direitos de leitura no banco de dados, mas quando se conectam (através do SSMS) através do Ouvinte AG, sempre se conectam ao nó ativo.

Eu tentei fazê-los acessar a instância somente leitura diretamente, mas eles estão presos em seus caminhos e depois de um dia ou dois, eles estão novamente no nó ativo.

Existe uma maneira do SQL Server dizer que esse usuário sempre estará com intenção somente leitura e redirecioná-lo para lá?

NOTA: Tentei definir 'ApplicationIntent = ReadOnly' nos parâmetros de conexão adicionais, mas isso não parece redirecionar para o nó secundário e não é a solução ideal, pois eles inevitavelmente esquecerão de configurá-lo para novos iniciantes.

SQL Server 2012 Enterprise, Grupo de disponibilidade 1 primário, 1 secundário legível com confirmação síncrona.

Não pretendo que um usuário se conecte a um servidor vinculado ou através de qualquer outro servidor. Os usuários se conectam diretamente ao banco de dados através do SSMS (nenhum outro aplicativo) e eu gostaria que o AG Listener (ou algo por aí) pudesse direcionar esse usuário para um nó secundário, se um estivesse disponível (pois ele só tem acesso de leitura lá não faz sentido acessar o primário) sem que o usuário precise fazer nada, pois ele se move pelas máquinas e esquece de adicionar a intenção do aplicativo. Também acho que adicionar isso aos parâmetros de conexão adicionais nem sempre o direciona para o nó secundário.

Ste Bov
fonte
além dos comentários abaixo, você precisa especificar o banco de dados no AG ao qual está se conectando.
swasheck

Respostas:

4

Não tenho uma resposta para toda a sua pergunta (embora eu tenha respondido a uma pergunta semelhante hoje https://dba.stackexchange.com/a/137844/36812 ), mas você mencionou que usar ApplicationIntent = ReadOnly não funciona devidamente.

Você configurou URLs de roteamento somente leitura? Como não é feito imediatamente e, se você não o fizer, essas configurações e esse sinalizador não funcionarão. Eu acho que se você conseguir isso, poderá começar a reavaliar seus requisitos.

Instruções no MSDN https://msdn.microsoft.com/en-us/library/hh710054.aspx e mais facilmente executadas no PowerShell.

Set-Location SQLSERVER:\SQL\PrimaryServer\default\AvailabilityGroups\MyAg
$primaryReplica = Get-Item "AvailabilityReplicas\PrimaryServer"
$secondaryReplica = Get-Item "AvailabilityReplicas\SecondaryServer"

Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://PrimaryServer.domain.com:1433" -InputObject $primaryReplica
Set-SqlAvailabilityReplica -ReadOnlyRoutingConnectionUrl "TCP://SecondaryServer.domain.com:1433" -InputObject $secondaryReplica
Set-SqlAvailabilityReplica -ReadOnlyRoutingList "SecondaryServer","PrimaryServer" -InputObject $primaryReplica
Cody Konior
fonte
1

Ste, o que você quer é um ponto e clique em solução ou configuração em algum lugar. Infelizmente, atualmente nenhum deles existe no formato "pronto para uso". Seria muito bom se a Microsoft incluísse isso nas configurações de conexão de um Servidor Registrado para que ele pudesse ser salvo, mas infelizmente não.

Isso deixa você com uma das duas opções:

  • Escreva algo você mesmo
  • Alterar o comportamento do usuário

Encontrei um download da Microsoft para o SNAC - SQL Native Access Client, procurando algo que pudesse atender aos seus requisitos. Isso permitiria que você escrevesse um pequeno pedaço de código para fornecer aos usuários um botão para acessar diretamente o secundário Somente Leitura. https://blogs.msdn.microsoft.com/alwaysonpro/2013/08/02/connect-to-sql-server-using-application-intent-read-only/

A outra possibilidade é forçar os usuários a preencher o diálogo de parâmetros de conexão ao se conectar através do SSMS. Para forçar esse comportamento, você precisará modificar os logons nos servidores primário e secundário, negando a conexão com o primário e permitindo a conexão com os secundários. Você pode usar um trabalho do SQL Agent para verificar o status do servidor e definir logins adequadamente.

É certo que não tentei fazer o último, mas, em teoria, deveria funcionar.

Steve Mangiameli
fonte
-2

Parece que agora é um recurso do SQL Server 2019.

Do redirecionamento de conexão de leitura / gravação da réplica secundária para a primária (Grupos de Disponibilidade AlwaysOn) na documentação oficial:

A pré-visualização do SQL Server 2019 CTP 2.0 introduz o redirecionamento de conexão de leitura / gravação da réplica secundária para a primária nos Grupos de Disponibilidade AlwaysOn. O redirecionamento de conexão de leitura / gravação está disponível em qualquer plataforma do sistema operacional. Ele permite que as conexões do aplicativo cliente sejam direcionadas para a réplica primária, independentemente do servidor de destino especificado na cadeia de conexões.

Por exemplo, a cadeia de conexão pode direcionar uma réplica secundária. Dependendo da configuração da réplica do grupo de disponibilidade (AG) e das configurações na cadeia de conexão, a conexão pode ser redirecionada automaticamente para a réplica primária.

Matt
fonte
Não tenho certeza de que posso ver como esse novo recurso é relevante aqui. O cenário do OP parece ser diferente daquele para o qual este recurso se destina. O OP deseja redirecionar conexões somente leitura para um nó secundário (somente leitura), enquanto a documentação desse novo recurso diz que é para redirecionar conexões de leitura / gravação para o nó principal. Você poderia explicar como a nova funcionalidade poderia ser usada para resolver o problema em questão?
Andriy H