Comunicação de Grupo Roteiro: • Motivação e Aplicações • Formas de CG mais comuns e uma API típica • Garantias sobre Atomicidade e Ordem • Alternativas: Flooding e 2PC • O Algoritmo Transis • Pertinência a Grupos • Sincronia Virtual • Algumas arquiteturas Referências: • Livro do Chow/Johnson: seção 12.2 • Livro do Couloris/Dollimore/Kindberg: seções 4.5, 11.4, 14.2 • K. Birman, A Review of Experiences with Reliable Multicast, Software Practice & Experience, 29(9), 1999. • R. Guerraoui et al, Experiences with object group systems, Software Practice & Experience, 30(9), 2000. © Markus Endler 1 Comunicação de Grupo (CG) Comunicação de Grupo é um serviço útil para: • aplicações com requisitos de tolerância à falha (geralmente implementados através de um conjunto de servidores replicados) • aplicações distribuídas baseado em um estado global consistente (acoplamento forte entre os estados locais) (p.ex. que requerem sincronização/ coordenação dos processos (p.ex. Algoritmo de Ricart & Agrawala) A principal primitiva é o multicast confiável, que fornece uma abstração (transparência de replicação) que é muito conveniente para o desenvolvimento de tais aplicações: Usa-se send(g, msg), e deliver(g, &msg) g = {p1,p2,...,pn} que pode ter qualquer numero de membros, Aplicação não precisa enviar a msg para cada pi e tem garantia que todos os membros de g receberam a mensagem. © Markus Endler 2 Multicast Confiável Existem diferentes definições para multicast confiável e muitas possíveis implementações. Exemplos: “Se um membro p g recebe a mensagem, então … a) …todos os demais membros de g também receberão a mensagem.” b) ...todos membros ativos de g e que consideram p como membro de g também receberão a mensagem” c) ...todos os membros alcançáveis durante o multicast também receberão a mensagem” (Best effort: tentase entregar a mensagem a todos membros) © Markus Endler 3 Multicast confiável vs. Não-confiável Multicast confiável tem que ser implementado através de comunicação ponto-a-ponto. Apesar de eventualmente existir suporte para comunicação multiponto em camadas de enlace ou rede, como por exemplo – difusão pelo meio (Ethernet), ou – IP multicast esta comunicação multi-ponto não fornece quaisquer garantias de entrega (confiabilidade), devido a: • possibilidade de particionamento da rede ou falha permanebte em um enlace • perda esporádica de pacotes • atualização do grupo multicast justamente no momento de uma difusão © Markus Endler 4 Comunicação de Grupo (CG) CG é o termo genérico que engloba dois serviços: comunicação multicast e gerenciamento de grupos CG geralmente lidam com falhas do tipo: • falha permanente ou temporária de um ou mais processos do grupo • comunicação ponto-a-ponto não-confiável • partição da rede (grupos desconectados) Quase nenhuma trata de falhas bizantinas! © Markus Endler 5 Alguns Sistemas • • • • • • V System (Cheriton, Zwaenepoel, 85) Chorus (Rozier et al., 88) Amoeba (Kaashoek & Tanenbaum, 91) Trans/Total (Melliar-Smith, 90) Delta-4 (Powell, 91) Isis (Birman, 93) – Sistema de CG monolítico • Horus (van Renesse et al., 96) – sistema de CG modular e extensível • Totem (Moser et al., 96) • Transis (Dolev & Malki, 96) • Ensemble (Birman & van Renesse, 01) – Biblioteca de protocolos & ferramentas de CG • CORBA Object Group Service (Felber & Guerraoui,98) © Markus Endler 6 Diferentes Abordagens para CG Quanto ao direito de comunicação • Grupos abertos: processos não-membros podem enviar mensagens multicast para os membros do grupo • Grupos fechados: para ser capaz de enviar um multicast, um processo precisa primeiro entrar no grupo (join) Quanto à organização interna do Grupo • com coordenador: este faz a difusão de mensagens para os demais membros • sem coordenador: todos têm visão idêntica do grupo e fazem difusão de msgs Quanto às garantias de entrega e ordenação (mais detalhes adiante…) • Ordem FiFO • Ordem causal • Ordem total © Markus Endler 7 Comunicação de Grupo (CG) Dado que geralmente o serviço de CG provê garantias (de entrega e ordenação das mensagens) especiais, existe a distinção entre: • recepção pela camada de rede/transporte • entrega da para a camada de aplicação Principais primitivas para comunicação: • mcast(group, m) • deliver(m) member 1 mcast deliver member 2 mcast deliver Serviço de CG send receive send receive Network/ Communication System © Markus Endler 8 Uma API típica de CG P1 P2 P1 P2 P3 P3 group G1 group G1 send P5 P1 P2 P4 P3 group G1 grp_join(G1) P4 grp_create(&gid) grp_delete(gid) grp_join(gid) grp_leave(gid) grp_reorganize(gid) grp_send(gid, msg) grp_deliver(gid, &msg) grp_info(gid, &status) P4 criação de um novo grupo remoção do grupo gid entrada no grupo saida do grupo eleição de novo coordenador envio de msg ao grupo (multicast) entrega de uma mensagem do grupo informação sobre o grupo (nº membros, coordenador, etc.) A identificação do Grupo (gid) deve ter o mesmo status de um processID Processos devem usar primitivas send e receive convencionais Um processo deve poder pertencer a vários grupos simultaneamente © Markus Endler 9 Ordem de Entrega de Mensagens de Grupo Possíveis garantias da CG quanto a ordem de entrega das mensagens (Definições): • Ordem Qualquer (Any): Mensagens são entregues em qualquer ordem • Ordem FIFO: Se processo P envia mensagem m antes da mensagem m', então nenhum membro do grupo irá receber m' antes de m • Ordem Causal: Se uma mensagem m precede causalmente outra mensagem m' (m m'), então nenhum membro irá receber m' antes de m • Ordem Total: Se um membro do grupo entrega m antes de m', então todos os demais membros entregam também m antes de m‘ • Sincronia Virtual: Se um processo recebe m na visão vN e participa da criação da visão vN+1, então todos os processos ativos na visão vN+1 também entregam m antes da instalação da visão vN+1. © Markus Endler 10 Confiabilidade de Entrega Possíveis garantias referentes à confiabilidade da entrega das mensagens (Definições): • Melhor esforço (best effort): Mensagem será recebida por todos os membros que estiverem ativos e puderem receber a mensagem em um dado período de tempo. • Resiliência de grau k: Se pelo menos k membros receberam a mensagem, então pelo menos k membros irão entregar a mensagem. • Atomicidade não uniforme (non-uniform atomic multicast): A mensagem será entregue a todos os membros ativos do grupo ou a nenhum deles. ( sincronia virtual) • Atomicidade uniforme (uniform failure atomic multicast): Se um membro do grupo P entregou a mensagem, então ela necessariamente será também entregue por todos os demais membros (independente do estado de P). Note que atomicidade uniforme: • dá garantia de entrega mesmo que um membro falhe durante o protocolo torna-se necessária quando a entrega de uma mensagem causa efeitos externos ao grupo © Markus Endler 11 Exemplos P1 P1 P2 P2 P1 entregou? Também entregarei! P3 P3 P1 tá fora! Oi! P1 entregou? Também entregarei! P4 P4 P1 entregou? Também entregarei! • Atomicidade não-uniforme • Atomicidade uniforme Entrega a mensagem © Markus Endler 12 O Protocolo “Flooding” Ideia central: • quando um membro do grupo recebe pela primeira vez uma nova mensagem, difunde esta mensagem para todos as demais membros e entrega a mensagem para a aplicação • Dado que cada mensagem tem uma identificação única (sender, seq_nr), cada processo sabe se já entregou a mesma para a aplicação Este protocolo não é eficiente, mas garante que em algum momento a mensagem será entregue por todos os processos ativos (desde o início do multicast). send(g,M): { m’.data = M; set m'.seq_nr = next_nr; set m'.sender = self; log.add(m.sender,m.seq_nr) forall i GroupMemList send(i,m'); } © Markus Endler When received(i,m) { if (notbefore(m.sender,m.seq_nr)) { log.add(m.sender,m.seq_nr) forall i GroupMemList send(i,m); deliver(m.data) } 13 Multicast como Transação (Commit em 2 Fases) Outra possibilidade é implementar o multicast como uma transação, que é confirmada ou abortada, por exemplo usando um 2-PhaseCommit Protocol (com coordenador fixo ou variável) Obs: Membros e coordenador guardam estado em memória não-volátil (disco) © Markus Endler 14 Multicast como Transação (Comit em 3 fases) Coord. Part A New m Fase I ack commit/abort Fase II ack free Fase III © Markus Endler • Na Fase I, após receber m, cada participante avisa que está pronto p/ entrega e guarda deliverOK & cópia de m Save copy • se coord. falhar após fase I ou II, outro membro assume o deliver papel de coordenador • Ao receber uma cópia de m, cada participante novamente Remove copy responde Assim, evita-se a espera indefinida pelo coordenador. Mas os participantes precisam eleger o novo coord. Part B 15 Problemas da Atomicidade Uniforme Multicast como Transação 2PC ou 3PC garantem atomicidade uniforme, mas... A garantia de atomicidade uniforme impõe restrições maiores do que são necessárias para muitas aplicações (p.ex. que apenas requerem a manutenção de estados sincronizados). Exemplo: • Quando um membro do grupo falha, não só deixará de receber algumas mensagens, como também não enviará OKs. Logo, impossibilitará que qualquer multicast seja commited (ausência de progresso) Em vez disto, o coordenador deveria remover o membro falho e prosseguir com o multicast para os demais processos ativos. • Para manter estados sincronizados, ao se recuperar de uma falha, bastaria que o processo fosse re-inicializado com o estado consistente dos demais membros ativos. Isto poderia ser feito solicitando o estado de um membro ativo, em vez de reprocessar todos os multicasts perdidos • Se o coordenador falha, todos os membros ficam bloqueados esperando este se recuperar (pelo menos no 2PC). © Markus Endler 18 Usando Causalidade para combinar 2PC e Flooding Se a relação causal entre mensagens puder ser verificada, é possível definir um protocolo para multicast que é uma combinação entre flooding e 2PC. Idéia central: (seja M um multicast e M.Dest a lista de destinatários) • Pf difunde M para todos Pi M.Dest • Pf e todos os processos que receberam M, mantém M em um buffer até que “obtenham uma confirmação de que M foi recebida por todos os P M.Dest” • Se Pk notar alguma mudança no grupo (p.ex. Falha), retransmite todas as mensagens no buffer para todos os Pi M.Dest • Em vez de esperar Acks diretos de todos os P M.Dest (como no 2PC) pode-se usar confirmações (ACKs) indiretas e transitivas: – Junto com cada mensagem de multicast, segue “de carona” (piggyback) um ACK relativo ao multicast mais recente recebido pelo remetente – Se um Pi descobre que deixou de receber um M (através do ACK vindo em um multicast N, ou seja M N), então Pi adiciona M a sua negAckList, e envia esta lista junto com futuros multicasts (solicitando assim o reenvio de M) © Markus Endler 19 Exemplo Sejam M.Dest = {A,B,C,D} • Processo A difunde a • Processo B difunde b+ack(a) • Processo C recebe a e b e depois difunde c+ack(b) • Processo D só recebe c+ack(b): • Caso não tenha recebido b, pede retransmissão e quando chegar b+ack(a) e não tiver recebido a, pede retransmissão de a • Através do recebimento de c+ack(b) e b+ack(a) D pode deduzir que: – C recebeu b // pois recebeu c+ack(b) – B recebeu a // pois recebeu b+ack(a) – C recebeu também a // pois senão C teria enviado // c+ack(b)+negAck(a) • Ou seja, multicast a foi recebido por todos portanto pode ser entregue à camada de aplicação e removida do buffer © Markus Endler 20 O Protocolo Transis O Protocolo Transis, proposto por Almir et al [ADKM92] se baseia na transitividade de confirmações. • Processo somente adiciona Ack(m) a um multicast m´ se tiver recebido m, e todas as mensagens causalmente precedentes a m. • A relação de dependência causal entre os multicasts é “descoberta” e registrada em um grafo direcionado por cada processo através das AckLists transmitidas em cada mensagem. • Cada processo mantém um grafo direcionado com as dependências causais das mensagens não estáveis (para eventual retransmissões) e para detectar mensagens não recebidas • Mensagens são sempre retransmitidas com a AckList original (negAckList não é retransmitida). Suposições do Modelo de sistema: – Mensagens possuem identificação (unívoca): (senderID, seqNr) – entrega de mensagem é FIFO – Cada mensagem carrega AckList, e possivelmente negAckList – Processos não falham, mas mensagens podem ser perdidas [ADKM92] Almir, Dolev, Kramer, Malki, Transis: A communication subsystem for high availability, Proc. 22th Intl. Symposium on Fault-Tolerant Computing, 76-84, July 92. © Markus Endler 21 O Protocolo Transis Variáveis em cada Processo: • Tipo MSG com campos – Data – Acks – NegAcks // mensagem da aplicação // acks // negAcks • • • • Undelivered // lista de mensagens ainda a entregar negAckList // lista de mensagens não recebidas AckList // lista de mensagens a confirmar G // Grafo direcionado com mensagens não estáveis (funciona como buffer) Funções que operam sobre o Grafo: • G.add(m) // insere m com lista de confirmações • G.Not_duplicate(m) // TRUE se m não esta contida em G • G.causal(m) // TRUE se todas as mensagens causalmente precedentes a m tiverem sido recebidas • G.stable(m) // TRUE se todos processos tiverem confirmado o recebimento de m © Markus Endler 22 Funcionamento do Transis no processo E 1. Recebeu: b+ack(a) 2. Recebeu: c+ack(b,d) a a b b AckList = {} negAckList ={a} c AckList = {} negAckList ={a,d} 3. Recebeu: a Entrega a e b 4. Processo E envia e+ack(b)+nack(d) Entrega e a a d b AckList = {b} negAckList ={d} © Markus Endler d c d b c e AckList = {e} negAckList ={d} OBS: Como c ainda não foi entregue, (c e) 23 O Protocolo Transis Trans_send(message) { M = new MSG; M.Data = message; for every n negAckList // lista das mensagens a serem retransmitidas M.NegAcks.add(n) for every a AckList { // lista das mensagens a serem confirmadas AckList.remove(a); M.Acks.add(a); } AckList.add(M); // proximas mensagens a serem confirmadas G.add(M); // adiciona própria mensagem no grafo for every p Dest send(p,M); } © Markus Endler 24 O Protocolo Transis When_received(M) => { for every n M.NegAcks if (n G) for every p Dest send(p,n); // retransmite mensagens solicitadas if G.NotDuplicate(M) { // se M ainda não estiver no grafo for every a M.Acks if (G.NotDuplicate(a)) negAckList.add(a) // detecta msgs ñ recebidas if (M negAckList) negAckList.remove(M); undelivered.add(M); // adiciona ao buffer M.negAckList.clear(); // limpa negAckList para armazenamento G.add(M); // procura todas mensagens K que já tenha tido todas as causalmente prec entregues while ( K, K undelivered G.causal(K)) { undelivered.remove(K); deliver Trans_recv (K.Data);} // entrega k AckList = {N G | G.causal(N) ( L (G.causal(L) L N.AckList) } // novo AckList apenas mensagens mais recentes N com causal(N) for every N G if G.stable(N) G.remove(N) } } © Markus Endler 25 Linha Causal e Estabilidade O predicado G.causal define uma região do grafo G contendo mensagens que podem ser entregues (região deliverable). • cada vez que uma mensagem M é recebida, esta é inicialmente colocada fora da região deliverable. • Se todas as mensagens em M.AckList estão dentro da região deliverable, então M é incluído na região e pode ser entregue à aplicação. • Se uma mensagem N dentro da região recebeu confirmações (diretas ou transitivas) de todos os membros, então ela é estável e pode ser removida de G. Portanto, a característica de progresso do algoritmo Transis se traduz no avanço sucessivo da borda da região deliverable no grafo G. © Markus Endler 26 Características do Protocolo Transis Note as seguintes características: • • • • Se uma mensagem multicast é entregue a um processo que não falha, então em algum momento esta mensagem será entregue a todos os processos não falhos Entrega de mensagens é em ordem causal Todos os processos estarão descobrindo o mesmo grafo G (que representa a relação causal entre as mensagens), mas devido a eventuais atrasos e a ordem distinta de mensagens concorrentes, a ordem em que esta descoberta do grafo G ocorre, difere de processo para processo. Problema: Se um processo falha, o grafo G em cada um dos processos aumenta sem parar, pois nenhuma msg será mais estável (podendo ser removida do Grafo) © Markus Endler 27 Ordenação Ordenação FIFO pode ser trivialmente incorporada a um multicast confiável: • Basta associar um nr de sequência para cada remetente e manter nos processos receptores um vetor contendo o próximo nr de sequência esperado de cada membro do grupo Ordenação Causal pode ser facilmente implementada: • adicionando-se vector time-stamps aos processos e mensagens (e fazendo a entrega conforme visto no início da disciplina) Ordenação Total: ?? Sincronia Virtual: ?? © Markus Endler 28 CG com Ordem Total Existem duas classes de algorítmos: • Baseado em sequenciador • Baseado em consenso Em ambos os casos: • mensagens recebidas são mantidas em um buffer até que se saiba a sua ordem de entrega, • Entrega-se as mensagens com o menor nr de sequência © Markus Endler 29 Ordem Total baseada em Sequenciador Sejam: • p,q processos do grupo G • Seq um processo singular (Sequenciador) e • id um identificador único de um multicast. Cada membro mantém um contador R (e Seq o contador F) Ideia central: • Todo membro p é inicializado com R=0 (e Seq com F=0) • Membro p difunde new(m, id) para q G • ao receber new(m,id), q armazena (m,i) em buffer • Quando Seq recebe new(m,id), este difunde mensagem order(id,F) e faz F++; • Ao receber order(i,O): – Enquanto ( (m,id) buffer O = R + 1) então { deliver(m); R++;} © Markus Endler 30 Ordem Total baseada em Sequenciador Exemplo: F=6 Seq P1 order(m1,6) new(m1) P2 P3 Armazena no buffer Define ordem total © Markus Endler Entrega a mensagem 31 Ordem Total baseada em Consenso Cada processo q G mantém dois contadores: • A: o maior nr sequência de observado em G • P: o maior nr. sequência proposto por q • fila de mensagens ordenadas pelo nr de sequencia proposto Algoritmo para um membro P de G: • P difunde new(m, id) para q G e coloca em uma fila de entrega local • ao receber new(m,id) de P, Q armazena (m,id) em buffer e envia para P a mensagem vote(id,Q,max(P,A)+1) com a sua proposta de nr sequencia para id • P coleta todas as respostas e escolhe o maior nr sequencia proposto A, e difunde a mensagem order(id, A) • Ao receber order(id,F) – Seta A = max(A, F) – Atribui F como nr de sequência definitivo à mensagem id, e reordena as mensagens na fila (com nr sequencias crescentes) – Pode entregar a mensagem (m,id,F) no início da fila quando: • F é nr-sequencia definitivo, e • Quando receber order(id2, X) onde X > F ou seja, F é o menor nr definitivo menor possível © Markus Endler 32 Ordem Total baseada em Consenso Exemplo: Envio concorrente de new(m2) e order(m1) P0 F=6 P=2 P=2 m2 vote(m2,2) m1 m1 order(m2,6) P1 P=4 P=5 F=6 F=5 m1 vote(m2,4) new(m2) P=4 P2 P3 order(m2,6) F=6 F=5 m1 order(m1,5) P=3 F=5 m1 m1 m1 m1 vote(m2,6) order(m2,6) F=6 m2 m1 Em P3 m1 só pode ser entregue, após receber order(m2) em buffer Entrega Define seq. definitiva © Markus Endler 33 Multicast Confiável com Falhas Note-se que nenhum dos algoritmos anteriores é tolerante a falhas. Em vez de bloquear o protocolo por causa de uma falha, é mais razoavel garantir a entrega da mensagem para todos os processos não falhos. Não garante atomicidade uniforme. Principal problema da abordagem: • é impossível manter uma visão perfeitamente sincronizada dos processos não falhos, Ou, em outras palavras, o que fazer se durante um multicast ocorre a falha do emissor? Alguns processos podem receber, a mensagem e outros não. Uma abordagem: definir checkpoints e garantir que: • para quaisquer processos que executam checkpoints seguidos CPa e CPb, estes receberão exatamente o mesmo conjunto de mensagens antes doCPb. • checkpoints devem ser executados sempre que houver uma mudança na configuração do grupo (mudança de visão). • Se algum processo não-falho eventualmente não tiver recebido todas as mensagens, outro processo ativo pode re-transmiti-las a partir de um log de mensagens recebidas entre os checkpoints Um Serviço de Pertinência a Grupos informa ao serviço de multicast sobre mudanças na configuração do grupo define a lista de destinatários para o multicast. Esta lista é garantidamente a mesma para todos os © Markus Endler 34 O Problema de Group Membership Trata-se de um problema de acordo sobre lista de processos membros em um grupo de processos cooperantes Problema: manter uma visão consistente (idêntica) dos membros ativos na presença de: • Falhas tipo fail-stop de processos • Entradas de processos no grupo • Saida de processos do grupo • Falhas na comunicação (perda de mensagens, partições de rede) O Objetivo do Group Membership Service (GMS) é manter a informação sobre os membros de G que satsifaça as seguintes propriedades: Ricciardi, Birman: Consistent Process Membershio in Asynchronous Environmente, apítulo 13 em Relible Distributed Computing with the Isis Toolkit, K. Birman R.v. Renesse, IEEE © Markus Endler 35 Propriedades Auto inclusão: Se processo p entra em grupo g, então p é membro de g. Acordo sobre visão do grupo: Se processo p e processo q juntam-se ao mesmo grupo g, então tanto p como p vêem os mesmos membros de g. Acordo sobre história do grupo: Todos os processos partilham a mesma história do grupo (sequência de visões) © Markus Endler 36 Serviço de Pertinência (Group Membership Service) Objetivo: • Fazer com que todos os processos ativos mantenham uma visão idêntica do conjunto atual de membros não-falhos. • A cada vez que o conjunto de membros muda, instala-se uma nova visão do grupo (evento view). Exemplo: V1={P1,P2} V2={P1,P2,P3} P1 P2 V3={P2,P3} Join(P3) P3 Rem(P1) Requisito: Todos os processos ativos no estabelecimento de uma nova visão vN devem concordar sobre os membros de vN. © Markus Endler 37 Group Membership Service • Cada instância do GMS executa um detector de falhas, que pode suspeitar da falha de um membro do grupo, f • Usa-se 2PC para avisar e recolher confirmações da maioria dos demais membros ativos. Seja C o processo que coordena o processo de mudança de visão. Qualquer processo pode suspeitar também da falha do coordenador C (e nesse caso inicia a eleição de novo coordenador) C Sub(-f) leave(f) Com(-f) P2 P3 Suspect(f) F Sub(-f) :: anuncia/propõe a remoção de f Com(-f):: acordo sobre remoção de f © Markus Endler 38 Group Membership Service • Quando um novo membro, H, deve ser incorporado (sugestão por algum processo que detectou atividade de H) o coordenador C envia também uma mensagem de transferência de estado para o novo membro, para que ele esteja sincronizado com o grupo. C Sub(+h) Com(+h) Join(+h) P2 P3 h is alive S-transf(g) h © Markus Endler Sub(+h) :: anuncia/propõe a inclusão de h Com(+h):: confirmação da inclusão de h S-transf (g) :: cópia do estado de g para h 39 Modelo de Sincronia Virtual (Virtual Synchrony Model) Sejam os eventos: mcast(g,m), deliver(m), e view(g) Intuitivamente: • Um sistema implementa sincronia virtual se os eventos que ocorrem localmente em cada processo parecem ocorrer simultaneamente em todos os processos do grupo. • Ou: A história real de ocorrência dos eventos é indistinguível (para a aplicação) da história de ocorrência simultânea dos eventos. Principal vantagem para a aplicação: não precisa se preocupar com concorrência entre multicasts e mudanças de visão (todos membros ativos terão visões consistentes da ordem relativa entre estes dois tipos de eventos) © Markus Endler 40 Modelo de Sincronia Virtual mb P1 ma P2 P3 md mc P4 Ordens de entrega: • P1/2: • P3: • P4: © Markus Endler del(ma); del(mb); del(mc);view(g); del(md) del(ma); del(mc); del(mb);view(g); del(md) view(g); del(md) 41 Virtual Synchrony Model Alguns sistemas de CG garantem a entrega de mensagens no grupo consistente com as mudanças de visão no grupo: A entrega de mensagens View Syncronous: • Todos os membros de um grupo recebem mensagens idênticas entre duas visões consecutivas de um grupo • Todas as mensagens são entregues na visão em que foram geradas • Ordem de entrega (dentro de uma visão) pode ser fifo, causal, ou total, mas não podem haver lacunas no recebimento de mensagens • requer um "protocolo flush" para que as mensagens das difusões inciadas sejam entregues antes da instalação da nova visão do grupo (esta é a mensagem de confirmação de mudança de visão). © Markus Endler 42 Flush Protocol • Usa-se as mensagens de confirmação (ack), para indicar quais mensagens naquela visão cada membro recebeu. • Coordenador compara as listas, e usa Com() para difundir a lista total de mensagens que precisam ser entregues antes do estabelecimento da nova visão. MsgsC C Sub(-f) leave(f) P2 Com(-f) + MsgsC MsgsP2 MsgsP3 MsgstP2 MsgstP3 MsgExchg P3 Suspect(f) F MsgExchg:: troca de mensagens que outro não recebeu © Markus Endler 43 Virtual Synchrony Model Características do Virtual Synchrony Model: • Todos os membros enxergam uma sequência identica de visões • Entrega de mensagens é segundo a ordem "view synchronous": os membros remanescentes do grupo recebem o mesmo conjunto de mensagens (sem omissões), de acordo com a ordenação (fifo ou causal) • Difusão de mensagens pode prosseguir em paralelo com a mudança de visão do grupo • Não garante consistência uniforme Vantagens: Muitas aplicações só requerem a consistência interna (atomicidade fraca): Ex: Escolha de um coordenador, coordenação no acesso a recursos compartlhados Muitas aplicações só requerem atomicidade com relação as falhas, que justamente é obtida através do Virtual Synchrony Model Virtual Synchronous Model é bem mais barato do que ordem total de entrega © Markus Endler 44 Arquiteturas de Sistemas de CG A maioria dos serviços de grupo consistem de módulos (mais ou menos explícitos) que implementam tarefas específicas. A tendência são arquiteturas de micro-protolos configuráveis. Atomic Multicast Recovery Membership +VS View Synchrony Atomic Multicast Failure Detect. Membership Membership Stability Unreliable FD Unreliable FD Reliable Comm. Isis Ensemble Totem ORB Membership TO Multicast Consensus Reliable Multicast Failure Detect. © Markus Endler Reliable Comm. OGS 45 Conclusão • Multicast Confiável tem sido usado em aplicações que requerem alto grau de confiabilidade e tolerância à falhas (redundância de hardware) • Suas abstrações facilitam muito a implementação de aplicações • O maior problema é a escalabilidade do serviço, especialmente quando o serviço garante sincronia virtual (ou ordenação total) • Os sistemas com maior sucesso foram os que apresentaram maior flexibilidade de configuração, podendo ser adaptadas aos requisitos específicos (desempenho, confiabilidade, numero de máquinas, etc.) de cada aplicação; Há duas tendências/alternativas: • Algoritmos probabilisticos para multicast, que: – dão garantias equivalentes às soluções deterministicas a um custo muito menor, e apresentam boa escalabilidade • Algoritmos de Gossiping – Difusão eventual e parcial de mensagens, alta latência, porém escalável © Markus Endler 46