Específicos · Engenharia de Software
Tolerância a falhas: redundância, failover, circuit breaker, retry/backoff, RTO × RPO
Redundância é cópia, tolerância é reação.
Altíssima38 itens no tópico
A ideia que organiza o assunto
Todo este tópico parte de uma premissa só: a falha vai acontecer. Disco queima, processo trava, rede particiona, serviço remoto fica lento. Projetar tolerância a falhas não é evitar isso — é decidir, antes, o que o sistema faz no instante em que acontecer.
E há apenas dois movimentos possíveis, que a prova cobra o tempo todo sob nomes diferentes:
Ter outra peça pronta. É a redundância. Outro disco com a mesma informação, outro nó com o mesmo serviço, outro enlace com o mesmo caminho, outro datacenter com a mesma infraestrutura. A redundância, sozinha, não faz nada: é capacidade parada.
Reagir quando a peça titular cai. É o mecanismo que detecta a falha e redireciona o trabalho — failover no nível do nó, reconstrução no nível do disco, circuit breaker e retry no nível da chamada. Sem ele, o reserva permanece ocioso enquanto o serviço está fora.
Diante de qualquer item, portanto, faça duas perguntas: o que está duplicado? e quem percebe a falha e desvia o trabalho? Um item que prometa tolerância sem ter duplicado nada (o caso do RAID 0) está errado; um item que duplique e espere intervenção manual para continuar (o secundário que “fica inativo até ser iniciado pelo administrador”) também.
Uma terceira pergunta organiza a metade restante do tópico: em que altura a falha é tratada? No disco, o assunto é RAID — espelho ou paridade. No nó, é cluster e failover. Na chamada entre serviços, são os padrões de resiliência — retry, timeout, circuit breaker, bulkhead, fallback. São três camadas com vocabulário próprio, e boa parte das pegadinhas consiste em aplicar o termo de uma na outra.
Por que se usa (e o que custa)
Disponibilidade se compra, e o preço é sempre a mesma moeda: capacidade que não produz. No RAID 1 metade dos discos guarda cópia; no RAID 5 o equivalente a um disco inteiro guarda paridade; no arranjo ativo-passivo um servidor completo fica esperando. Quem promete redundância sem custo está vendendo o que não existe — e é por isso que o item com “ausência de sobrecargas”, “sem impacto” ou “sem custo adicional” é quase sempre errado.
O segundo custo é complexidade. Failover automático exige detecção confiável, e detecção mal calibrada produz o pior de dois mundos: troca de nó por falso alarme, ou split-brain quando os dois lados se julgam sobreviventes. Retry sem recuo exponencial transforma uma lentidão momentânea em tempestade de requisições que derruba o serviço que ainda respirava. Mecanismo de resiliência mal ajustado é causa de indisponibilidade, não remédio contra ela.
O terceiro é desempenho. Paridade custa cálculo e penaliza a escrita, que precisa ler o bloco antigo, recalcular e regravar. Replicação síncrona custa latência em toda escrita. Espelhamento custa metade da capacidade. Em cada escolha o candidato deve reconhecer o mesmo padrão: ganha-se tolerância, paga-se em espaço, latência ou complexidade.
Como funciona
Os quatro atributos. A literatura de tolerância a falhas descreve o sistema por disponibilidade (proporção do tempo em que está pronto para uso), confiabilidade (capacidade de operar continuamente, sem falhar, durante um intervalo), segurança de funcionamento (a falha não produz consequência catastrófica) e manutenibilidade (facilidade de reparo). Disponibilidade e confiabilidade não são sinônimos, e é justamente aí que a banca ataca: um sistema que cai um instante a cada hora tem disponibilidade excelente e confiabilidade sofrível.
Falha, erro e defeito formam a cadeia causal: o defeito (fault) é a causa latente no componente; o erro é o estado interno incorreto que ele produz; a falha (failure) é o serviço deixando de cumprir o que promete. Tolerar falhas é impedir que o erro chegue a virar falha percebida.
RAID é tolerância no nível do disco, e há só duas formas de obtê-la: copiar ou calcular. O RAID 0 não faz nem uma nem outra — apenas divide os dados em faixas (striping) entre os discos, somando capacidade e vazão; a perda de qualquer disco perde o volume, de modo que ele é o único nível que reduz a confiabilidade. O RAID 1 copia: espelha o conteúdo em duas ou mais unidades, tolera a perda de um membro, melhora a leitura (que pode vir de qualquer cópia), não melhora a escrita e consome metade da capacidade. Os níveis com paridade calculam: o RAID 3 e o RAID 4 mantêm a paridade em um disco dedicado — que vira gargalo de escrita —, o RAID 5 a distribui por todos os discos e tolera uma falha, e o RAID 6 mantém duas paridades independentes e tolera duas falhas simultâneas. Os níveis híbridos combinam os dois movimentos: o RAID 10 espelha e depois divide em faixas, tolerando a perda de um disco por espelho — dois discos do mesmo espelho perdem o volume. A implementação por hardware, com controladora e cache dedicados, supera em desempenho a implementação por software, que consome CPU e memória do próprio servidor.
Cluster e failover são tolerância no nível do nó. Os nós trocam sinais de vida; quando um deixa de responder, outro assume suas funções — isso é failover, e a devolução do serviço ao nó original depois do conserto é failback. O failover pode ser automático (o caso comum) ou manual, e o manual não é defeito: é o que se usa em manutenção planejada, atualização e teste do plano. Pode também ser transparente ou não, conforme a sessão sobreviva à troca. As estratégias se dividem entre espera (standby) — um sistema processa tudo e o outro aguarda ocioso, que é o arranjo ativo-passivo — e tomada de controle mútuo, em que ambos trabalham com cargas próprias e o sobrevivente assume também a do outro. No mundo Windows há duas soluções distintas e não intercambiáveis: o NLB balanceia carga de aplicações sem estado, e o Failover Clustering protege aplicações com estado, como banco de dados, Exchange e servidor de arquivos, em nós físicos ou virtuais.
Replicação é tolerância no nível do dado. Na replicação passiva, ou backup primário, um nó ordena todas as escritas e propaga aos backups; é simples e sem conflito, mas tem sobrecarga de propagação e janela de promoção. Na replicação ativa, todas as réplicas processam a mesma requisição, o que exige ordenação total das mensagens. Replicar melhora leitura e disponibilidade; piora escrita e consistência.
Os padrões de resiliência são tolerância no nível da chamada. O retry repete a requisição que falhou — e só é seguro com recuo exponencial, jitter e operação idempotente, sob pena de amplificar a sobrecarga. O timeout impede que a espera por um serviço lento consuma as threads do chamador. O circuit breaker conta as falhas recentes e, passado o limiar, abre o circuito: passa a rejeitar as chamadas de imediato, sem tentar, poupando o serviço doente e liberando o chamador. Depois de um tempo de espera, vai ao estado semiaberto, deixando passar uma quantidade limitada de requisições de prova; se elas têm sucesso, ele fecha e o tráfego normaliza; se falham, ele reabre. O bulkhead — anteparo, no sentido náutico dos compartimentos estanques de um navio — reserva pools de conexão e de threads separados por dependência, para que a saturação causada por um serviço não afunde os demais. O fallback entrega resposta alternativa aceitável (valor padrão, resposta reduzida, dado de cache) em vez de propagar o erro ao usuário.
A conta. Em componentes em série, as disponibilidades se multiplicam e o conjunto é sempre pior que a pior peça. Em paralelo, o que se multiplica são as indisponibilidades, e o conjunto fica melhor que a melhor peça — é essa multiplicação de números menores que um que torna redundância e failover mecanismos de aumento de disponibilidade.
O que decide os itens
Níveis de RAID — a tabela que resolve a maior parte dos itens do tópico:
| nível | mínimo de discos | redundância | tolera | capacidade útil |
|---|---|---|---|---|
| 0 (faixa) | 2 | nenhuma | 0 discos | n |
| 1 (espelho) | 2 | cópia | 1 por espelho | n/2 |
| 3 / 4 | 3 | paridade dedicada | 1 disco | n−1 |
| 5 | 3 | paridade distribuída | 1 disco | n−1 |
| 6 | 4 | paridade dupla | 2 discos | n−2 |
| 10 | 4 | espelho + faixa | 1 por espelho | n/2 |
Copiar × calcular — RAID 1 e RAID 10 obtêm redundância por espelhamento e não calculam paridade alguma; RAID 3 a 6 calculam. Item que aplique paridade a um intervalo que comece em 0 ou em 1 esticou a regra.
Failover × failback — failover é o reserva assumir; failback é o serviço voltar ao titular consertado. É o par mais trocado do tópico.
Espera (standby) × tomada de controle mútuo — em espera, só um trabalha e o outro aguarda (ativo-passivo). Em controle mútuo, os dois trabalham, cada um com sua carga, e um absorve a do outro. A palavra “mútuo” exige reciprocidade.
Confiabilidade × disponibilidade:
| confiabilidade | disponibilidade | |
|---|---|---|
| pergunta | opera quanto tempo sem falhar? | está pronta que fração do tempo? |
| métrica | MTBF, MTTF | MTBF ÷ (MTBF + MTTR) |
| melhora com | componentes melhores | reparo rápido, redundância |
Alta disponibilidade × tolerância a falhas — HA admite interrupção breve e retoma depressa; tolerância a falhas mascara a falha e não interrompe. Cluster de failover é HA: minimiza a interrupção, não a elimina.
NLB × Failover Clustering (Windows) — NLB balanceia carga de aplicações sem estado; Failover Clustering dá alta disponibilidade a aplicações com estado. Ambos suportam nós físicos e virtuais.
Circuit breaker — os três estados:
| estado | o que acontece com a chamada |
|---|---|
| fechado | passa normalmente; falhas são contadas |
| aberto | rejeitada de imediato, sem tentar o serviço |
| semiaberto | passa quantidade limitada de provas; sucesso fecha, falha reabre |
Retry × circuit breaker — retry insiste; circuit breaker desiste de propósito. São complementares, e retry sem recuo nem limite é agravante de incidente, não resiliência.
Bulkhead × circuit breaker — o bulkhead isola recursos para que a falha não se espalhe; o circuit breaker interrompe a chamada a uma dependência já reconhecida como doente.
RAID por software × por hardware — software custa CPU do host e desempenho; hardware custa controladora, e entrega cache dedicado e desempenho.
Fita × disco (becape) — fita é sequencial: barata por terabyte, longeva, portátil para guarda externa, lenta para recuperar e ruim para acesso concorrente. Disco é aleatório: rápido para restaurar, bom para busca e para múltiplos servidores simultâneos.
IDS × IPS × firewall — o IDS detecta e alerta, fora do caminho do pacote; IPS e firewall interceptam e bloqueiam, em linha. Filtragem de pacotes nunca é vantagem do IDS.
Números que caem
| mínimo de discos | RAID 0 e 1: 2 · RAID 5: 3 · RAID 6 e 10: 4 |
| falhas toleradas | RAID 0: 0 · RAID 5: 1 · RAID 6: 2 · RAID 10: 1 por espelho |
| capacidade útil | RAID 0: n · RAID 1: n/2 · RAID 5: n−1 · RAID 6: n−2 |
| RAID 10 com 4 discos | até 2 falhas, desde que em espelhos distintos; 3 perdem o volume |
| paridade | dedicada nos níveis 3 e 4 · distribuída no 5 · dupla no 6 |
| circuit breaker | 3 estados: fechado, aberto, semiaberto |
| NLB (Windows) | até 32 servidores por cluster |
| disponibilidade em série | multiplicam-se as disponibilidades (pior que a pior peça) |
| disponibilidade em paralelo | multiplicam-se as indisponibilidades (melhor que a melhor peça) |
Como a CEBRASPE derruba você aqui
Os 38 itens do tópico estão explicados. Sobre os 18 de gabarito Errado, a contagem é esta: troca de termo 39% (7 itens), inversão 22% (4), número errado 17% (3), generalização 11% (2), escopo ampliado e atribuição errada 6% cada. Os outros 20 itens são Certo — 53% do tópico —, o que desautoriza a desconfiança automática: aqui a maioria das afirmações é verdadeira.
Antes das famílias, um aviso sobre o recorte. O título fala em redundância e failover, mas um terço do tópico é RAID: 13 dos 38 itens discutem nível, mínimo de discos ou quantas falhas o arranjo tolera. Failover, cluster e NLB ficam com outro terço; o resto se divide entre replicação, balanceamento, padrões de resiliência e uns poucos itens que só tangenciam o assunto (um otimizador de consultas, o roteamento de mensagens do RabbitMQ, um IDS). Quem estuda failover e pula a tabela de RAID abre mão da maior fatia.
A descrição está certa e o nome em cima dela é o do vizinho — 39%, a família dominante. Nenhuma metade da frase é falsa isoladamente; o emparelhamento é que está errado. Em quatro dos sete casos o nome trocado é um número de RAID: dois discos, um com dados e o outro com “uma cópia exata do primeiro”, batizados de “No modelo de operação do RAID 5” (é RAID 1); “O RAID nível 0 duplica todos os discos” (é o 1); “informações de paridade distribuídas em todos os discos do volume” atribuídas ao nível 4 (é a assinatura do 5). Nos outros três, o trocado é um lado de um par: “alternar para um servidor redundante mediante a falha de um ativo existente” chamado de failback (é failover, a ida); um primário que processa tudo enquanto o secundário aguarda ocioso chamado de “tomada de controle mútuo” (é espera, ativo-passivo — “mútuo” exige que os dois trabalhem); e o atributo confiabilidade definido como “o fator de disponibilidade do sistema em determinado período de tempo”. Defesa: leia a descrição, nomeie o mecanismo você mesmo, e só então confira o nome que o item deu. A ordem inversa é o que a banca espera.
Dentro dessa família, o RAID 0 é o alvo preferido. Dois dos sete itens de troca de termo dão a ele o que ele não tem: “capaz de suportar falhas de qualquer disco” e “solução de espelhamento com redundância”. RAID 0 é faixa pura, sem cópia e sem paridade, e é o único nível que piora a confiabilidade do conjunto. Defesa: a expressão RAID 0 ao lado de espelho, redundância ou tolerância basta para marcar Errado antes de ler o resto da frase.
O mecanismo produzindo o efeito que existe para evitar — 22%. Duas das quatro inversões são exatamente isso: “durante a operação correta do recurso de clustering de failover, ocorre um grande número de interrupções nos serviços”, e o secundário promovido que “fica inativo até ser iniciado pelo administrador, por meio de comandos” — alta disponibilidade gerando indisponibilidade. A terceira inverte uma lista de vantagens de lado: recuperação rápida, acesso aleatório, otimização para pesquisa e acesso simultâneo por vários servidores apresentados como vantagens “de um backup executado em uma unidade de fita em relação ao realizado em uma unidade de disco rígido” — são todas do disco, porque a fita é mídia sequencial. A quarta vira permissão em proibição: Exchange em cluster de failover “mas não em máquinas virtuais”. Defesa: compare o efeito afirmado com a finalidade do mecanismo; e, em comparação de mídias, fixe a característica física (fita sequencial, disco aleatório) antes de aceitar qualquer vantagem.
Quantos discos, quantas falhas — 17%, e os três itens são a mesma pergunta. “A storage consegue suportar o uso de RAID 6” quando o enunciado fixou três discos (o 6 exige quatro); “RAID 10, em uma disposição de quatro discos, garante a proteção mesmo que até três discos apresentem falha” (tolera dois, e só em espelhos distintos); “No RAID 5 com sete discos, a falha simultânea de até dois discos não ocasiona a perda de dados” (tolera um, tenha o arranjo três discos ou trinta). Defesa: quando o enunciado fixar a quantidade de discos, teste o mínimo do nível antes de discutir qualquer virtude dele; e lembre que a tolerância vem do número de paridades, não do número de discos. Esses itens morrem na aritmética, sem discussão conceitual.
O absoluto que fecha uma porta aberta — 11%. “Failover é um processo que é acionado automaticamente […] não sendo possível configurar o seu acionamento no modo manual”, quando o manual é prática corrente em manutenção planejada e teste do plano; e a replicação passiva cuja principal vantagem seria “a ausência de sobrecargas no sistema”, quando toda propagação ao backup custa latência. Defesa: diante de “não sendo possível”, “apenas” ou “ausência de”, procure o caso de uso legítimo que a frase proíbe. Redundância nunca é de graça.
O intervalo esticado um nível a mais — 6%. Um item só, e vale pelo hábito que revela: “Os conjuntos de RAID dos níveis de 1 a 6 utilizam algoritmos para calcular a paridade”. Paridade calculada existe de 3 a 6; o nível 1 obtém redundância por cópia e não calcula nada. Defesa: há duas formas de redundância em RAID e elas não se misturam — copiar (1 e 10) e calcular (3 a 6). Intervalo que comece em 0 ou em 1 e fale em paridade já esticou.
A função de um componente carimbada em outro — 6%. O IDS “tendo como vantagens o sistema failover e a filtragem de pacotes”, quando ele é passivo: observa cópia do tráfego, detecta e alerta. Defesa: detectar e alertar × interceptar e bloquear — IDS faz o primeiro, IPS e firewall fazem o segundo.
Erros clássicos
Achar que RAID 0 tolera alguma falha. O zero do nome é literal: zero redundância. Ele soma desempenho e capacidade e ainda diminui a confiabilidade do conjunto, porque a perda de qualquer disco perde tudo.
Supor que mais discos no RAID 5 significam mais falhas toleradas. A tolerância vem da quantidade de paridades, não da quantidade de discos: uma paridade, uma falha, tenha o arranjo três discos ou trinta.
Dizer que o RAID 10 aguenta duas falhas sem ler quais. Aguenta dois discos de espelhos diferentes. Dois discos do mesmo espelho perdem o volume, e três discos sempre o perdem.
Confundir confiabilidade com disponibilidade. Confiabilidade é intervalo contínuo sem falhar; disponibilidade é fração do tempo em pé. Um sistema pode ter uma alta e a outra baixa.
Tratar failover como sinônimo de failback. Failover é a ida, na falha; failback é a volta, depois do conserto.
Exigir failover automático como se o manual não existisse. O acionamento manual é recurso previsto e usado em manutenção planejada e em teste do plano.
Confundir o estado aberto do circuit breaker. Aberto interrompe a corrente: as chamadas são rejeitadas de imediato. Fechado é que deixa passar. A intuição de quem lê rápido é a contrária, e a banca conta com isso.
Achar que retry é sempre bom. Repetição sem recuo exponencial, sem limite e sobre operação não idempotente transforma lentidão em colapso, e ainda pode duplicar efeitos.
Esperar ganho de escrita da redundância. Espelho, paridade e replicação melhoram leitura e disponibilidade; a escrita sempre piora, porque precisa ir a todas as cópias ou recalcular a paridade.
Achar que balanceamento recupera falha. Balanceador distribui requisições entre nós que estão de pé; quem cobre a queda de um nó é o failover. E o próprio balanceador precisa de par redundante, sob pena de ser ele o ponto único de falha.
LidoPraticado