Introdução
O que é um Sistema Tolerante a Falhas?
Sistemas Tolerantes a Falhas são aqueles que possuem a capacidade de continuar provendo corretamente os seus serviços mesmo na presença de falhas de hardware ou de software.
São aqueles em que os defeitos não são visíveis para o usuário, pois o sistema detecta e mascara, ou recupera, defeitos antes que eles alcancem os limites do sistema (ponto de fuga da especificação).
O que é Tolerância a Falhas?
É um atributo que habilita o sistema para ser tolerante a falhas. É o conjunto de técnicas utilizadas para detectar, mascarar e tolerar falhas no sistema.
Motivação
O estudo dos sistemas tolerantes a falhas surgiu da necessidade de sistemas mais confiáveis. Esta necessidade surgiu devido a crescente demanda de serviços de alta confiabilidade como: controle de vôo, Sistemas bancários, etc. Nestes, a interrupção de serviço pode ter consequências catastróficas irreparáveis.
Logo, a tolerância a falhas, nestes sistemas, visa evitar ao máximo interrupções destes serviços.
O estudo de sistemas tolerantes a falha também tem seu foco direcionado para casos menos rígidos. Nestes, a interrupção de serviço não é tão catastrófica, porém gera uma experiência negativa para o usuário.
Então, para esta classe de serviços, a tolerância a falhas é utilizada por questões de usabilidade.
Histórico
Nesta seção é apresentado um breve contexto histórico desta área de pesquisa. Basicamente são mencionados os marcos mais importantes ou curiosos.
1834: primeira afirmação sobre erros em cálculos computacionais (Dr. Lardner em Babbages's calculating engine)
Final 40 até meio 50: técnicas baseadas em redundância para melhorar confiabilidade (códigos de controle de erros, duplicação com comparação, triplicação com votação, diagnóstico para localização de componentes, etc)
1965: teorias de mascaramento por redundância foram relacionadas ao conceito de Failure Tolerance (Pierce).
1967: técnicas práticas de detecção de erros, diagnóstico de falhas e recuperação agrupadas no conceito de sistemas tolerantes a falhas (Avizienis)
1969: conceito de cobertura de falhas, no campo da modelagem de confiabilidade (Bouricius, Carter e Schneider)
1970: criado o IEEE-CS TC on Fault-Tolerant Computing.
1975: conceitos sobre software tolerante a falhas (Randell).
1977: Programação n-versão (Avizienis e Chen).
1980: criado o IFIP WG 10.4 Dependable Computing and Fault Tolerance.
1982: sete position papers no FTCS-12 com conceitos e terminologias.
1985: síntese dos conceitos e terminologias por Laprie.
1990: artigo sobre TFSD no FTCS.
1992: livro Dependability: Basic Concepts and Terminology (Laprie, Spring-Verlag).
1994: livro Fault Tolerance in Distributed System (Jalote, Prentice Hall)
Conceitos
Serviço e Tarefa
Serviços são funcionalidades oferecidas pelo sistema. Estas funcionalidades podem ser oferecidas a usuários ou sistemas de controle em que os mesmos estejam acoplados. Em Sistemas de Tempo Real, estes serviços possuem limitação temporal, ou seja, esses serviços devem ser oferecidos com a restrição de que devem ser executados dentro de um limite de tempo específico.
Na abordagem mais comum, serviços são fornecidos pelos sistemas através da execução interna de tasks(tarefas).
Tarefas são trechos de código ou subrotinas para fornecer uma funcionalidade específica. Podem ser classificadas quanto sua prioridade ou ocorrência.
- Quanto a sua ocorrência:
- Aperiódicas: podem ser disparadas a qualquer momento.
- Esporádicas: podem ocorrer a qualquer momento, porém o tempo mínimo entre as ativações é conhecido.
- Periódicas: intervalo entre disparos é conhecido e fixo.
- Quanto a sua prioridade:
- Não-Críticas: atrasos e falhas são toleráveis.
- Semi-Críticas: atrasos são toleráveis, mas falhas não.
- Críticas: falhas ou atrasos não são toleráveis.
Falha
Falha: problema ou imperfeição no nível físico.
- Curto circuito;
- falhas algorítmicas;
- etc...
Podem ser classificadas em:
- Transitórias: ficam ativas por um certo período de tempo.
- Intermitentes: faltas transitórias ativas periodicamente.
- Permanentes: após ocorrer, permanecem ativas até correção.
Erro
Erro: desvio na exatidão ou precisão da computação. Ocorrem no nível computacional. Associados a valores incorretos do estado do sistema. São causados por falhas.
Defeito
Defeito: sistema não corresponde ao esperado. É um desvio da especificação, ou seja, o sistema não age de acordo com especificação ou a especificação não descreve adequadamente o sistema.
Também é caracterizado quando serviços não são fornecidos da forma ou prazo esperados pelo usuário. Podem gerar consequências catastróficas.
Dependabilidade
Uma propriedade de um sistema computacional, tal como usabilidade, desempenho e custo.
Dependabilidade diz respeito a habilidade de entregar um serviço comprovadamente confiável, ou seja, habilidade do sistema para evitar defeitos inaceitáveis para seus usuários.
A dependabilidade é composta de 8 atributos, que seguem:
- Disponibilidade: diz respeito a média de tempo disponível para acesso.
- Confiabilidade: diz respeito a continuidade da entrega de serviço correto.
- Integridade: impedimento de alterações de estado impróprias.
- Segurança (safety): diz respeito a garantias de não haver defeitos catastróficos ao usuário ou ambiente.
- Confidencialidade: impedimento de acesso indevido.
- Mantenabilidade: habilidade para reparo e modificações eficientes.
- Segurança (security): proteção contra acessos, ou controle, não autorizados ao estado do sistema.
- Testabilidade: facilidade para testar o sistema (ponto de teste, testes automatizados)
A dependabilidade pode ser obtida através de diversos meios diferentes, seguem alguns deles:
- Prevenção de Falhas: visa prevenir a ocorrência ou introdução de falhas.
- Remoção de Falhas: visa reduzir o número ou a severidade das falhas.
- Previsão de Falhas: visa estimar o número presente, a incidência futura e as conseqüências das falhas.
- Tolerância a Falhas: visa entregar o serviço correto mesmo na presença de falhas.
Tolerância a Falhas
Redundância
Redundância é o requisito básico para implementação de sistemas tolerantes a falha. Isto é feito através da implementação de Hardware e/ou software tolerante a falhas.
Sistemas tolerantes a falha tem a característica de serem implementados com técnicas de mascaramento ou detecção de erros, seguidos de recuperação do sistema. Recuperação consiste no re-estabelecimento do estado correto do sistema.
Redundância pode ser classificada em quatro tipos, separadas quanto ao nível em que é implementada, seguem:
- Hardware: este tipo de redundância é obtido com a replicação de componentes eletrônicos, memórias, fontes de alimentação, entre outros, que assumem as tarefas do sistema, em caso de falha dos hardwares principais. Também é utilizado para detecção de erros, ao possibilitar que vários resultados da mesma computação sejam comparados e analisados. Seguem alguns exemplos:
- NMR;
- TMR;
- SMR;
- etc...
- Software: utiliza-se de várias versões do mesmo software/tarefa, implementadas segundo a mesma especificação, porém por equipes de desenvolvimento diferentes (preferencialmente, sem comunicação entre estas). Seguem alguns exemplos:
- N-Version;
- N-Self-Checking Programming;
- etc...
- Informação: corresponde à duplicação dos dados e/ou adição de informações redundantes, à estes, de forma a permitir a verificação da consistência e/ou correção dos erros detectados, como acontece nos códigos de detecção e correção de erros. Seguem alguns exemplos:
- Códigos de detecção/correção de erros;
- RAID;
- etc.
- Tempo: esta técnica consiste em executar a mesma computação, em instantes distintos de tempo, afim de verificar a existência de falhas temporais no sistema. Seguem alguns exemplos:
- Re-execução de código em momentos distintos;
- etc.