Algoritmos de Eleição

Propaganda
Algoritmos de Eleição
Roteiro:
•  Motivação e Principais Requisitos
•  Algoritmos em Anel
•  Algoritmo Bullying
•  Algoritmo do Convite
Referências:
•  Livro do Chow/Johnson: seção 10.2
•  Livro do Colouris/Dollimore/Kindberg: seção 11.3
•  Livro do Michel Raynal: Distributed Algorithms and Protocols,
Wiley & Sons, 1988 (seção 2.5)
•  S. Sight & A. Kurose: Electing “good” leaders, Journal of Parallel
and Distributed Computing Systems, 21: 194-201, 1994.
© Markus Endler
1
Eleição
Objetivo:
•  obter um consenso em um grupo de processos sobre a
escolha de um único processo
Aplicações:
•  Em muitos serviços (ou aplicações) distribuídos um
processo (arbitrário) exerce um papel diferenciado
(coordenador)
•  Quando este falha, o grupo precisa re-eleger um novo
coordenador
Exemplos:
•  Servidores replicados com com replicação passiva
(primary-backup)
•  Um processo sequenciador para comunicação multicast
com ordenação total (exemplo: sistema Amoeba)
© Markus Endler
2
Eleição vs. Exclusão Mútua vs. Consenso
Diferenças entre Exclusão Mútua e Eleição:
•  Na Eleição, todos os participantes precisam saber quem foi escolhido
•  A maioria dos Algoritmos de Eleição não faz suposições sobre o número
total de processos
•  Geralmente, Eleição é iniciada como reação a uma detecção de falha (p.ex.
do antigo coordenador)
•  Algoritmos de eleição precisam lidar com a possibilidade de falha durante a
escolha do novo coordenador.
•  Para o problema da eleição assume-se uma ordem total do conjunto de IDs
dos processos, e o conhecimento de um limite máximo deste conjunto
Similaridades:
•  Qualquer processo pode iniciar uma eleição (porém, não mais do que uma
eleição a cada vez), ou seja, pode haver várias execuções simultâneas do
algoritmo de eleição
•  Todos os processos precisam estar de acordo com a decisão tomada (o
novo coordenador, ou o próximo a entrar na SC)
Eleição é um problema de consenso específico (onde o valor proposto por cada
processo, vi é próprio PID)
© Markus Endler
3
Principais Requisitos
Definição:
• 
Durante uma eleição, cada processo pode estar engajado em uma
eleição (participante) ou não (não participante)
Os principais requisitos de qualquer Algoritmo de Eleição são:
• 
Safety/Segurança: deve-se garantir a unicidade do elemento
escolhido (o coordenador/lider)
• 
Liveness/Progresso: em algum momento, define-se qual será o líder/
coordenador
• 
Acurácia/Estabilidade: só fazer a releição se for realmente
necessária
© Markus Endler
4
Principais Requisitos
Considere N processos P1,..,PN, cada um com uma variável Coord,
incialmente indefinida (Coord = undef)
As condições acima são formuladas como:
Segurança: Um processo participante Pi tem Coord = undef ou Coord =
P, onde P é um processo correto (não faltoso) ao término do
algoritmo.
Liveness: Todos os processos Pi participam da eleição e em algum
momento ou tem Coord ≠ undef, ou terão falhado.
Acurácia/Estabilidade: são definidos em termos da qualidade da
detecção de falha.
Geralmente, o problema é reduzido ao de encontrar o maior/menor ID no
grupo.
© Markus Endler
5
Eleição em uma toplogia de Anel
• 
Assuma que cada processo tem um PID ∈ [1, MAX]
• 
E mensagens só circulam em um sentido
Objetivo: Achar o maior/menor PID.
Qual seria a idéia?
p8
p3
p9
•  Como detectar o término do
algoritmo (ter encontrado o
manor/maior PID) ?
•  Quantas rodadas são
necessárias?
© Markus Endler
p4
p1
6
Algoritmos baseados em Anel
Chang & Roberts (1979) propuseram um algoritmo simples para processos
interligados em uma estrutura lógica de anel (onde as mensagens só
circulam em um sentido)
O algoritmo funciona em 2 rodadas, para um número arbitrário de processos.
Ideia Central:
• 
Processo Pi inicia o algoritmo enviando uma mensagem (election, Pi.PID)
para o próximo processo P (i+1)mod N.
• 
Ao receber uma mensagem (election,ID), o processo Pj calcula max(ID,
PIDj) e manda este valor para o próximo
• 
O processo que receber o seu próprio PID é o novo coordenador.
• 
O coodenador coloca em circulação uma mensagem (elected,
coord.PID), para que todos fiquem sabendo quem é o novo coordenador
e o algoritmo termina quando esta msg retorna a ele.
O modelo de sistema:
• 
Processos não falham
• 
Comunicação é confiável e segura
• 
Sistema é assíncrono
• 
Todos os processos possuem PIDs distintos!
© Markus Endler
7
Algoritmos baseados em Anel
O algoritmo de Chang & Roberts garante a unicidade do coordenador (propr.
de segurança) porque:
• 
A mensagem election passa por todos os processos (todos são
participantes)
• 
Como todos tem PID distintos, existe um único processo com PIDmax
• 
Como a mensagem elected passa por todos os processos, todos setam o
mesmo valor para a variável Coord.
Liveness é garantida por:
• 
A função max é uma aproximação sucessiva deste PIDmax
• 
Por se tratar de um anel, e não haver perdas de mensagem, o processo
com PIDmax em algum momento receberá a mensagem com seu próprio
PID (PIDmax)
Características do Algorítmo:
• 
Simetria de papéis
• 
Vários processos podem iniciar simultaneamente o algoritmo
• 
Complexidade de mensagens por requisição 2 N.
• 
No pior caso (todos começando simultaneamente) é O(N2)
© Markus Endler
8
Algoritmos baseados em Anel
Hirschberg & Sinclair [HS80] propuseram um algoritmo com custo de
comunicação O(N log N), que:
• 
funciona em rodadas e
• 
assume um anel de tamanho N com links bi-direcionais confiáveis
Ideia Central:
• 
Iniciado a partir de um processo candidato, que a cada rodada
difunde (e compara ) o seu PID com vizinhos cada vez mais
afastados (mensagem Cand);
• 
caso um dos vizinhos perceba que possui PID maior do que o do
candidato, este inicia uma nova eleição (difundindo o seu próprio
PID)
• 
Processos com PID menores respondem ao candidato,
concordando com sua candidatura
• 
Processos intermediários:
– 
repassam mensagens, ou iniciam nova eleição (caso seu PID >
PIDCand)
[HS90] Hirschberg & Sinclair: Decentralized Extrema Finding in Circular
Configurations of Processes. Communications of the ACM, 23 (11), Nov. 1980.
© Markus Endler
9
Algoritmo de Hirschberg & Sinclair
Um pouco mais de detalhes:
Na rodada j o Pi envia a msg (Cand,Pi.ID) para os elementos distantes
2j hops dele no anel:
P(i-2j) mod N e P(i+2j) mod N
Ao receber a mensagem (Cand,ID), processo Pk compara ID com o
seu próprio identificador Pk.PID:
Se (ID > Pk.PID) então retorna ao remetente TRUE
senão retorna FALSE e passa a ser o novo candidato
Se o iniciador da difusão receber duas respostas TRUE, continua
candidato e passa à próxima rodada è incrementa j (= o alcance
da consulta)
Quando o iniciador recebe a msg Cand com o próprio PID, sabe que foi
eleito o novo coordenador e
Difunde uma mensagem Elected com o seu ID no anel.
© Markus Endler
10
O Algoritmo de Hirschberg & Sinclair
Exemplo para 7 processos: Algoritmo iniciado pelo P5
P4
P1
P3
P7
P5
P2
P0
P4
False
Os 3 tipos de mensagem:
Cand (PID, d, dmax), onde:
• 
dmax: distância máxima (# hops) a serem percorridos
• 
d: distânca (#hops) já percorridos pela mensagem
Resp (bool, P), onde:
• 
Bool = TRUE indica que P permanece candidato
• 
P indica o processo ao qual a resposta é destinada (o candidato)
Elected(sender)
© Markus Endler
11
O Algoritmo de Hirschberg & Sinclair
Cada processo pode estar em um de quatro estados:
•  not_involved = não foi consultado ainda
•  candidate = é o atual responsável pelas pesquisas (enquanto for o de
maior PID)
•  lost = recebeu msg com PID maior
•  elected = quando P descobre que ele é o de maior PID
Variáveis em cada processo:
Enum state: initialy not_involved;
// State = {candidate, not_involved, lost, elected}
Int maxhops, hops;
Int Nr_replies;
// pode ser 0,1 ou 2
Bool remain;
// TRUE = continua candidato na próxima rodada
Int winner;
// ID do processo eleito
Bool end_phase // sinal que indica que uma rodada terminou
O algoritmo é composto de um procedimento para iniciar a eleição
(Election) e uma tread (Monitor) que trata as mensagens recebidas, e
que compartilham variáveis state e end_phase
© Markus Endler
12
Procedimento de invocação da Eleição
Election() {
state = candidate;
dmax = 1;
while (state == candidate) {
Nr_replies = 0;
remain = TRUE;
send(left, Cand (self.ID, 0, dmax) );
send(right, Cand (self.ID, 0, dmax) );
wait(end_phase) => {
// espera sinal do Monitor
if (remain==FALSE) state = lost;
else dmax = dmax * 2;
// dobra a distânca
}
}
}
Obs: Assumimos que next[k] relaciona os vizinhos da
esq/direita:
•  next[left] = right
•  next[right] = left
© Markus Endler
Left=0
Right=1
Next[0] = 1
Next[1] = 0
13
A thread Monitor (1)
Loop {
received(k, Resp(bool,dest) ) =>
if (dest == self) {
Nr_replies++;
remain = remain ∧ bool;
if (Nr_replies==2) signal (end_phase);
} else send(next(k), Resp(bool,dest) )
// forward Resp
}
received(k, Cand(ID,d,dmax) )=> {
if (ID < self.ID) {
send(k, Resp(FALSE,ID) );
if (state == not_involved) Election();
// start election
} elseif (ID > self.ID) {
state = lost;
d++;
if (d < dmax) send(next(k), Cand(ID,d,dmax) ); // forward
else send(k, Resp(TRUE, ID);
// reply to candidate
} elseif (state ≠ elected) {
// ID == self.ID
state = elected;
// isto termina o while de Election()
winner = self.ID;
send(next(k), Elected(winner)); // announces in one direction
}
}
continua ...
© Markus Endler
14
A thread Monitor (2)
}
... continua
received(k, Elected(new) => {
if (winner ≠ new) {
send(next(k), Elected(new));
winner = new;
state = not_involved;
}
}
A corretude do algoritmo deriva dos seguintes fatos:
•  apenas o processo de maior ID (e.g. P.max) é capaz de receber a sua
própria msg Cand. Qualquer outro processo com ID < max terá a sua msg
Cand respondida negativamente por P.max.
•  todos os processos ao longo dos caminhos (i-2j, i+2j) irão interferir na
eleição (responder negativamente), caso tenham ID maior do que o do
candidato
© Markus Endler
15
Eleição para Grafos Completos
•  A topologia em anel é meio artificial, pois todos os processos
precisam estar ativos para repassar as mensagens...
•  Suponhamos agora que:
–  PID ∈ [1, MAX]
–  Processos podem estar ativos ou faltosos (não responder às
requisições)
–  Durante a eleição processos podem falhar, ou voltar a ficarem
ativos (mas com o mesmo PID)
Objetivo: encontrar o maior PID dentre os processos ativos
Sugestões...?
p8
p1
p9
p3
p4
© Markus Endler
p2
16
Eleição de Líder em MANETs
Leader Election Algorithms for Mobile Ad Hoc Networks
Navneet Malpani, J. Welch, N. Vaidya
We present two new leader election algorithms for mobile ad hoc networks.
The algorithms ensure that eventually each connected component of the
topology graph has exactly one leader. The algorithms are based on a routing
algorithm called TORA [5], which in turn is based on an algorithm by Gafni and
Bertsekas [3]. The algorithms require nodes to communicate with only their
current neighbors, making it well suited to the ad hoc environment. The first
algorithm is for a single topology change and is provided with a proof of
correctness. The second algorithm tolerates multiple concurrent topology
changes.
Publicado em ACM DIAL M worskhop, 2000
© Markus Endler
17
Eleição de Líder Estável
A Robust and Lightweight Stable Leader Election Service for Dynamic Systems
Nicolas Schiper, Sam Toueg
We describe the implementation and experimental evaluation of a fault-tolerant leader
election service for dynamic systems. Intuitively, distributed applications can use this
service to elect and maintain an operational leader for any group of processes which may
dynamically change. If the leader of a group crashes, is temporarily disconnected, or
voluntarily leaves the group, the service automatically re- elects a new group leader. The
current version of the service implements two recent leader election algorithms, and
users can select the one that fits their system better. Both algorithms ensure leader
stability, a desirable feature that lacks in some other algorithms, but one is more robust in
the face of extreme network disruptions, while the other is more scalable.
The leader election service is flexible and easy to use. By using a stochastic failure
detector [5] and a link quality estimator, it provides some degree of QoS control and it
adapts to changing network conditions. Our experimental evaluation indicates that it is
also highly robust and inexpensive to run in practice.
© Markus Endler
18
O Algoritmo “Bully”
Garcia-Molina[GM82] propôs um algoritmo para um sistema síncrono com
falhas tipo fail-stop, baseado na difusão de mensagens (conectividade total).
O algoritmo faz as seguintes suposições adicionais:
•  Toda mensagem é entregue em Tm unidades de tempo após o seu envio;
•  Todos os processos não falhos respondem a todas as mensagens
recebidas em Tp unidades de tempo;
•  Todos os processos têm acesso a uma memória não volátil (p.exemplo:
disco local) para persistir algumas informações.
Com as duas primeiras suposições, é possível definir um detector de falhas
confiável: se um processo não responde em 2Tm+Tp unidades de tempo,
então tem-se certeza de que o mesmo falhou.
A terceira suposição é necessária para manter o registro de versões (instâncias
da eleição) em ordem estritamente crescente.
© Markus Endler
[GM82] Garcia-Molina. Elections in a Distributed Computing System,
IEEE Trans. On Computers, C-31(2),48-59, 1982.
19
Algoritmo Bully: Princípio de Funcionamento
•  Periodicamente, o atual coordenador verifica se a configuração do
grupo mudou (um processo falhou ou se recuperou de falha) è se isso
ocorreu, inicia eleição
•  Se algum participante desconfiar da falha do Coordenador è inicia
eleição
• Dentre os processos ativos em determinado momento, aquele com o
maior PID deve ser eleito o coordenador. Este tenta convencer os
demais intimidando-os (“bullying”).
•  Antes de começar a eleição, o processo iniciador da eleição faz uma
consulta para verificar se existe algum processo com maior PID. (è A
possibilidade da detecção confiável de falhas garante que somente o
processo de maior prioridade vai tentar ser o coordenador)
© Markus Endler
20
Algoritmo Bully: Princípio de Funcionamento
A eleição funciona em 3 fases: ao final de cada fase, garante-se que
todos os processos não falhos estão sincronizados com o mesmo estado
(global) da eleição:
Normal >F1> Election >F2 > Reorganizing >F3> Normal
Significado dos estados:
•  Down = processo voltando de um período de falha
•  Election = um (ou mais candidatos) tentando se estabelecer como
Coordenador
•  Reorganizing = o estado da aplicação está sendo difundido para todos
os membros do grupo (p.exemplo a nova lista de membros ativos)
•  Normal = processamento normal (até início da próxima eleição)
© Markus Endler
21
Algoritmo Bully: Princípio de Funcionamento
Estados percorridos por todos os
processos
Down
Normal
Election
Reorganiz
...
Obs: durante os estados Election e
Reorganiz. o processamento da
aplicação fica suspenso.
Principais Variáveis em cada Processo P:
State: um valor em {Down,Election,Reorganizing,Normal}
Coord: o ID do candidato a Coordenador, segundo a visão de P
Definition: o estado relevante da aplicação
Up:
conjunto de PIDs de processos ativos no grupo
halted: ID do processo que notificou P da eleição (iniciador)
© Markus Endler
22
Segurança e Liveness
As propriedades de segurança (safety) e progresso (liveness) do algoritmo
são as seguintes:
Safety:
Seja G um estado global consistente(*). Então para quaisquer dois pares
de processos Pi e Pj as seguintes condições são satisfeitas em G:
•  Se Pi e Pj estão nos estados {Normal,Reorganizing}, então Pi.Coord =
Pj.Coord
•  Se Pi e Pj estão no estado Normal, então Pi.Definition = Pj.Definition
(estados sincronizados)
Liveness:
Seja G um estado consistente (*). Então as duas seguintes propriedades
estarão satisfeitas em algum estado global de qualquer processamento
a partir de G:
•  Existe um Pi tal que Pi.State = Normal && Pi.Coord = Pi
•  Para qualquer processo Pj não-falho, vale Pj.State = Normal &&
Pj.Coord = Pi
(*) Uma coleção de estados locais dos processos e canais de comunicação,
que de fato, poderia ter ocorrido em uma execução do sistema.
© Markus Endler
23
Detecção de Mudança no Grupo
Periodicamente:
•  Coord. verifica a existência de um processo ativo (com PID maior
ou menor do que PIDCoord )
•  Coord. verifica se todos os participante estão ativos (respondem à
mensagen AYNormal)
•  Participante verifica se seu Coord. está ativo (mensagem AYUp)
Se alguém tiver detectado qq mudança inicia-se uma nova eleição...
•  Quando um processo se recupera de uma falha, também inicia
nova eleição.
Obs: AY.. significa AreYou... e para cada tipo de mensagem existe uma
mensagem de resposta (AYNormal è AYN_answer, etc.)
A eleição consiste de 3 mensagens difundidas pelo Processo com
maior PID:
•  EnterElection (EE) // se propõe como coordenador e verifica quais
processos estão ativos
•  SetCoordinator (SC)
•  NewState
© Markus Endler
24
Monitoramento do Grupo e Situações de chamada de Election
Coord
Part A
Part B
AYNormal
ok
AYN_answer
AYUp
AYU_answer
ok
crash
Election()
AYNormal
Election()
AYN_answer
Election()
AYUp
crash
Election()
Timer T
© Markus Endler
25
Estados Globais na Execução da Eleição
P4
AYUp
P3
P2
!∃ P tq. P.ID > P3
& P.State=Normal
C1
EnterElection
SetCoord
C3
NewState
© Markus Endler
P3
∀ P tq. (P.ID < P3) :
P.Coord ≠ P
∀P P.State≠Normal
C2
C4
P1
∀P ∈ UP:
P.State=Reorg. ∧
P.Coord=P3
∀P ∈UP:
P.State=Normal ∧
P.Coord=P3
26
Procedimentos que iniciam uma Eleição
•  Qualquer processo que deixa de receber msg do coordenador
por um certo período è suspeita de sua falha
Check_Coordinator () {
if (State==Normal || State == Reorganizing) {
send (coord,AYUp);
set timer T;
}
received(coord, AYU_answer) => set timer for next check;
timeout T => Election();
}
•  Qualquer processo que esteja voltando de um
período de falha
Recovery () {
State = Down;
Election();
}
© Markus Endler
27
Coordenador verifica o estado dos demais processos
Check_members() {
if (State==Normal && Coord == self) {
forall Pj: send (j,AYNormal);
set timer T;
replied = ∅;
}
loop {
received(k, AYN_answer, status) => {
replied = replied ∪ {k};
if (k ∈ Up && status ≠ Normal) || k ∉Up) {
Election();
// detected new or candidate process
exit;
}
timeout T => { if ∃ k ( k ∈ Up && k ∉ replied ) { // some process did not reply
Election();
} exit;
}
} // endloop
}
Obs: para cada tipo de mensagem existe uma mensagem de resposta
(AYNormal - AYN_answer, etc.)
© Markus Endler
28
Procedimento Election (1)
Election() {
highest = True;
forall P with P.ID > self.ID send(P, AYUp); // look for higher-priority processes
set timer T;
received(sender, AYU_answer) => {
highest = False; return;} // abandon own candidacy
timeout T => ;
// wait only for certain amount of time
State = Election;
halted = self;
// I am the initiator and candidate
Up = ∅;
forall P s.th (P.ID < self.ID) send(P, EnterElection(halted)); // “invite” other
participants
set timer T;
loop {
received(k, EE_answer) => Up = Up ∪ {k}
timeout T => exit;
}
Coord = self;
Obs: participant= process with a lower PID
State = Reorganizing;
...
© Markus Endler
29
Procedimento Election (2)
...
num_answers = 0;
forall P ∈ Up send(P,Set_Coord, self);
// try to establish myself as Coord
Set timer T;
loop {
received(k, SC_answer) => num_answers++;
timeout T =>
if (num_answers = | Up |) exit loop;
else { Election(), return; }
// set of participants has changed
}
num_answers = 0;
forall P ∈ Up send(P,New_State, Definition) // sends appl state to other in Up
loop {
received(k, NS_answer) => num_answers++;
timeout T =>
if num_answers = | Up | exit loop;
else { Election(), return; }
// set of participants has changed
}
State = Normal
}
© Markus Endler
30
Thread Monitor
Loop {
received(k, M) => {
switch (M ) {
AYUp: send(k,AYU_answer);
AYNormal: send(k, state);
EnterElection(k): {
State = Election;
suspend_normal_application processing
if (k > self)
// defines, in which Election will participate
if election_procedure was started, stop it
halted = k;
send(k, EE_answer);
}
Set_Coord(newCoord): {
if (State==Election && halted==newCoord) {
Coord = newCoord;
State = Reorganizing;
}
send(k, SC_answer); }
NewState (NewDefinition) :
if (Coord == k && State = Reorganizing) {
Definition = newDefinition;
// updates state
State = Normal;
}
} // end switch
} // endloop
© Markus Endler
31
Algoritmo do Convite (Invitation Algorithm)
De Garcia-Molina[GM82] é também o Algoritmo do Convite, que:
•  é uma variante do Algoritmo Bully para sistemas assíncronos e
•  que trata a possibilidade de ocorrem partições na rede.
Sistemas Assíncronos:
•  Sem a suposição sobre tempos máximos de processamento e
comunicação, não é possível saber com certeza se um
processo falhou. Sabe-se apenas que a comunicação (em certo
período) não está sendo possível.
Partições:
•  Impossibilidade temporária da comunicação entre grupos de
processos
© Markus Endler
32
Algoritmo do Convite
Suposições do Modelo:
•  Comunicação é segura
•  Falhas são do tipo fail-stop
•  Nós guardam o estado em memória persistente (após se recuperar
de uma falha, conseguem recuperar o estado anterior)
•  Grupos de processos podem ficar temporariamente isolados uns
dos outros (partições na rede)
•  As mudanças de conectividade da rede ocorrem com baixa
frequencia
Características:
•  Permite que existam mais de um grupo (com seu coordenador)
isolados
•  Mas se houver alguma possibilidade de comunicação entre estes
grupos, eles irão se fundir
© Markus Endler
33
Algoritmo do Convite (Invitation Algorithm)
Ideia Central:
•  em vez de se tentar eleger um coordenador para todos os
processos, elege-se somente o coordenador para cada um dos
sub-grupos de processos cujos membros estão conseguindo
interagir
Obs: permite-se grupos unitários consistindo apenas do
candidato a coordenador!
•  Periodicamente, coordenadores de sub-grupos verificam se
existem outros coordenadores, e tentam convidar todos os
membros do sub-grupo correspondente a se juntar ao seu
grupo.
•  Para evitar que dois coordenadores fiquem se “roubando
mutuamente” membros do outro grupo, após a descoberta do
outro coordenador, este espera um tempo inversamente
proporcional à sua prioridade (valor do PID) até começar a
enviar os convites.
è Para isto, é necessário usar a noção de grupo, com um
identificador único (groupID)
© Markus Endler
34
Algoritmo do Convite
Adaptando as propriedades de segurança e progresso para o algoritmo do
convite:
Propriedade Safety:
Seja G um estado consistente. Então para quaisquer dois pares de
processos Pi e Pj as seguintes condições são satisfeitas em G:
•  Se Pi e Pj estão nos estados {Normal,Reorganizing} e Pi.Group =
Pj.Group, então Pi.Coord = Pj.Coord
•  Se Pi e Pj estão no estado Normal, e Pi.Group = Pj.Group então
Pi.Definition = Pj.Definition
A propriedade de segurança é facil de ser satisfeita, pois depende de
como é escolhido o grupo (= pode ser qualquer conjunto de processos
que concorde em adotar um mesmo coordenador).
© Markus Endler
35
Algoritmo do Convite
Propriedade Liveness:
Seja R o conjunto máximo de processos mutuamente comunicáveis em
um estado consistente G.
Então as duas seguintes propriedades serão em algum momento
satisfeitas (para qualquer processamento a partir de G), dado que o
conjunto máximo de processos mutuamente comunicáveis R
permaneça igual e não ocorram outras falhas:
•  Existe um Pi ∈ R tal que Pi.State = Normal && Pi.Coord = Pi
•  Para todos os processos Pj ∈ R não-falhos, vale Pj.State = Normal &&
Pj.Coord = Pi
© Markus Endler
36
Algoritmo do Convite (Invitation Algorithm)
Para satisfazer a propriedade de liveness, precisa-se garantir que:
•  Se membros de grupos distintos conseguem se comunicar,
então em algum momento futuro, terá sido formado um novo
grupo (com coordenador único) contendo todos os processos
mutuamente comunicáveis (ou seja, o conjunto R).
Para tal, é necessário que os coordenadores dos grupos
correspondentes concordem sobre a formação de um novo
grupo contendo todos os membros dos grupos originais e um
único coordenador.
•  Sucessivamente, grupos menores vão se aglutinando, até
formar um grupo contendo todo R.
•  Cada coordenador, periodicamente tenta descobrir outros
coordenadores e executar um Merge() nos grupos tendo como
parâmetro a lista de outros coordenadores encontrados
(Others).
© Markus Endler
37
Funcionamento Básico
•  Periodicamente, um coordenador difunde um AYCoord? tentando
contactar outros coordenadores, armazena o ID destes na variável
Other e tenta juntar os grupos (procedimento Merge(Other))
através de mensagens Invitation.
•  Ao receber uma Invitation de outro coordenador (digamos, NC),
um coordenador C repassa esta mesagem para os participantes
de seu grupo, que respondem diretamente ao NC usando msg
Accept. O próprio C também envia Accept para NC.
•  O NC por sua vez confirma o seu papel de novo coordenador
através de Accept_answer. Se esta mensagem não chegar a
tempo, qualquer processo pode executar recovery();
•  A seguir, NC envia a mensagem Ready com seu estado Definition
para todos os processos da união dos grupos originais.
Principais variáveis em cada processo:
State
UpSet
Up
Group
Others
© Markus Endler
// {Normal, Election, Reorganizing}
// conjunto dos membros do próprio grupo
// conjunto dos membros da união dos grupos
// identificação do grupo, através do par (CoordID, count])
// conjunto de outros coordenadores descobertos
38
Execução da Eleição
Merge(P2)
P4
Invitation P4
P3
P2
Accept
Accept_answer
P1
Invitation P4
Accept
Accept_answer
Up
Ready
Ready_answer
Grupo A
© Markus Endler
Grupo B
39
Coordenador procura por outros coordenadores
Periodicamente, cada coordenador verifica se consegue se comunicar com
outro coordenador (e coleta na variável Others os PIDs correspondentes)
Check_members() {
if (State==Normal && Coord == self) {
Others = ∅;
forall Pj send (j,AYCoord);
set timer T;
}
loop {
received(k, AYC_answer, is_Coord) => {
if( is_Coord == TRUE) Others = Others ∪ {k};
}
timeout T => if Others == ∅ return;
// no group to merge
else exit;
}
} // endloop
set timer 1/self.Priority;
// higher-priority coordinator merges first
timeout => Merge(Others);
}
Obs: Se um participante de outro grupo receber msg AYCoord, informa a
identidade de seu atual coordenador (em AYC_answer).
© Markus Endler
40
Tipos de Mensagem
origem è destino
AY_Coordinator
AYC_answer (bool)
AY_There (groupID)
AYT_answer (bool)
Coord è any
Coord è Coord
Mem è Coord
Coord è Mem
Invitation(newCoord, newGroup)
Accept (newGroup)
Accept_answer (bool)
Ready (newGroup, newDefinition)
Ready_answer (bool)
C è C, C è Mem
any è Coord
Coord è all that accepted
Coord è all in Up
all in Up è Coord
Identificação do Grupo agora é composta do par:
(PID do Coord, número de sequência)
© Markus Endler
41
Quando um Membro suspeita de falha do Coordenador
è membro simplesmente cria um novo grupo contendo somente ele
próprio.
Check_Coord() {
// periodically called
if (Coord == self) return;
send(Coord, AYThere,Group);
set timer T;
is_Coord=FALSE;
received(k, AYT_answer, is_Coord) => { // coordenator is alive
if( is_Coord == TRUE) return;
timeout T => Recovery();
// coordenator has crashed
}
Recovery() {
State= Election;
stop_processing();
Counter++;
Group = (self ⎜Counter);
Coord = self;
Up = ∅;
State = Reorganizing;
Definition = my_appl_state;
State = Normal;
}
© Markus Endler
// creates a new group of its own
42
O procedimento Merge
Merge(CoordSet) {
if (Coord == self) && (State = Normal) {
State = Election;
suspend_processing_application;
Counter++;
GroupID = (self ⎜Counter);
// creates a new group
UpSet = Up;
// UpSet: members of previous group
Up =
∅;
set timer T1;
foreach p ∈ (CoordSet ∪ UpSet) send(p, Invitation(self,GroupID));
// replies “Accept” collected in UP by monitor thread
when timeout T1=> {
// waits T1 for accept replies
State= Reorganizing;
Nr_answers=0;
set timer T2;
foreach p ∈ Up send(p, Ready(GroupID, Definition));
loop {
when revd(Ready_answer(sender, inGroup, newGroupID) => {
if (inGroup==TRUE ∧ newGroupID==GroupID) Nr_answers++;
when timeout T2 => {
// waits T2 for Ready_answers
if (Nr_answers < | Up |) Recovery();
else state = Normal;
} // endloop
}
}
© Markus Endler
43
Thread para tratar um Convite
Cada processo (participante|coordenador) precisa executar uma thread para
tratar mensagens Invitation.
loop {
when State == Normal ∧ recv(p, Invitation(newCoord, newGroupID) => {
suspend_processing_application;
oldCoord = Coord;
UpSet = Up;
// UpSet: the members of its own group
State = Election;
Coord = newCoord;
GroupID = newGroupID;
if (oldCoord == self)
// if coordenador, forward to members
foreach p ∈ UpSet send(p, Invitation(Coord,GroupID)) ;
send(Coord, Accept(GroupID));
set timer T;
when recv (Coord, Accept_answer(accepted)) => { }
when timeout T => { accepted = FALSE}
if (accepted == FALSE) Recovery();
State = Reorganizing;
}
}
© Markus Endler
44
Thread Monitor para responder às mensagens
Loop {
received(k, M) => {
// receiving a message from process k
case M == Ready(newGroup,newDefinition):
if (Group==newGroup) ∧ State == Reorganizing {
Definition = newDefinition; // only if in Reorganizing
State = Normal;
send(Coord, Ready_answer(True, Group));
} else
send(k, Ready_answer(False));
case M == AYCoordinator:
if (State==Normal ∧ Coord==self)
send(k, AYC_answer(TRUE));
else
send(k, AYC_answer(FALSE));
case M == AYThere(oldGroup):
if (Group==oldGroup ∧ Coord==self ∧ k ∈ Up)
send(k, AYT_answer(TRUE);
else
send(k, AYT_answer(FALSE);
case M == Accept(newGroup):
if State==Election ∧ Coord==self
∧ Group==newGroup { // only if in Election and for new Group
Up = Up ∪ {k}
// Up is used by Merge()
send(k, Accept_answer(TRUE));
} else
send(k, Accept_answer(FALSE));
}
} // endloop
© Markus Endler
45
O Modelo de Sistema
Suposições sobre:
•  Sincronismo ?
•  Comunicação ?
•  Tipos de Falhas ?
•  Estabilidade do sistema ?
© Markus Endler
46
Conclusões sobre o Algoritmo do Convite
Por não fazer qualquer suposição sobre o sincronismo do
sistema, este algoritmo é de utilidade prática e até é
mais simples do que o Algoritmo Bullying.
A corretude do mesmo se baseia na idéia de consistência
relativa, que é muito usada em sistemas assíncronos:
•  aplica-se a exigência de consistência (igualdade da
variável Coord e da lista de membros) somente para os
atuais membros do grupo
•  Não há qualquer exigência sobre consistência do
estado em todos os processos. O estado global é
tornado consistente “a medida do possível” (p.ex.
inclusão esponanea de novos membros, unificação de
grupos quando há descoberta mútua, etc)
•  Por exemplo: se existirem dois grupos a serem
juntados, então somente se não houver outras falhas
durante o Merge (incluindo as falhas de comunicação),
em algum momento futuro os grupos serão unificados;
© Markus Endler
47
Conclusões sobre o Algoritmo do Convite
Com relação à convergência:
•  O alg. é muito sensível à frequência de perdas de mensagem (entre
quaisquer dois processos)
•  Mas se houver subgrupos de processos em que frequência de
perda é praticamente inexistente (partições de rede), então estes
conseguirão formar grupos locais e eleger um coordenador.
•  O quanto menor for N, menor será a chance de alguma mensagem
se perder, e mais estável os grupos estarão.
© Markus Endler
48
Download