Olá,
A idéia deste post é comentar brevemente sobre o tema “Alta Disponibilidade e Recuperação de Desastres”. Comentar sobre as diferenças entre as duas expressões (que são geralmente inter-relacionadas, porém têm objetivos distintos), sobre algumas das várias opções que temos para desenhar uma estratégia de alta disponibilidade e/ou recuperação de desastres e comentar sobre as principais tecnologias oferecidas pelo produto SQL Server para te apoiar na definição da melhor estratégia.
Vou falar sobre “arquitetura”, não sobre “implementação”, que provavelmente será tratada com detalhes nos próximos posts. A idéia é dar um overview sobre o conceito e sobre as tecnologias, para você pode avaliar o que cabe no seu ambiente e o que te interessa mais, para que você possa se aprofundar por conta.
O que significa?
Apesar de “Alta Disponibilidade e Recuperação de Desastres” – “High Availability and Disaster Recovery” em inglês, ou simplesmente HADR – geralmente ser utilizada como uma única expressão, significando um único conceito, na verdade trata-se de dois objetivos distintos. Para efeitos teóricos e conceituais, seguem as definições que acho mais coerentes para cada uma delas:
“Alta disponibilidade refere-se à disponibilidade dos recursos de um sistema (sejam eles hardware, software, energia, etc.), no momento em que ocorrer uma falha em pelo menos um dos componentes deste sistema.”
Ou seja, você tem um sistema, uma estrutura de banco de dados, formada por um datacenter, um servidor, um sistema operacional, uma ou mais bases de dados, uma ou mais tabelas, conexões de rede, storage, etc., etc.. E em algum momento, algum destes componentes falha, vamos imaginar como exemplo a famosa tela azul, uma falha no teu sistema operacional. O quão redundante está o teu sistema, a ponto de você poder apontar o teu sistema para uma máquina redundante (uma cópia) e botar teu sistema novamente na ativa? Lembrando apenas que o tempo que você vai levar para botar esta máquina em pé novamente, varia de cliente pra cliente, de necessidade para necessidade, mas a gente fala sobre isso daqui a pouco.
Já a “Recuperação de Desastres” refere-se à habilidade de continuar a prover disponibilidade de um sistema no evento de um desastre de qualquer grandeza (seja ele maior, como um furacão atingindo seu datacenter, ou menor, como a exclusão indevida de uma tabela ou uma queda de energia).”
Ou seja, seu sistema existe e está, ou não, configurado com alta disponibilidade, porém ocorre um evento de um desastre qualquer (qualquer um, de maior ou menor grandeza!), logo a “recuperação de desastres” trata do quão preparado você está para botar novamente em funcionamento o seu sistema.
Costuma-se dizer que são expressões inter-relacionadas, pois para a recuperação de um desastre (um restore de um backup no caso de uma exclusão inadvertida de dados, por exemplo), não necessariamente o seu sistema deveria estar configurado com alta disponibilidade. Você pode não ter qualquer objetivo definido (um SLA – service-level agreement, um RTO – recovery time objective, ou um RPO – recovery point objective), nenhum tempo pré-acordado para botar novamente em funcionamento a tabela que continha os dados que foram excluídos, logo você não tem preocupação com alta disponibilidade. Porém você tem uma estratégia muito simples para recuperação de desastres (backup/restore), logo você calmamente restaura os seus dados e pronto, você está recuperado de um desastre! Parece um exemplo bobo e fictício mas acreditem, este cenário é mais comum do que imaginamos!
E o que pode falhar?
Uma infinidade de coisas pode acontecer, desde uma tomada desligada pelo pessoal da limpeza, passando pela exclusão indevida de dados de uma tabela de produção por um DBA já cansado, um problema em um pente de memória ou até a inundação do seu datacenter, a quebra de um ar-condicionado que pode levar ao super-aquecimento do seu hardware queimando a CPU do seu servidor, etc.
- Hardware: CPU, discos, memória, placa de rede ;
- Software: sistema operacional, SQL Server corrompido, arquivo de dados corrompido;
- Falta de energia – queda temporária de energia, tomada desligada indevidamente;
- Datacenter – um possível incêndio, uma inundação, furacões, terremotos, etc.;
- Humanos – erros humanos podem ocorrer (DBAs, usuários), dados podem ser apagados, configurações podem ser alteradas indevidamente
E como definir a melhor estratégia?
Comece com as seguintes perguntas:
- Qual o nível de disponibilidade que a empresa quer/precisa ter? Qual é o “desejo”!?
- O que deve estar sempre disponível? Meu datacenter inteiro, meu servidor, meu database, apenas dois databases, minha tabela de clientes, só as vendas do dia? Qual é a granularidade desta redundância?
- Quanto tempo (em minutos) eu posso ficar fora do ar, com minhas operações e meu pessoal parados? Ou seja, quanto eu posso perder (em dinheiro, em negócios, em clientes)? É claro que todos vão dizer “eu não posso perder nada”, mas qual é um valor aceitável, realista (um hospital tem necessidades diferentes de uma loja de e-commerce), já que além de improvável, é muito caro atingir 100% do tempo disponível (uptime).
- Quanto a empresa está disposta a gastar com esta solução? Hardware, infra-estrutura (datacenter, ar condicionado), licenciamento de software, equipe, treinamento, etc..
Com as respostas acima será possível responder às seguintes questões, fundamentais para a definição da sua estratégia:
- Quais componentes eu preciso tornar redundantes para atender as necessidades da empresa?
- Quem estará envolvido (pessoal) no momento de crise (DBA’s, SysAdmin’s, Desenvolvedores, Usuários, etc.)?
Redundância de pessoas, hardware e software
A sua estratégia deve contemplar redundância de pessoal, hardware e software. Todos os possíveis pontos de falha devem ser endereçados e uma estratégia de failover para qualquer dos componentes redundantes deve ser definida.
A redundância em um ambiente de alta disponibilidade deve ser feita em todos os níveis, desde as pessoas envolvidas (um DBA, um SysAdmin, um Desenvolvedor, etc.) até componentes de hardware (CPU, memória, discos, placas de rede) e software (sistema operacional, SQL Server). Todos os possíveis pontos de falha devem ser identificados e endereçados, e uma estratégia para botar estes componentes de novo na ativa, devem ser definidos.
Lembre-se que o seu sistema será tão redundante quanto o elo mais fraco de sua arquitetura: se seu hardware estiver redundante, mas o seu pessoal não estiver (se você tiver apenas um DBA na equipe, e ele estiver impossibilitado de chegar a tempo no momento de um desastre), então o elo mais fraco será seu pessoal, e o ambiente não estará disponível da mesma maneira.
E quais tecnologias estão disponíveis no SQL Server:
Uma breve (breve mesmo!) descrição sobre as principais tecnologias:
A solução de Clustering oferece failover automático (não manual) do seu hardware (escopo de servidor), é transparente para os usuários (eles nem ficam sabendo que o failover ocorreu), porém não oferece redundância do seu storage. Se o seu storage falhar, você estará em apuros. A configuração é um pouco mais complicada que as outras soluções, requer hardware específico e é um pouco mais cara! Você não pode usar o failover para execução de queries para relatórios (read-only), por exemplo (o servidor de failover não pode ser utilizado com exceção a partir do momento do failover).
A tecnologia de Database Mirroring (synch e asynch) oferece 3 configurações: synchronous, asynchronous e synchronous com failover automático. A synchronous (sincronizada) oferece maior nível de disponibilidade, pois só “comita” a transação no cliente após escrever a transação no log da base espelhada (mirror), o que aumenta a latência no retorno do commit, prejudicando um pouco a performance da aplicação. A synchronous com failover automático é a mesma coisa, porém trabalhando com um servidor chamado “witness”, que garante o failover automático. Já a asynchronous (não sincronizada) não espera a escrita na base espelhada para devolver o commit para o cliente, este processo ocorre em paralelo, melhorando a performance porém prejudicando um pouco a disponibilidade. É possível a utilização das bases de mirroring para relatórios através de database snapshots. Um ponto negativo é que trabalha no escopo de database, ou seja, apenas um database por vez é espelhado, ou seja, as bases master, msdb, model, por exemplo, não são espelhadas em conjunto, o que pode causar uma séria de problemas (que serão discutidos em próximos posts).
A Replicação (Replication), permite filtrar as informações que serão redundadas, e oferece o menor nível de granularidade para redundância. Trabalha com os conceitos de Publishers, Subscribers e Distributors e permite a redundância de mais de um database por vez. É a melhor opção que combina disponibilidade com escalabilidade, pois permite utilização online das “bases espelhadas”. Oferece as configurações Transactional, Merge, Snapshot e Peer-to-Peer.
O Log Shipping é basicamente o backup e restore de bases de dados em um servidor remoto e um tempo pré-definido. É bastante utilizado e oferece possibilidade de redundância de uma base de dados para mais de um servidor ao mesmo tempo (ao contrário do database mirroring). Por tratar de um restore, obviamente oferece um failover mais demorado de acordo com o tamanho do seu database, mas dependendo do cenário pode ser um bom complemento para uma solução de database mirroring.
Além das soluções acima listadas (as principais e provavelmente mais utilizadas), ainda teremos a nova funcionalidade de “Always On” (no SQL Server 2012), soluções de mirroring de storage, soluções de RAID, e é claro, o essencial backup e restore. Enfim, várias tecnologias e funcionalidades disponíveis, que combinadas (em conjunto, não sozinhas!) te oferecem as melhores opções para alta disponibilidade de recuperação de desastres.
Um abraço,
Raul Santos Neto