Estou analisando as opções de alta disponibilidade para meu aplicativo com SQL Server.
Os requisitos são:
- proteção contra alta de falha de armazenamento.
- Acessibilidade de dados quando um dos servidores de banco de dados está passando por atualizações de software (por exemplo, interrupção planejada para os service packs do Windows Update / SQL Server).
- Não deve envolver muito a aquisição de hardware.
- O aplicativo é um aplicativo da Web ASP.NET.
- Os usuários do aplicativo da web possuem suas próprias instâncias de banco de dados.
Eu já vi duas opções principais: clustering de failover do SQL Server e espelhamento do SQL Server.
Entendo que o clustering de failover do SQL Server exige a compra de uma matriz de discos compartilhada e não oferece nenhuma proteção se o armazenamento compartilhado ficar inativo (portanto, a documentação recomenda configurar um espelhamento entre dois clusters).
O espelhamento de banco de dados parece ser a opção mais barata (já que requer apenas dois servidores de banco de dados e uma simples caixa de testemunhas) - mas ouvi dizer que não funciona bem quando você tem um grande número de bancos de dados. O aplicativo que estou desenvolvendo envolve dar a cada cliente seu próprio banco de dados para o aplicativo - pode haver centenas de bancos de dados. Configurar o espelhamento não é problema, graças aos sistemas de automação que temos em funcionamento.
Meu último ponto diz respeito a como o failover funciona com relação a conexões de cliente - o cluster de failover do SQL Server usa MSCS, o que significa que o cluster é invisível para clientes - uma tentativa de conexão pode falhar durante o failover, mas uma reconexão simples . No entanto, o espelhamento, até onde eu sei, requer que o cliente esteja ciente dos parceiros espelhados: se o cliente não puder se conectar ao servidor principal, ele tentará o servidor secundário.
Eu estou querendo saber como isso funciona com relação ao pool de conexão em aplicativos ASP.NET - faz o failover de conexão do cliente significa que há uma potencial 2 segundos (assumindo 2000ms TCP tempo limite diretiva) pausa quando o pool de conexão tenta o servidor principal em cada tentativa de conexão?
Eu li em algum lugar que o espelhamento pode ser usado em cima do MSCS, o que significa que o cliente não precisa estar ciente do espelhamento (portanto, não haveria nenhum atraso potencial durante a conexão e também que nenhuma alteração precisaria ser feita para o cliente, nem mesmo a string de conexão) - no entanto, estou achando difícil obter documentação ou white papers sobre essa abordagem. Mas se for verdade, significa que o melhor método é Espelhar (para HA) com MSCS (para a ignorância do cliente e o desempenho da conexão).
... mas como isso se adapta a uma instância do servidor que pode conter centenas de bancos de dados espelhados?