Roteiro Gerenciamento de Grupo na Plataforma ISIS Apresentado por Antônio Carlos Theóphilo Costa Júnior Trabalho Relacionado Algoritmo de Gerenc. de Grupo ISIS Aspectos Gerais Características Vantagens Código Características Trabalho Relacionado Algoritmo Transis Vantagens Solução Elegante Geral Desvantagens Requer multicast em cada membro Depende do suporte dado pelo algoritmo Trans Algoritmo ISIS Proposto por Aleta Ricciardi e Kenneth Birman para realizar o Gerenciamento de Grupos na Plataforma ISIS. Projetado para ambientes de comunicação pontoa-ponto. Vantagens: Mais eficiente em ambientes aonde o multicast é implementado com mensagens ponto-a-ponto; Pode ser usado em ambientes sem multicast.
Algoritmo ISIS Características Gerais Paranóico Unidirecional (one-way) Fofoqueiro (gossipy) Supõe canais ponto-a-ponto confiáveis e FIFO Descarta mensagens de processos considerados faltosos Conceitos Coordenador Participante Reconfiguração Algoritmo ISIS Variáveis Utilizadas Abreviações L = Visão atual do grupo version = Versão de L change = Última mudança proposta a L rank = Nível do coordenador q propôs a mudança faulty = Lista de processos suspeitos remotestate[1..m] = Estados dos participantes remotestate[i].l = Visão do grupo por i remotestate[i].version = Versão da visão remotestate[i].rank = Nível do coordenador q implantou a visão remotestate[i].change = Mudança proposta por i send(dest, action, params) send(dest, action, params, faulty) action(sender, params) {código action(sender, params, remfaulty) faulty = faulty U remfaulty {código
Abreviações Operação Normal - Coordenador distribute(action; params) returnaction(sender; params) {código para cada p em {L - faulty send(p, action, params) //time-out de T segundos returnaction(sender, params) {código para cada p em {L - faulty que não respondeu faulty = faulty U {p normalcoordinator() { while (true) { espere até a ocorrência de uma mudança na visão do grupo distribute(coord_uddate; change, version + 1) CU_ACK(sender, version) version++ realiza as mudanças em L descritas em change distribute(cu_commit) CC_ACK(sender) Operação Normal - Participante normalparticipant() { while(true) { espere por uma msg do coordenador COORD_UPDATE(coordinator; chg, vrs): change = chg next_version = vrs rank = rank(coordinator) send(coordenador; CU_ACK) CU_COMMIT(coordinator): realizar a mudança descrita em change para L version = next_version change = { send(coordinator; CC_ACK) Reconfiguração Coordenador (1) reconfigurecoordinator() { mystate = (L, version, rank, {) distribute(interrogate; mystate) INT_RESPONSE(sender; rstate) remotestate[sender] = rstate ahead = {p p in L and remotestate[p].version > version current = {p p in L and remotestate[p].version = version
Reconfiguração Coordenador (2) if (ahead!= {) //existe uma visao mais atualizada comitada //deve-se propo-la else if (para todo p em current remotestate[p].change = {) //não existem mudancas comitadas else if (existe um valor p/ remotestate[p].change!={ em current) //uma proposta foi feita. Ela pode ter sido comitada. //Deve ser proposta else //existem propostas competindo para uma mudanca. A proposta proposta pelo reconfigurador com o menor rank e a unica q pode ter sido comitada Reconfiguração Coordenador (3) distribute(reord_update; change, nextversion) RU_ACK(sender) atualize L com change coordinator = self change = futureproposal executar o normalcoordinator Detalhamento (1) Detalhamento (2) //existe uma visao mais atualizada comitada //deve-se propo-la if(ahead!= {) change = remotestate[p].l para um p em ahead nextversion = version + 1 futureproposal = remotestate[p].change para um p em ahead tal que remotestate[p].rank seja minimo //não existem mudancas comitadas else if(remotestate[p].change = { p/ qq p em current) change = faulty //pelo menos o antigo coordenador nextversion = version +1 futureproposal = faulty
Detalhamento (3) Detalhamento (4) //uma proposta foi feita. Ela pode ter sido comitada. //Deve ser proposta else if(existe um unico valor!= { de remotestate[p].change para um p em current) change = remotestate[p].change para um p em current tal que change!= { nextversion = version +1 futureproposal = faulty //existem propostas competindo para uma mudanca. A proposta proposta pelo reconfigurador com o menor rank e a unica q pode ter sido comitada else() change = remotestate[p].change para um p em current tal que remotestate[p].rank seja minimo nextversion = version +1 futureproposal = faulty Reconfiguração Participante (1) reconfigureparticipant() { espere por uma msg INTERROGATE INTERROGATE(sender; sdrl, sdrversion, sdrrank, sdrchange) if(rank(self)>sdrrank) crash() if(version<sdrversion) L = sdrl version = sdrversion rank = sdrrank change = { send(sender, INT_RESPONSE; L, version, rank, change) espere T segundos por REORD_UPDATE REORD_UPDATE(sender; nextchange, nextversion) se não tiver havido resposta adicione sender a faulty e saia do procedimento Reconfiguração Participante (2) change = nextchange rank = ranksender send(sender; RU_ACK) espere T segundos por REORD_COMMIT REORD_COMMIT se não tiver havido resposta adicione sender a faulty e saia do procedimento se nextversion > version realize em L a mudança descrita em change version = nextversion coordinator = sender send(coordinator, RC_ACK)
Características (1) Características (2) coord p1 p2 r p p1 p2 p3 r update(x+1) commit(x+1) Um reconfigurador vê no máximo uma visão comitada de versão x+1 commit(x+1) Reconfiguradores competindo para instalar versões conflitantes r falhou update(x+2) p falhou interrogate/ update/ commit r falhou update(x+2) crash() commit(x+2) interrogate Resumo Vantagens Algoritmo ideal para ambientes de comunicação em grupo sem suporte nativo a multicast Útil em ambientes de grupo sem multicast Consistência mantida mesmo na presença simultânea de múltiplos coordenadores Desvantagens Complexidade Paranóia FIM Críticas/Dúvidas