Aula 11 Tolerância a Falhas Conteúdo Introdução à Tolerância a Falha Resiliência Recuperação Introdução à Tolerância a Falha Conceitos básicos: Muita pesquisa tem sido feita, na área de computação, sobre tolerância a falha. Principalmente em sistemas grandes e complexos (como a maioria hoje), existem diversos riscos que precisam ser previstos. O entendimento do que significa realmente “ser tolerante à falha” necessita de uma definição clara do que é um sistema confiável. A confiabilidade representa uma conjunto de requisitos importantes: Disponibilidade Confiabilidade Segurança Capacidade de manutenção Introdução à Tolerância a Falha É importante ainda diferenciar três termos que são frequentemente mal utilizados: Defeito: um defeito é uma característica do aplicativo que resulta na incapacidade em cumprir sua finalidade, as expectativas do usuário. A falha ocorre quando o defeito se manifesta. Erro: Normalmente provocado por um defeito, erro é o estado em que se encontra um sistema que não pode cumprir suas obrigações. Falha: É o resultado de um defeito que gerou um erro. Nesse cenário, é um evento disparado por um defeito, que coloca o sistema em erro e o conjunto dessa situação é denominado falha. Introdução à Tolerância a Falha O controle de falhas (seja ao evitar, remover ou prever falhas) é de vital importância à construção de Sistemas confiáveis. Mas, além disso, outra estratégia é prover tolerância a falha, o que significa que o sistema deverá ser capaz de atuar mesmo na presença de falhas. As falhas podem ser classificadas em três tipos. Tal classificação é de vital importância na definição dos mecanismos de tolerância: Falhas transientes Falhas intermitentes Falhas permanentes Introdução à Tolerância a Falha Modelos de falha Nem sempre o efeito mensurável de um falha ajuda a identificar sua causa. Essa situação é pior em Sistemas Distribuídos porque, como são compostos de vários elementos cooperativos, a falha em um deles pode afetar outros. Para facilitar o estudo das falhas, existe uma classificação dos modelos possíveis. Esses são os modelos mais comuns: Falha por queda Falha por omissão (de recebimento ou envio) Falha de temporização Falha de resposta (de valor ou transição de estado) Falha arbitrária Introdução à Tolerância a Falha Mascaramento de falha por redundância Quando de trata de tolerância a falha (e não de controle de falha), a estratégia mais comum é mascarar eventuais falhas com o uso de redundância. Há três tipos básicos: Redundância de Informação Redundância de tempo Redundância física Um exemplo notável de redundância é a chamada Redundância Modular Tripla (Triple Modular Redundancy ou TMR). Ela pode ser vista na figura a seguir: Introdução à Tolerância a Falha Considere um circuito com dispositivos interdependentes como na figura abaixo: A B C Uma falha no dispositivo A ou B pode comprometer todo o circuito. A TMR consiste em tratar essas falhas com redundância de dispositivos e tratamento das informações utilizando-se de votantes: A1 V1 B1 V4 C1 V7 A2 V2 B2 V5 C2 V8 A3 V3 B3 V6 C3 V9 Resiliência de processo Questões de projeto Descartadas as hipóteses de mascaramento, Sistemas realmente tolerantes à falhas? como criar Para que isso seja possível, o sistema deve ter meio de impedir (?), detectar e/ou se recuperar de situações de falha Uma abordagem, com foco em proteção à falhas de processo é o agrupamento de processos. Nesse caso, um grupo de processos é tratado abstratamente como um só e recebem as mesmas mensagens. Resiliência de processo Grupos simples versus grupos hierárquicos A organização do grupo pode ser hierárquica ou não. O que traz vantagens e desvantagens. Essa diferenciação se reflete também na forma como os processos se associam. Quando descentralizados, grupos de processo atuam em conjunto e devem chegar a um acordo. Para isso existem alguns algoritmos específicos e o problema aumenta na mesma medida que que os processos discordam. Nesse cenário, caso haja falha em um dos processos, os demais assumem sua carga de modo transparente. Resiliência de processo Associação a um grupo Os agrupamentos hierárquicos e não hierárquicos possuem suas vantagens e desvantagens. Enquanto um agrupamento simples é simétrico e não possui pontos únicos de falha, os hierárquicos tem um tomada de decisão menos complicada, uma vez que o processo de maior hierarquia toma as decisões sozinho, sem necessitar de votação. Uma dificuldade na utilização da estratégia de grupos é o tratamento de inclusão e exclusão dos processos nos grupos. Uma solução elegante é ter um servidor de grupos que cuide das particularidades desse processo de maneira transparente. Resiliência de processo Mascaramento de falha e replicação Após entender os mecanismos de redundância que provêm tolerância, a próxima pergunta pertinente é: o quanto o sistema é tolerante. Com um grupo de processos, diz-se que o sistema é k-tolerante se puder lidar com até k falhas simultâneas. Para isso serão necessários k+1 processos no grupo. Porém, em caso de falhas arbitrárias, em que o processo não deixa de funcionar, mas apresenta resultados incorretos, serão necessários 2k+1 processos no grupo, de modo que uma votação entre os processos decida qual é o resultado correto. Resiliência de processo Acordo em sistemas com falha Porém, mesmo a tarefa de votar (ou chegar a um acordo) entre processos de um grupo apresenta dificuldades. Para que ocorra, uma série de decisões menores precisam ser tomadas (que processo coordenará, como se dará a sincronização, etc). Existem diversos algoritmos de acordo entre processo (cujo objetivo é obter o consenso). Mas, para que possam ser implementados, é importante distinguir fatores importantes como: se a comunicação é síncrona ou assíncrona, se a comunicação é ordenada ou desordenada e, ainda, se a comunicação é feita por unicast ou multicast. Todos esses fatores interferem na escolha e funcionamento do algoritmo. Resiliência de processo Detecção de falha O mascaramento de falhas só é possível se o sistema for capaz de detectar a falha quando esta ocorrer. Essa tarefa é fundamental na construção da tolerância. O mecanismo mais comum é enviar “pings” para outros processo com o objetivo de descobrir se continuam ativos. O problema dessa solução é que, em redes não confiáveis, a demora em obter uma resposta pode gerar uma falsa informação de falha. E, ainda, essa solução não permite diagnosticar se a falha ocorre no processo ou no meio de comunicação. Há muitas outras estratégicas teóricas para resolver essas questões mas, na prática, o uso de pings ainda é a solução mais comum. Recuperação Introdução O mascaramento é uma das faces da tolerância a falhas. Mas, para sua total implementação, é fundamental que o sistema possa se recuperar e voltar a um estado livre de erro. Existem duas abordagens básicas, cada uma com suas vantagens e desvantagens: Recuperação retroativa Recuperação para a frente Por serem mais simples de implementar, as técnicas de recuperação retroativa são as mais comuns. Porém, normalmente tem um impacto significativo no desempenho Recuperação Pontos de verificação Para a aplicação de uma abordagem de recuperação retroativa, é necessário que o sistema guarde, periodicamente, fotos do seu estado. Em sistemas distribuídos, essa foto precisa ser global e é chamada de Fotografia Distribuída. Um problema dessa abordagem é que, como cada processo distribuído armazena seus próprios pontos de verificação e estes são independentes, é difícil formar uma foto distribuída em que todos os pontos estejam sincronizados. Nesse caso, é preciso retroagir ainda mais nos pontos de verificação de cada processo até encontrar um que seja consistente com os demais. Essa situação é chamada Efeito dominó. Recuperação Pontos de verificação (continuação) Uma solução para esse problema é a utilização de pontos de verificação coordenados. A estratégia consistem em fazer com que todos os processos se sincronizem antes de gravarem seus pontos de verificação. Para essa sincronização, um mecanismo de bloqueio simples em duas fases e a adoção de um processo coordenador são suficientes. A grande vantagem é que o estado armazenado a partir dessa estratégia é globalmente consistente. Porém, como se pode imaginar, a troca extra de mensagens entre os processos pode ter impacto significativo no desempenho. Recuperação Registro de mensagens Para minimizar o impacto ao desempenho, uma abordagem possível é diminuir a quantidade de pontos de verificação sem comprometer a capacidade de recuperação. Com esse intuito, uma outra técnica complementar pode ser utilizada, o registro de mensagens. A ideia básica é armazenar todas as mensagens trocadas pelo processo desde o último ponto de verificação. Desse modo, mesmo com menos pontos, seria possível reproduzir as mensagens trocadas posteriormente e voltar a um estado válido. Recuperação Computação orientada a recuperação Em alguns casos, outro modo de lidar com a recuperação é simplesmente começar de novo e reiniciar o sistema. Nessa abordagem, a implementação é otimizada para reiniciar se necessário. Essa abordagem é denominada Computação orientada a recuperação. Para que seja possível, durante o projeto do sistema, os componentes precisam ser planejados para possuir um alto grau de desacoplamento. Somente desse modo é possível reiniciar parte de um sistema distribuído sem causar falha nos demais módulos.