Tolerância a Falhas Carlos Oberdan Rolim Ciência da Computação Blocos básicos Blocos básicos Concordância bizantina acordo, consenso Clocks sincronizados Armazenamento estável Processadores fail-stop Entrega confiável de mensagens Blocos básicos Concordância bizantina problema dos generais bizantinos alcançar consenso na presença de traidores defeitos bizantinos defeito em um componente do sistema é uma falha no sistema quando um sistema apresenta defeito, seu comportamento pode ser totalmente arbitrário nodo pode enviar informações diferentes para os diferentes componentes com quem se comunica Problema dos generais bizantinos generais sitiam cidade inimiga alguns generais são traidores devem chegar a consenso sobre atacar ou recuar generais traidores não devem poder atrapalhar o consenso traidores não podem provocar divisão: alguns atacam e outros recuam concordância bizantina consenso na presença de falhas arbitrárias Objetivo básico consenso entre todos os nodos sem defeitos (não traidores) não traidores devem tomar a mesma decisão devem obter o mesmo conjunto de valores e executar o mesmo algoritmo sobre os valores traidores podem enviar valores diferentes para nodos diferentes Requisitos formais todos os nodos não traidores usam o mesmo valor v(i) para o nodo i não necessariamente o valor recebido do nodo i se o nodo transmissor i é não traidor então todo nodo não traidor usa o valor v(i) transmitido por i não interessam os valores que os traidores usam não interessam os valores transmitidos por traidores Comentários um traidor pode agir maliciosamente atrapalhando o consenso traidores podem enviar valores diferentes para diferentes nodos mensagens de confirmação podem ser falsificadas pelos traidores consenso é impossível em sistemas assíncronos mesmo com um único traidor mesmo quando só ocorrem falhas de crash Problema com 3 nodos Algoritmos de Lamport Lamport 82 (Lamport, Shostak e Pease) sistemas síncronos sistema totalmente conectado mensagens orais: n ≥ 3 m +1 algoritmo de consistência interativa (ICA) mensagens assinadas: n ≥ m + 2 grande número de rodadas: m + 1 grande número de mensagens: O(nm) n = # nodos m = # traidores Protocolo para mensagens orais mensagens comuns, sem assinatura n nodos, m traidores solução possível para n ≥ 3m+1 premissas: A1: toda mensagem enviada é recebida corretamente A2: o receptor sabe quem enviou a mensagem A3: a ausência de uma mensagem pode ser detectada (time-out) sistema é síncrono Exemplo quatro nodos n=4 n ≥ 3m+1 todos os nodos tem um valor a transmitir cada valor transmitido deve ser confirmado entre os nodos receptores antes de ser aceito os valores são resultado de computações diferentes e cada um sozinho não está certo nem errado interessa apenas que no final todos os nodos concordem sobre o mesmo valor Exemplo Node2 assume que resposta é x Valor arbitrário definido pelo algoritmo Rodadas Rodadas Rodadas Rodadas Rodadas Algoritmo – Interactive Consistency Algorithm (ICA) n = número de nodos ICA(0) m = número de traidores o general envia o seu valor para os outros n-1 nodos do sistema cada nodo usa o valor recebido, ou default se não recebeu nenhum valor – (fim da recursão) Algoritmo o general envia o seu valor para os outros n-1 nodos ICA(m), m>0 nodo i v(i) (valor recebido pelo nodo i ou default), nodo i atua como general em ICA(m-1) enviando v(i) para os demais n-2 nodos (confirmação do valor) para cada nodo i: v(j) valor recebido do nodo j (j ≠ i) nodo i usa valor maioria(v(1), ..., v(n-1)) ICA(m) cada general difunde seu valor para todos os nodos do sistema cada um dos demais nodos será também general transmitindo seu valor aos demais na rodada 1 ICA(m) confirmação do valor transmitido pelo general ICA(m) ICA(m) Comentários ICA(m) deve ser usado por todos os nodos para alcançar consenso cada nodo é uma vez general na rodada 1 cada nodo participa da confirmação dos valores dos demais nodos (rodada 2) usando ICA(m) em cada nodo, cada nodo do sistema terá o mesmo valor assumido para todos os outros nodos não necessariamente o valor transmitido por cada nodo Concordância bizantina comentários finais algoritmo de Lamport ótimo em relação ao número de rodadas mas exige número exponencial de mensagens outros algoritmos foram propostos alguns mais eficientes em relação ao número de mensagens alguns suportam sistemas não totalmente conectados alguns suportam sistemas assíncronos através de procedimentos randômicos Relógios sincronizados facilitaria a implementação de serviços tolerantes a falhas ordem total temporal importante em sistemas de tempo real sincronização externa manter clocks com desvio máximo em relação a referência externa de tempo poderia ser usado GPS GPS não evita a necessidade de algoritmos de sincronização NTP não é solução sincronização interna manter clocks com desvio relativo máximo aceitável entre si Relógios sincronizados lembrar a inexistência de relógio global necessários para impor ordem total temporal a eventos facilitam a implementação de vários serviços importante em sistemas de tempo real a sincronização de relógios de tempo real é uma tarefa de alto custo, pois envolve grande quantidade de mensagens, e deve ser evitada se possível a maior parte dos problemas de ordenação em sistemas convencionais, inclusive ordenação total, pode ser resolvida com clocks lógicos (Lamport) Sincronização de clocks cada nodo tem um relógio problemas clocks diferentes podem marcar tempos diferentes e ter velocidades diferentes valores de cada clock devem ser comunicados para haver sincronização retardo na rede de comunicação pode variar randomicamente maior problema: clocks com defeito informam valores diferentes a cada leitura Modelo para sincr. interna hipóteses assumidas: um clock físico em cada nodo controlado por um processo o processo informa o valor do seu clock aos demais nodos falhas no clock podem ser modeladas como falhas do seu processo controlador Ci(t) - leitura de Ci no tempo físico t relógio é contínuo Comportamento do clock falho comportamento arbitrário sem falha valor é próximo do tempo físico desvio é limitado por uma constante ρ para relógios com cristal: ρ da ordem de 10-5 Requisitos básicos para sincronização S1 - a qualquer tempo, o valor de todos os clocks sem defeito deve ser aproximadamente igual |Ci(t) - Cj(t)| ≤ β S2 - existe um pequeno limite Σ no valor que um clock sem defeito pode ser corrigido a cada nova sincronização evitar grandes saltos e evitar que todos os relógios estejam parados Protocolos de sincronização de clocks a qualquer tempo, o valor de todos os clocks sem falha deve ser aproximadamente igual; existe um pequeno limite Σ no valor que um clock sem falha pode ser corrigido a cada resincronização determinísticos requisitos S1 e S2 são garantidos limites são garantidos requer hipóteses sobre retardo de mensagens probabilísticos não requer hipóteses sobre retardo máximo de mensagens garante precisão com uma determinada probabilidade Protocolos determinísticos é garantida a precisão requerida é assumido um limite máximo para o retardo de mensagens similar ao problema dos generais bizantinos cada processo lê todos os clocks do sistema e determina o novo valor do seu clock como a média de todos os valores devido a clocks maliciosos, valores lidos não podem ser diretamente usados necessidade de consenso Protocolo determinístico de Lamport Lamport e Melliar-Schmith (1985) semelhante ao algoritmo de mensagem orais em concordância bizantina solução possível apenas se o número de clocks falhos é menor que n/3 sincronização mais próxima que pode ser obtida: (max - min)(1 - 1/n) max - maior tempo de retardo, min - menor tempo de retardo, n - número de nodos Protocolos probabilísticos sincroniza clocks apesar de retardos arbitrários na rede não requer hipóteses sobre retardo máximo de mensagens hipótese: relógios maliciosos não existem comportamento arbitrário é excluído assume que relógios bizantinos não existem, assim o problema não precisa ser tratado como consenso bizantino relógios são sincronizados com alta probabilidade garante precisão com uma determinada probabilidade Sincronização externa necessária referência externa Global Positioning System (após 1990) referência externa mundialmente disponível sincronização da ordem de milisegundos fortemente recomendado para sistemas de tempo real infelizmente ainda não totalmente incorporado a sistemas comerciais Global positioning system rede de satélites que difunde valores altamente acurados de tempo real desenvolvido para suporte a sistemas de localização baixo custo modelo de falhas do GPS usual: crash distorções atmosféricas problemas com antenas (recepção do sinal) Armazenamento estável armazenamento estável ideal não pode ser implementado na prática TF assume: parte do estado do sistema permanece disponível mesmo após defeito do sistema essencial em vários esquemas de suporte a tolerância a falhas armazenamento estável conteúdo é preservado apesar de falhas disco magnético não é considerado armazenamento estável confiável Defeitos em discos transientes bad sector discos são memórias não voláteis e muitas vezes usados como se fossem memórias estáveis defeito na controladora dados no meio magnético não são perdidos defeito de disco o conteúdo não pode ser mais recuperado arquivos são facilmente perdidos em disco em uma memória estável ideal, dados gravados jamais são perdidos ou corrompidos Implementações de memória estável aproximações de memória estável sombreamento de disco conjunto de imagens idênticas de um disco em dispositivos separados caso particular: espelhamento 2 discos exemplo: computadores Tandem discos são de porta dual e conectados a dois controladores RAID independentes Redundant Array of Inexpensive Disks propostos inicialmente para diminuir custos de armazenamento e prover alta velocidade bit interleaving entrelaçamento de bits: aumenta velocidade permitindo operação em paralelo, mas diminui confiabilidade solução: mais alguns discos no array RAID 1, 2 e 3 RAID 1 método mais caro (100% redundância) dois discos idênticos espelhados RAID 2 bits entrelaçados palavra + código correção de 1 bit ou detecção de 2 bits número de discos depende do algoritmo de correção só permite verificação de paridade RAID 3 bits entrelaçados + disco extra para paridade RAID 4 , 5 e 6 RAID 4 pode ser implementado em um único disco físico como RAID 3, mas com setores entrelaçados RAID 5 pode ser implementado a partir de dois discos como RAID 3 mas sem disco de paridade mais popular paridade é distribuída pelos discos do sistema RAID 6 degrada para RAID 5 quando 1 disco está defeituoso como RAID 5, mas com mais um disco de paridade (além da paridade distribuída) dois discos podem falhar sem perda de dados pode trocar drive defeituoso com sistema em operação Processadores fail-stop em caso de defeito, nodo cessa operação sem realizar qualquer ação incorreta comportamento fail-stop assumido por grande parte dos esquemas de TF processadores reais não são fail-stop processadores reais com defeito se comportam de maneira arbitrária nodos aproximadamente fail-stop podem ser construídos a partir de processadores reais (k fail-stop) exemplo: Stratus Processadores fail-stop nodo cessa operação sem realizar qualquer ação incorreta em caso de defeito comportamento mais simples possível facilita a construção de tolerância a falha efeitos visíveis após defeito qualquer nodo pode detectar falha em um nodo fail-stop o nodo pára qualquer execução o estado interno e a memória volátil são perdidos (sem recuperação), o estado da memória estável não é alterado Processadores fail-stop fail-stop: premissa usual em TF mas processadores reais com defeito se comportam de maneira arbitrária nodos fail-stop a partir de processadores reais é impossível construir sistemas que suportam defeitos de um número qualquer de componentes processador k-fail-stop comporta-se como um processador fail-stop, a não ser que k+1 ou mais componentes do sistemas falhem aproximação de um processador fail-stop ideal Implementação importante o funcionamento do processador fail-stop dependerá da confiabilidade do dispositivo de armazenamento estável implementações possíveis: com armazenamento estável confiável Fred B. Schneider (1983) sem armazenamento estável confiável Fred Schneider (1984) Com armazenamento estável confiável hipóteses processador k-fail-stop: k+1 processadores comuns processador Ps comportamento bizantino proc. de armazenamento opera corretamente e não falha rede confiável origem da mensagem pode ser autenticada pelo receptor implementado por assinatura digital clocks sincronizados e na mesma velocidade de todos os processadores sem falha e do processador Ps k-fail-stop comporta-se como um processador fail-stop a menos que k+1 ou mais componentes falhem Implementação k+1 procs executam o mesmo programa envio de mensagens a Ps mensagem requisitando read ou write procs sem falha executam a mesma sequência de acessos a Ps detecção de falha por Ps se pelo menos uma requisição é diferente das demais se o número de requisições é menor que k+1 dentro de uma janela de tempo Implementação após detecção de falha Ps bloqueia a execução de qualquer read ou write subsequente bloqueio do armazenamento estável = bloqueio de processamento liga variável FAILED FAILED pode ser lida por outros processadores fail-stop da rede Comentários importante todos os processadores estão com relógios sincronizados operações são executadas sobre o armazenamento Estável apenas se todos os k+1 processadores não apresentarem falha votação por maioria não funciona nesse caso exemplo: Stratus k=1 Ps apenas uma interface Sem armazenamento estável confiável necessário implementar Ps confiável processador k-fail-stop: k+1 processadores comuns Pp 2k+1 processadores Ps se k falham, sobram k+1 Ps sem falha clocks sincronizados mensagens assinadas solução concordância bizantina Entrega confiável de mensagens comunicação ponto a ponto linhas de comunicação reais perdem mensagens e introduzem ruído exigências: confiabilidade mensagem não é corrompida ordenação ordem é preservada entre dois nodos Entrega confiável de mensagens Delivery Propriedades P1. - uma mensagem enviada por i é recebida corretamente por j P2. - mensagens enviadas por i são entregues (delivered) para j na ordem em que foram enviadas por i devem valer mesmo em caso de defeitos em nodos ou links idealmente devem valer mesmo no caso de particionamento da rede suportadas por protocolos de comunicação Detecção de erros erros de transmissão inevitáveis ruído térmico atenuação de sinal ruído induzido cross talk (interferência cruzada) detecção por codificação paridade, códigos de correção e detecção e CRC (cyclic redundancy codes) Ordenação e entrega redes de comunicação reais pacotes podem ser perdidos protocolo de comunicação assegura confiabilidade mesmo com rede não confiável numeração de mensagens retransmissão de mensagens