Eu tenho um sistema bastante ocupado (mais de 1000 solicitações em lote por segundo, mais de 350 trabalhadores em média) construído no sql server 2016. É um grupo de disponibilidade com 3 réplicas síncronas. Gostaria de redirecionar solicitações de leitura em secundários, mas devido ao atraso de redo (e à maneira como o aplicativo funciona), estou preocupado com o fato de os dados buscados estarem obsoletos.
Eu sei que posso obter o último lsn reforçado e o último lsn refeito de sys.dm_hadr_database_replica_states - mas existe alguma maneira de esperar que o redo seja atualizado, evitando um loop while?
Obrigado! Gabriel
Parece que você tem algumas perguntas diferentes aqui:
Uma consulta poderia ser modificada para verificar se o redo está atualizado nos dados subjacentes e, se não, paralisar a execução até que o redo seja atualizado? Essa parece ser uma ideia realmente perigosa porque quando a replicação fica para trás, você terá mais e mais consultas usando threads de trabalho, esperando que a replicação se atualize. Posso ver facilmente a exaustão do thread de trabalho atingindo aqui e causando esperas no pool de threads porque é essencialmente o mesmo cenário que o bloqueio causa.
As consultas podem ser redirecionadas para o secundário mais atual? Sim, usando um balanceador de carga entre seu aplicativo e os SQL Servers. Você pode criar lógica em balanceadores de carga para executar verificações de integridade periódicas e, quando um servidor falha na verificação de carga, ele é retirado da lista de conexões disponíveis até que seja capaz de passar nas verificações de integridade novamente. Esta é uma estratégia bastante comum para servidores web, mas bastante rara para servidores de banco de dados (já que é muito trabalho para construir).
O refazer pode ser feito mais rápido? Sim, teste para ver se o refazer serial ou paralelo é mais adequado para suas cargas de trabalho e certifique-se de obter o que deseja. A Microsoft blogou sobre as pegadinhas com redo paralelo , incluindo gems como apenas os primeiros bancos de dados em seu AG (por ID do banco de dados) obter redo paralelo.