fbpx
Resiliência – Tolerância a Falhas (Fault Tolerance)
Publicado em: terça-feira, 27 de ago de 2024

Tolerância a falhas é a capacidade de um sistema continuar operando corretamente mesmo quando uma ou mais de suas componentes falham. Em vez de interromper ou degradar o serviço, um sistema tolerante a falhas é projetado para lidar com falhas, mantendo o funcionamento normal ou próximo ao normal. A tolerância a falhas é um aspecto fundamental de sistemas críticos onde a disponibilidade e a confiabilidade são prioritárias, como em aplicações financeiras, sistemas de saúde, infraestrutura de telecomunicações e serviços de nuvem.

A pergunta que move esse assunto:

A principal pergunta que move esse assunto
não é E SE FALHAR?
mas QUANDO VAI FALHAR?.

Componentes de tolerância a falhas:

Redundância:

  • Definição: A prática de duplicar componentes críticos do sistema para que, se um falhar, o outro possa assumir sua função sem interrupção.
  • Exemplo: Um servidor web pode ter múltiplos servidores de backup que entram em ação automaticamente se o servidor primário falhar. No contexto de banco de dados, a replicação de dados entre múltiplos servidores garante que, se um banco de dados falhar, outro possa servir os dados sem interrupção.

Failover:

  • Definição: O processo de redirecionamento automático do tráfego ou carga de trabalho para um componente redundante ou um backup no caso de falha de um componente ativo.
  • Exemplo: Em um cluster de servidores, se o nó primário falha, o sistema automaticamente transfere as operações para um nó secundário, garantindo a continuidade do serviço.

Fallback (Recuperação Passiva):

  • Definição: Um método de recuperação onde, em caso de falha de um componente principal, o sistema reverte para uma versão simplificada ou um componente alternativo menos eficiente, mas funcional.
  • Exemplo: Se um sistema de banco de dados de alta performance falhar, o sistema pode temporariamente operar com um banco de dados de backup mais lento até que o banco de dados principal seja restaurado.

Isolamento de falhas:

  • Definição: A capacidade de conter falhas em um componente de forma que elas não se propaguem para outras partes do sistema.
  • Exemplo: Em arquiteturas de microserviços, falhas em um serviço específico não afetam outros serviços porque cada serviço opera de forma independente e comunica-se por meio de APIs definidas. Padrões como “circuit breaker” ajudam a isolar falhas, evitando que chamadas repetidas a serviços falhos sobrecarreguem o sistema.

Detecção de falhas:

  • Definição: A capacidade de um sistema identificar falhas ou anomalias automaticamente para iniciar processos de recuperação ou ativar redundâncias.
  • Exemplo: Health checks e watchdogs são usados para monitorar continuamente a saúde de componentes do sistema, reiniciando-os ou sinalizando falhas para um sistema de failover.

Correção automática (Self-Healing):

  • Definição: A capacidade de um sistema detectar falhas e iniciar automaticamente processos para corrigir ou mitigar os problemas, restaurando a operação normal sem intervenção humana.
  • Exemplo: Em um ambiente de contêineres gerenciado por Kubernetes, se um pod falhar, o Kubernetes pode automaticamente reiniciar o pod ou criar uma nova instância, garantindo a continuidade do serviço.

Porque tolerar falhas é importante?

É possível nos perdemos no sentido daquilo que estamos entregando, então é bom revisitar o assunto e entender porque estamos entregando resiliência:

  • Alta Disponibilidade: Sistemas tolerantes a falhas são projetados para minimizar ou eliminar o tempo de inatividade, garantindo que os serviços estejam sempre disponíveis para os usuários.
  • Confiabilidade: A capacidade de continuar operando mesmo após falhas aumenta a confiabilidade percebida do sistema, essencial para operações críticas.
  • Segurança: Reduz o risco de perda de dados ou de serviços essenciais devido a falhas imprevistas.
  • Redução de Riscos: Minimiza o impacto das falhas, protegendo o sistema contra interrupções significativas que poderiam resultar em perda de receita ou danos à reputação.

Exemplos de implementação de tolerância a falhas:

Armazenamento de Dados:

  • RAID (Redundant Array of Independent Disks): Uma técnica usada para combinar múltiplos discos rígidos em um único sistema de armazenamento, permitindo que o sistema continue a operar mesmo se um ou mais discos falharem.
  • ReplicaSet: Sistemas como MongoDB utilizam ReplicaSet para garantir que falhas de nós individuais não afetem a disponibilidade e integridade dos dados, as replicas possuem cópias dos dados, permitindo que instâncias inteiras morram, sem afetar a integridade.

Serviços de Nuvem:

  • Zonas de Disponibilidade: Serviços como AWS e Azure fornecem zonas de disponibilidade separadas geograficamente e isoladas contra falhas, permitindo que aplicações distribuídas continuem operando mesmo se uma zona inteira falhar.

Bancos de Dados Distribuídos:

  • Sharding: MongoDB utiliza sharding de dados para garantir que os dados estejam distribuídos em sua malha de clusters, de forma que somado à estratégia de ReplicaSet, nós individuais não afetem a disponibilidade e integridade dos dados.

Computação em Cluster:

  • Gerenciamento de Recursos Distribuídos: Sistemas como Kubernetes gerenciam recursos em um cluster distribuído, realocando tarefas e serviços em resposta a falhas de nós individuais, mantendo a operação ininterrupta.

Conclusão

Em resumo, a tolerância a falhas é uma abordagem para garantir que sistemas críticos permaneçam operacionais e confiáveis, mesmo em cenários de falha. Ela se diferencia de outras técnicas de resiliência pela ênfase em redundância, failover e recuperação, mantendo a integridade e disponibilidade do sistema em todos os momentos.

O Cloud Native .NET é meu principal projeto.

Onde empenho energia para ajudar, acompanhar, direcionar Desenvolvedores, Líderes Técnicos e jovens Arquitetos na jornada Cloud Native.

Conduzo entregando a maior e mais completa stack de tecnologias do mercado.

Ao trabalhar com desenvolvedores experientes, eu consigo usar seu aprendizado com .NET, banco de dados, e arquitetura para encurtar a jornada.

Ao restringir à desenvolvedores .NET eu consigo usar do contexto de tecnologias e problemas do seu dia-a-dia, coisas que você conhece hoje, como WCF, WebForms, IIS e MVC, por exemplo, para mostrar a comparação entre o que você conhece e o que está sendo apresentado.

É assim que construímos fundamentos sólidos, digerindo a complexidade com didática, tornando o complexo, simples.

É assim que conseguimos tornar uma jornada densa, em um pacote de ~4 meses.

Eu não acredito que um desenvolvedor possa entender uma tecnologia sem compreender seus fundamentos. Ele no máximo consegue ser produtivo, mas isso não faz desse desenvolvedor um bom tomador de decisões técnicas.

É preciso entender os fundamentos para conseguir tomar boas decisões.

0 comentários

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Luiz Carlos Faria

Mensagem do Autor

Espero que goste desse post. Não deixe de comentar e falar o que achou.

Se acha que esse post pode ajudar alguém que você conheça, compartilhe!

 

Lives

Fique de olho nas lives

Fique de olho nas lives no meu canal do Youtube, no Canal .NET e nos Grupos do Facebook e Instagram.

Aceleradores

Existem diversas formas de viabilizar o suporte ao teu projeto. Seja com os treinamentos, consultoria, mentorias em grupo.