the byzantine generals problem dione taschetto rafael tweedie campos
TRANSCRIPT
The Byzantine Generals Problem
Dione Taschetto
Rafael Tweedie Campos
Introdução¹
Sistemas de computação podem confrontar-se com diferentes situações conflitantes durante a execução de um sistema;
Um sistema de computador confiável deve ser capaz de lidar com a falha de um ou mais dos seus componentes.
Introdução²
Supõe-se que, normalmente quando um componente falha ele se comporta de maneira arbitrária.
O problema de alcançar um entendimento, onde os componentes podem falhar de maneira arbitrária, é chamado de Problemas Gerais Bizantinos.
O Problema
Considere um sistema distribuído com vários nós, onde eles trocam informações entre si através de mensagens.
Os nós podem falhar, e um nó defeituoso pode mandar valores diferentes a nós distintos, relativos à mesma informação.
O objetivo
O objetivo básico é atingir um consenso entre os nós não defeituosos sobre os valores corretos.
Cada nodo deve tomar uma decisão baseada nos valores recebidos dos outros nodos, e todos os nós não defeituosos devem tomar a mesma decisão.
O Consenso Distribuído
O Consenso é um problema fundamental em Sistemas Distribuídos
utilizado como módulo fundamental de vários algoritmos onde os processos precisam ter uma visão (ou ação) idêntica.
Exemplos: - para ordenação total de eventos (ou mensagens) - sobre o conjunto de processos não falhos/ativos de um grupo - colaboração entre agentes em sistemas multi-agentes
O Problema de Consenso
Existem N processos, dos quais f processos apresentam falhas.
cada processo Pi propõe um único valor vi ∈ D. todos os processos interagem para a troca de valores
entre sí. em algum momento, os processos entram no estado
“decided” em que atribuem um valor para a variável de decisão di (que não é mais alterada)
O valor de di é uma função dos valores vi fornecidos pelos N-f processos corretos.
Exemplo
Algoritmo Consenso
P1 P2
P3
v3=NOK
v1=OK v2=OKd1=OK d2=OK
-P3 propõe NOK, mas falha durante o consenso
-Os processos corretos decidem por OK
Consenso - Principais Requisitos
Terminação: Em algum momento, cada processo correto atinge o estado
“decided” e atribui um valor à variável de decisão. Acordo:
todos os processos corretos atribuem o mesmo valor para a variável de decisão
Integridade se todos os processos corretos propuseram o mesmo valor vi =v,
então qualquer processo correto em “decided” também terá decidido di =v
Integridade (alternativa mais fraca – depende da aplicação) o valor de di (i=1,2,..,N) deve ser necessariamente igual ao valor
proposto por um Pi correto
O Consenso com falhas
Se processos podem ter falhas tipo crash (omissão), então a terminação não estará garantida, a menos que se detecte a falha.
Se o sistema é assíncrono, pode ser impossível distinguir um crash de uma mensagem que demora um tempo indeterminado.
Se processos podem apresentar falhas arbitrárias (bizantinas), então processos falhos podem comunicar valores aleatórios aos demais processos, evitando que os corretos tenham a mesma base de dados {v1,v2,..,vN}, para a tomada de uma decisão uniforme.
O problema dos Generais Bizantinos Invasão do império Bizantino pelos Turcos
Os generais bizantinos devem concordar se atacam ou recuam; Os turcos tentam corromper os soldados; Os generais bizantinos são famosos pela sua traição; Os generais leais devem prevenir alarmes falsos; As mensagens são mandadas para todos os campos de
batalha; Soldados corrompidos violam o protocolo; Soldados corrompidos não podem alterar as ordens de
soldados leais.
Consenso
Os generais devem chegar a um consenso se atacam ou se recuam. Se todos os generais bizantinos atacarem, a vitória é certa; Se nenhum general bizantino atacar, o império sobrevive; Mas se apenas alguns generais bizantinos atacarem, então o império
ruirá.
Tipos de Problemas
Com um líder: O líder envia uma ordem para todos os
participantes, e os participantes sem falhas, decidem se aceitam a ordem do líder ou se declinam, dependendo do nº de participantes com falhas.
Sem líder: Todos os participantes possuem um voto inicial, e
no decorrer do processo os participantes sem falhas escolhem uma mesma saída.
Tipos de Problemas
Problema Síncrono: A cada turno todos os participantes enviam e recebem suas decisões.
o algoritmo proposto para resolver o problema dos Generais Bizantinos é para sistemas distribuídos síncronos.
Problema Assíncrono: Cada participante é livre para enviar e receber sua decisão, a hora que
desejar. Em um sistema distribuído assíncrono, é impossível atingir um acordo. Isto
ocorre pois em tais sistemas não é possível distinguir se o nodo falhou ou está mais lento que os demais. Conseqüentemente, um nodo falho pode bloquear o algoritmo de acordo, simplesmente por não enviar uma mensagem.
Soluções e Limitações
Existem basicamente duas abordagens de protocolos:mensagens comunsmensagens assinadas
Protocolo Com Mensagens Comuns O Problema de Acordo Bizantino é difícil porque a informação
enviada por um nodo pode não ser correta.
Assim, o problema pode ser resolvido somente se o número de nodos defeituosos no sistema for limitado.
Com mensagens comuns é impossível resolver o problema, a não ser que mais do que 2/3 dos nodos sejam não falhos. Ou seja o número de nodos falhos deve ser menor que 1/3 do total de nodos.
Para lidar com M nodos falhos é necessário 3M+1nodos para resolver o consenso.
Protocolo Com Mensagens Comuns Este protocolo supõe um nodo livre de falhas que executa o
protocolo corretamente, e que um nodo defeituoso pode se comportar arbitrariamente.
Primeiramente deve-se definir precisamente as suposições sobre o sistema de encaminhamento de mensagens: 1. Toda mensagem que é enviada por um nodo é entregue
corretamente pelo sistema de mensagens ao receptor (assegura que um nodo falho não pode interferir na comunicação).
2. O receptor de uma mensagem sabe qual nodo enviou a mensagem (assegura que existe um canal físico dedicado entre dois nodos).
3. A falta de uma mensagem pode ser detectada (assegura que um nodo falho não vai travar o consenso, isso é implementada através de timeouts, um valor default é considerado).
Protocolo Com Mensagens Comuns Se uma mensagem enviada por um nodo
não chega a seu destino, ou este nodo transmissor não envia a mensagem que deveria mandar, o nodo receptor usa um valor default (ex.:0). Este algoritmo funciona em rodadas, onde cada uma consiste na troca de mensagens entre nós.
Protocolo Com Mensagens Comuns Na primeira rodada, o transmissor envia valores para
os outros (n-1) nodos. Os receptores não podem acreditar nos valores
recebidos pelo transmissor, pois ele pode ser defeituoso. Assim, um nodo receptor primeiro determina os valores que os outros nodos receberam do transmissor.
O valor da maioria é assumido como o valor enviado pelo transmissor.
Em outras palavras, cada receptor precisa comunicar os valores recebidos do transmissor (na primeira rodada) para os outros nós na segunda rodada.
Protocolo Com Mensagens Comuns Na segunda rodada, cada um dos receptores atua
como um transmissor, e envia mensagens aos outros nós, exceto o transmissor e ele mesmo (n-2). Isto se repete recursivamente, onde em cada rodada um nó envia mensagens para um conjunto cada vez menor de nós.
Esta recursão é necessária pois não se pode acreditar em nenhum nó transmissor. A recursão acaba e a maioria dos valores recebidos é tomada como sendo o valor correto em cada rodada.
Exemplo do Protocolo Com Mensagens Comuns¹
General
Traidor
Indeciso resultado inconsistente
“Atacar” “Atacar”
“Recuar”
Problema sem Resolução
Exemplo do Protocolo Com Mensagens Comuns²
General Traidor
Indeciso resultado inconsistente
“Atacar” “Recuar”
Problema sem Resolução
“Recuar”
Exemplo do Protocolo Com Mensagens Comuns
1° rodada
traidor
general
2° rodada
“Atacar”
“Atacar”
“Atacar” “Atacar” “Atacar”
“Atacar”
“Atacar”
“Recuar”
“Recuar”
Protocolo Com Mensagem Assinada O problema torna-se fácil se for restringido a possibilidade de um nodo
falsificar as mensagens. Isso pode ser feito quando um transmissor envia uma mensagem 'assinada'. A assinatura é tal que qualquer alteração ao conteúdo da mensagem pode ser verificada, e assim um receptor consegue verificar se a mensagem recebida foi ou não alterada. A assinatura pode ser obtida utilizando técnicas de criptografias.
O consenso pode ser atingido por um número arbitrário de nodos falhos. Será apresentado um protocolo para satisfazer as condições de consistência interativa, no qual um nodo pode enviar mensagens assinadas.
Com mensagens assinadas é necessário que se tenha n>=m+2.
Neste algoritmo, um nodo transmissor envia uma mensagem assinada para outros nodos. Um nodo adiciona sua assinatura às mensagens recebidas, e as transmite na próxima rodada para outros nós.
Protocolo Com Mensagem Assinada
Se o nodo receptor for não falho, sua mensagem terá o mesmo conteúdo que a mensagem recebida do transmissor.
Entretanto, se tiver falhado, ele deve também enviar a mensagem contendo o mesmo valor, ou não enviá-la de forma alguma (o caso em que ele altera a mensagem e então é percebido pelos receptores pode ser modelado como não enviando a mensagem).
Seja V o conjunto de valores (não mensagens) recebidos por um nodo. Se o transmissor é livre de falhas, então o conjunto de valores recebidos por um nodo conterá um único valor, aquele enviado pelo transmissor. Somente se o transmissor for falho o receptor poderá receber múltiplos valores.
Protocolo Com Mensagem Assinada Se um nodo i envia o valor x para algum
nodo, então este nodo adiciona sua assinatura à mensagem que é representada por x:i.
Quando um nodo j recebe este valor e posteriormente o encaminha a outro nodo, a mensagem é representada por x:i:j.
Exemplo Protocolo Com Mensagens Assinadas
“Atacar”:0:1
“Recuar”:0:2
(0)
(1) (2)
Nosso general
nos traiu. Nós
devemos
Recuar!!
Eu concordo!!
“Atacar”:0 “Recuar”:0
Conclusão
Os algoritmos exibidos anteriormente funcionam em rodadas, e são muito custosos no número de rodadas e no número de mensagens necessárias para se atingir um consenso.
Quando se trata de algoritmos distribuídos, deseja-se que um número relativamente pequeno de mensagens sejam trocadas, pois seu alto número pode causar lentidão excessiva na rede.
Ainda, os protocolos de mensagens comuns e de mensagens assinadas necessitam de uma rede de comunicação fortemente conectada, isto é, uma rede onde exista uma conexão ponto-a-ponto entre todos os nodos.
Referências
LAMPORT, Leslie; SHOSTAK, Robert and PEASE, Marshall. The Byzantine Generals problem. ACM Transactions on Programming Languages and Systems, 4(3):382-401, July, 1982.
http://marknelson.us/2007/07/23/byzantine/