Sistemas Distribu´ıdos
Comunica¸c˜ao em Grupo
Grupos em Aplica¸c˜
oes Distribu´ıdas
grupos fortemente acoplados:
replica¸c˜ao de servi¸cos confiabilidade tempo de resposta
clientes com estado compartilhado computa¸c˜ao cient´ıfica
...
Primitiva de comunica¸c˜ao em grupo
Grupos em Aplica¸c˜
oes Distribu´ıdas
grupos fracamente acoplados:
observadores “melhor esfor¸co”
monitoramento de ambientes de execu¸c˜ao consumo de dados: valores de mercados, etc
Primitiva de comunica¸c˜ao em grupo
um processo envia uma mensagem para um grupo de processos e todos os destinat´arios recebem
Broadcast ou Multicast
em redes: conceito de entrega para todos e para alguns conceitos se confundem em sistemas distribu´ıdos
Comunica¸c˜
ao em Grupo: Problemas Novos
alguns recebem e outros n˜ao
Garantias de Entrega
confiabilidade ordena¸c˜ao
Implementa¸c˜ao
N´ıveis de garantia de entrega
1 Melhor-esfor¸co (best-effort): garantia de entrega entre
processos corretos
2 Confi´avel (reliable): garantia all-or-nothing mesmo se o
emissor falhar
Garantia de entrega: Implementa¸c˜
ao
uso de holdback queue
em geral, mensagens com identificadores ´unicos
o que j´a existe no SO agora em bibliotecas ou middlewares custos de espa¸co e processamento!
Garantias de entrega: Implementa¸c˜
ao por algoritmos
distribu´ıdos
Componentes orientados a eventos
nota¸c˜ao baseada em eventos ass´ıncronos. cada componente ´e identificado por um nome, provˆe uma interface na forma de eventos que ele trata (requests) ou produz (indications). e garante um conjunto de
propriedades. R. Guerraoui, L. Rodrigues. Reliable Distributed Programming. Springer. 2006.
Exemplo de c´
odigo nos componentes
upon event <Event1 | att1, att2, ...> do ...faz algo...
trigger <Event2 | att1, att2, ...>;// envia evento
upon event <Event3 | att1, att2, ...> do ...faz algo...
Exemplo de m´
odulo de impress˜
ao
M´odulo
Module:
Name: Print Events:
Request: <PrintRequest | rqid, str> Indication: <PrintConfirm | rqid>
Algoritmo
Implements: Print
upon event <PrintRequest | rqid, str> do print(str);
Exemplo de servi¸co de impress˜
ao com n
ode requisi¸c˜
oes
limitado
M´odulo Module: Name: BoundedPrint Events:Request: <BoundedPrintRequest | rqid, str> Indication: <PrintStatus | rqid,status>: Ok/Nok Indication: <PrintAlarm>: atingiu o limite
Exemplo... impress˜
ao com n
ode requisi¸c˜
oes limitado
Algoritmo
Implements: BoundedPrint Uses: Print
upon event <Init> do bound := Threshold;
upon event <BoundedPrintRequest | rqid, str> do if bound > 0 then
bound := bound - 1;
trigger <PrintRequest | rqid, str>; if bound = 0 then trigger <PrintAlarm>; else
trigger <PrintStatus | rqid, Nok>; upon event <PrintConfirm | rqid> do
Broadcast do melhor-esfor¸co
Um processo envia uma msg em um passo de comunica¸c˜ao para todos os processos do sistema, incluindo ele mesmo Custo para garantir confiabilidade ´e apenas do lado do emissor (se ele falhar, nenhuma garantia de entrega ´e oferecida)
Interface e propriedades do “Bcast melhor-esfor¸co”
Module:
Name: BestEffortBroadcast (beb). Events:
Request: <bebBroadcast | m>: bcast m
Indication: <bebDeliver | src, m>: entrega m Properties:
BEB1: Validade melhor-esfor¸co: se Pi e Pj
s~ao corretos, toda msg de Pi ´e entregue em Pj
BEB2: N~ao duplica¸c~ao: nenhuma msg ´e entregue mais de uma vez
BEB3: N~ao-cria¸c~ao: se a msg ´e entregue em Pj
Algoritmo Bcast b´
asico
Implements: BestEffortBroadcast (beb) Uses: PerfectPointToPointLinks (pp2p) upon event <bebBroadcast | m> do
forall pi do
trigger <pp2pSend | pi, m>; upon event <pp2pDeliver> | pi, m> do
Exemplo de execu¸c˜
ao de Bcast b´
asico
Interface de comunica¸c˜
ao p2p utilizada...
Interface do enlace
Module:
Name: PerfectP2PLink Events:
Request: < pp2pSend | dest, msg > Indication: < pp2pDeliver | src, msg >
entrega confi´avel: se pi manda para pj e nenhum deles falha,
pj em algum momento recebe
ausˆencia de duplica¸c˜ao de mensagens ausˆencia de cria¸c˜ao de mensagens
exemplo implementa¸c˜
ao PerfectP2P
1 retransmite eternamente (did´atico mas sem bom
desempenho...)
2 elimina duplicatas
confiabilidade do broadcast de melhor esfor¸co
1 se transmissor n˜ao falhar, garantia de entrega a todos 2 se transmissor falhar:
processos podem “discordar” sobre entrega de mensagem broadcast de melhor esfor¸co pode n˜ao ter transmitido para todos ou falha pode ter ocorrido antes de terem sido feitas as retransmiss˜oes necess´arias
Broadcast confi´
avel
todos os processos devem receber (tratar) o mesmo conjunto de mensagens
no¸c˜ao de acordo
Interface e propriedades do Bcast confi´
avel
Molule:
Name: Reliable Broadcast (rb). Events:
Request: <rbBroadcast | m>: bcast m
Indication: <rbDeliver | src, m>: entrega m Properties:
RB1: Validade: se Pi e Pj
s~ao corretos, toda msg de Pi ´e entregue em Pj
RB2: N~ao duplica¸c~ao: nenhuma msg ´e entregue mais de uma vez
RB3: N~ao-cria¸c~ao: se a msg ´e entregue em Pj
Algoritmo Bcast confi´
avel regular
Implements: ReliableBroadcast (rb) Uses: BestEffortBroadcast (beb) upon event <Init> do
delivered := {};
upon event <rbBroadcast | m> do delivered := delivered U {m}; trigger <rbDeliver | self, m>;
trigger <bebBroadcast | [DATA,self,m]>;
upon event <bebDeliver> | pi, [DATA,self,m] > do if(m not in delivered) do
delivered := delivered U {m}; trigger <rbDeliver | source_m, m>;
Broadcast confi´
avel regular – limita¸c˜
ao
mensagem pode ser tratada no pr´oprio processo emissor antes de chegar a outros, e em seguida emissor falhar
P1 P2 P3 P4
X
Broadcast confi´
avel uniforme
mensagem s´o ´e entregue a aplica¸c˜ao depois que todos os processos no grupo confirmam recebimento
necessidade de detector de falhas perfeito gera alertas de falhas de processos acoplamento fort´ıssimo entre processos
Broadcast ordenado
As solu¸c˜oes anteriores n˜ao garantem ordem de entrega das mensagens enviadas por processos diferentes (pp2p pode garantir ordem de entrega de msgs de 1 mesmo processo) Algumas aplica¸c˜oes precisam de garantias de ordem de entrega.
ordem total ordem causal
Ordem Total
N˜ao importa a ordem de entrega, mas deve ser a mesma em todos os processos do grupo.
Ordem Causal
poss´ıvel rela¸c˜ao de causalidade
uma mensagem pode ter sido consequencia de outra ainda n˜ao vista
Causalidade em eventos distribu´ıdos...
a− >b: o evento a ocorre antes do evento b se a ocorre antes de b em um mesmo processo P a=send(m) no processo P e b=receive(m) no processo Q
existe c tal que a precede c e c precede b
a||b: os eventos a e b s˜ao concorrentes
Interface e propriedades do “Bcast ordem causal”
Molule:
Name: ReliableCausalOrder (rco) Events:
Request: <rcoBroadcast | m>: bcast m
Indication: <rcoDeliver | src, m>: entrega m Properties:
CB: Entrega causal: m2 s´o ´e entregue em Pi
se toda msg mi tal que mi->m2 foram entregues RB1: Validade
RB2: N~ao-duplica¸c~ao RB3: n~ao-cria¸c~ao RB4: Acordo
Algoritmo Bcast ordem causal
Uses: ReliableBroadcast (rb) upon event <Init> do
delivered := 0; past := 0; upon event <rcoBroadcast | m> do
trigger <rbBroadcast | [DATA,past,m]>; past := past U {(self,m)};
upon event <rbDeliver> | pi, [DATA,past_m,m] > do if(m n~ao-pertence a delivered) then
forall (s_n, n) in past_m do if(n n~ao-pertence delivered) then
trigger <rcoDeliver | s_n, n>; delivered := delivered U {n}; past := past U {(s_n,n)}; trigger <rcoDeliver | pi, m>; delivered := delivered U {m}; past := past U {(pi,m)};
Rel´
ogio L´
ogico (Lamport)
conceito de rel´ogio l´ogico modela ordena¸c˜ao (parcial) de eventos
cada evento associado a um valor r (ei) de forma que
Rel´
ogio L´
ogico — Implementa¸c˜
ao
cada processo P mant´em um contador, inicialmente RLP = 0
a cada evento e, P associa um valor RLP(e) e incrementa seu
contador
se evento e ´e envio de mensagem, P acrescenta campo timestamp com valor RLP(e)
ao receber mensagem M com timestamp TS , processo Q faz RLQ = max (RLQ, TS ) + 1
Broadcast causal com espera
uso de rel´ogio l´ogico e timestamps: funciona se tempo de entrega de mensagens tem limite m´aximo
Broadcast causal
uso de mensagens “posteriores” para validar mensagens com timestamp TS
tempo de quarentena (dependente de latˆencia da rede) em fila de holdback
Vetor de timestamps
Vetor de timestamps: id´eia b´asica
Dados N processos, usa-se um vetor de N elementos (ao inv´es de um valor escalar)
A cada evento “e”, associa-se um vetor de timestamps cujo i-´esimo elemento indica quantos mensagens do processo i j´a foram vistas
Vetor de timestamp
Defini¸c˜ao da rela¸c˜ao <
Sejam a e b dois eventos quaisquer VT (a) < VT (b):
1 ∀i , VT (a)[i ] ≤ VT (b)[i ] 2 ∃j, VT (a)[j] < VT (b)[j]
Note que < ´e uma ordem parcial, existem eventos que n˜ao podem ser comparados por serem concorrentes
Ex., x = [0, 0, 1, 0] e y = [1, 0, 0, 0], pois VT (x ) 6= VT (y ) e n˜ao vale VT (x ) < VT (y ) nem VT (y ) < VT (x )
Vetor de timestamp
Funcionamento
Cada processo mant´em seu VT que come¸ca com 0 em todas
as posi¸c˜oes
Para cada evento “e” local e de envio de msg, incrementa o componente do processo local no VT e associa VTp ao evento
“e”: VTp[p] = VTp[p] + 1 e VT (e) = VTp
Quando Q recebe uma mensagem, atualiza cada campo do seu VT:
VTq[i ] = VTq[i ] + 1, i = q
VTq[i ] = max (VTq[i ], VTm[i ]), i 6= q
Esta ´ultima parte garante que tudo que acontecer depois em Pq
passa a ser causalmente relacionado com tudo o que aconteceu antes em Pi
Exemplo de uso de VT para ordena¸c˜
ao de eventos
r2
r3
r1
1 0 0
0 0 0
0 0 0
1 0 0 1 0 0VT para ordena¸c˜
ao causal
´
e necess´ario n˜ao apenas estabelecer ordem mas garantir que foram vistas todas as mensagens que precedem causalmente determinada mensagem!
Exemplo de entrega em ordem causal
r2 r3 r1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0Exemplo de entrega em ordem causal
r2 r3 r1 1 0 0 0 0 0 0 0 0 X 1 0 0Exemplo de entrega em ordem causal
r2 r3 r1 1 0 0 0 0 0 1 0 0Exemplo de entrega em ordem causal
r2 r3 r1 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0Exemplo de entrega em ordem causal
r2 r3 r1 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0pode ser entregue à aplicação!
não pode ser entregue à aplicação!
Gerˆ
encia de Grupos
algoritmos de ordena¸c˜ao sup˜oem que cada participante conhece os membros do grupo
grupos est´aticos x dinˆamicos (falhas, ades˜oes, etc)
servi¸co de membership
Referˆ
encia
R. Guerraoui and L. Rodrigues. Introduction to Reliable Distributed Programming Springer, 2006