• Nenhum resultado encontrado

Gestão de estado eficiente no serviço de coordenação DDS

N/A
N/A
Protected

Academic year: 2021

Share "Gestão de estado eficiente no serviço de coordenação DDS"

Copied!
81
0
0

Texto

(1)

U

NIVERSIDADE DE

L

ISBOA

Faculdade de Ciˆencias

Departamento de Inform´atica

GEST ˜

AO DE ESTADO EFICIENTE NO

SERVIC

¸ O DE COORDENAC

¸ ˜

AO DDS

Jo˜ao Lu´ıs Monteiro F´elix

DISSERTAC

¸ ˜

AO

MESTRADO EM INFORM ´

ATICA

(2)
(3)

U

NIVERSIDADE DE

L

ISBOA

Faculdade de Ciˆencias

Departamento de Inform´atica

GEST ˜

AO DE ESTADO EFICIENTE NO

SERVIC

¸ O DE COORDENAC

¸ ˜

AO DDS

Jo˜ao Lu´ıs Monteiro F´elix

DISSERTAC

¸ ˜

AO

Projecto orientado pelo Prof. Doutor Alysson Neves Bessani e co-orientado pelo Prof. Doutor Miguel Pupo Correia

MESTRADO EM INFORM ´

ATICA

(4)
(5)

Agradecimentos

Comec¸o por agradecer aos meus orientadores, Alysson Bessani e Miguel Correia. Por vezes foi complicado ver que os meus esforc¸os n˜ao estavam a produzir os resultados desejados, mas mesmo assim deram-me sempre forc¸a e ˆanimo para continuar a trabalhar. Um muit´ıssimo obrigado a eles os dois, pois sem eles este trabalho n˜ao teria sido poss´ıvel. Um muito obrigado a todos os meus amigos, nomeadamente `a Sofia, Andreia, Carme-lita, Miguel Pedras, Filipe, Marina, Mafalda Gomes, Marta Carvalho, Diogo Carvalho, V´ıtor Oliveira, e Rui Pires por todos estes bons anos de convivˆencia e de grandes aven-turas e mudanc¸as. Um especial obrigado ao Bruno Pombeiro por todas aquelas noitadas de muito trabalho e por todo o esforc¸o, amizade e dedicac¸˜ao no decorrer destes 5 anos. Tamb´em agradec¸o imenso ao Miguel Garcia pelas discuss˜oes, pelos conselhos e pela sua experiˆencia e trocas de ideias que deram sempre muito jeito. Quero agradecer tamb´em a todos os meus colegas investigadores dos Navigators, que se mostraram sempre dis-pon´ıveis a ajudar quando e no que foi preciso.

Em ´ultimo lugar, n˜ao poderia deixar de agradecer `a minha querida Mafalda, pelo seu amor, amizade, pela confianc¸a e inspirac¸˜ao que me transmite e por me fazer sorrir todos os dias.

Como filho que sou, quero naturalmente agradecer aos meus pais por tudo o que sem-pre fizeram por mim. Obrigado pela educac¸˜ao que me deram, pelos sacrif´ıcios que eu sei que fizeram para que nunca me faltasse nada. A verdade ´e que conseguiram atin-gir esse objectivo e estou-vos eternamente gratos pela qualidade de vida que sempre me proporcionaram.

E como uma fam´ılia tem mais membros para al´em dos pais, um muito obrigado `a minha querida av´o “B´a” por toda a sua energia, positivismo, imensa sabedoria e invulgar, mas muito apreciada mundialmente, habilidade culin´aria. N˜ao posso agradecer aqui `a fam´ılia toda membro a membro, por isso, um muito obrigado a todos os outros, em espe-cial `a minha prima Saeda e `a minha tia Beatriz. A secc¸˜ao familiar dos agradecimentos ´e conclu´ıda com um imenso obrigado `a fam´ılia Bernardo, que me albergou durante os meus primeiros dias de mudanc¸a para Lisboa e sempre se preocuparam comigo.

Um muito obrigado `a FCT, que financiou este projecto e acreditou no seu valor para a comunidade cient´ıfica.

(6)
(7)
(8)
(9)

Resumo

Durante alguns anos, os servic¸os de coordenac¸˜ao utilizaram protocolos de replicac¸˜ao de informac¸˜ao entre as suas r´eplicas que seguiram o modelo de faltas por paragem (crash). Assim, estes servic¸os toleravam at´e f faltas simultˆaneas de r´eplicas, desde que fosse ga-rantido que um conjunto de f +1 r´eplicas continuavam o seu bom funcionamento. Por´em, este modelo ´e simples de quebrar porque apenas considera que uma r´eplica apresenta um estado incorrecto se esta deixar de participar no protocolo.

Mais tarde, surgiram os primeiros servic¸os a seguir o modelo de faltas arbitr´arias, ou bizantinas. Este novo modelo sugere a adopc¸˜ao de 3f +1 r´eplicas para que se possa tolerar at´e f r´eplicas faltosas. Para al´em disso, o servic¸o precisa ainda de manter a durabilidade dos seus dados, para ser poss´ıvel recuperar de falhas gerais, i.e., de falhas que afectam todas as r´eplicas do servic¸o.

Existem j´a servic¸os que garantem essa durabilidade dos dados, `a custa de perda de desempenho do sistema, pois uma operac¸˜ao tem ser escrita para um local seguro antes de ser enviada uma resposta ao cliente que a efectuou. Esta perda de desempenho afecta a disponibilidade e escalabilidade do sistema, pelo que deve ser minimizada atrav´es da optimizac¸˜ao das t´ecnicas que garantem a persistˆencia dos dados.

Este projecto tem como objectivo melhorar o DepSpace com uma camada que garante a durabilidade dos dados sem que o desempenho do sistema seja afectado em demasia e ainda um protocolo de recuperac¸˜ao do estado do servic¸o, de forma a ser poss´ıvel recuperar de falhas gerais no sistema. O DepSpace ´e um sistema de coordenac¸˜ao tolerante a faltas arbitr´arias baseado num espac¸o de tuplos, constru´ıdo no LaSIGE. A durabilidade dos dados vai ser garantida atrav´es de mecanismos como o logging de operac¸˜oes, aumentando a fiabilidade do sistema.

Palavras-chave: DepSpace, Tolerˆancia a faltas bizantinas, Durabilidade, Logging paralelo, Checkpoints.

(10)
(11)

Abstract

For many years, information services replicated information among their replicas us-ing crash fault tolerant (or CFT ) protocols. The CFT model makes those systems tolerate up to f replicas crash faults if at least f + 1 other replicas are alive to keep the service running. Nevertheless, it is simple to break these protocols and make more than f + 1 replicas crash simultaneously, making the service unavailable.

Some years later, the first services using a Byantine fault tolerant (or BFT ) model were created. Protocols that follow this model tolerate Byzantine, meaning arbitrary, faults. This new model requires at least 3f + 1 replicas to tolerate up to f Byzantine faults. Furthermore, BFT services need to guarantee their data durability, in order to provide methods to recover the system from total failures, where all the services’ replicas fail by crashing.

Some modern services already guarantee their data durability. However, in order to do that, they lose some performance due to the fact that an operation needs to be written to stable storage before it is committed to the client who performed it. This performance loss affects both the system’s availability and scalability, and that is why it should be reduced through the optimization of the durability techniques used to stable store the operations.

The goal of this project is to enhance the DepSpace service with a durability layer that enforces the clients’ operations to be stable stored without having much impact on the system’s performance and also with a recovery protocol that recovers the system from total failures. DepSpace is a coordination service built that tolerates Byzantine faults that was built in LaSIGE. The data durability is going to be guaranteed through the use of mechanisms such as operations logging, which increases the system reliability.

Keywords: DepSpace, Byzantine-fault tolerance, Durability, Parallel logging, Checkpoints.

(12)
(13)

Conte ´udo

Lista de Figuras xv

Lista de Tabelas xvii

1 Introduc¸˜ao 1 1.1 Motivac¸˜ao . . . 2 1.2 Objectivos . . . 2 1.3 Estrutura do documento . . . 3 2 Trabalhos relacionados 5 2.1 Replicac¸˜ao BFT . . . 5 2.1.1 PBFT . . . 6 2.1.2 UpRight . . . 8 2.1.3 BFT-SMaRt . . . 9 2.1.4 Outros protocolos BFT . . . 9 2.2 Servic¸os de coordenac¸˜ao . . . 10 2.2.1 Chubby . . . 11 2.2.2 Sinfonia . . . 12 2.2.3 ZooKeeper . . . 14 2.2.4 DepSpace . . . 16

2.3 Durabilidade de dados e recuperac¸˜ao de estado . . . 17

2.3.1 Armazenamento est´avel, checkpoints e logs . . . 18

2.3.2 ARIES . . . 22 2.3.3 Gaios . . . 22 2.3.4 Recuperac¸˜ao proactiva . . . 23 2.4 Considerac¸˜oes finais . . . 24 3 DDS – Durable DepSpace 25 3.1 Arquitectura . . . 25 3.2 Durabilidade no DDS . . . 26 3.2.1 Loggingde mensagens . . . 26 3.2.2 Checkpointing . . . 30 xi

(14)

3.2.3 Modelo de dados . . . 31

3.3 Gest˜ao de estado . . . 31

3.3.1 Transferˆencia de estado . . . 32

3.3.2 Sincronizac¸˜ao de estados iniciais . . . 32

3.4 Melhorias no DepSpace . . . 34

3.4.1 Paralelizac¸˜ao de operac¸˜oes nos diversos espac¸os de tuplos . . . . 34

3.4.2 Optimizac¸˜ao das operac¸˜oes de leitura e remoc¸˜ao de tuplos . . . . 35

3.4.3 Locking . . . 37

3.5 Considerac¸˜oes finais . . . 38

4 Avaliac¸˜ao 39 4.1 Ambiente experimental . . . 39

4.2 Custo do armazenamento em disco . . . 40

4.3 Microbenchmarkssem replicac¸˜ao . . . 42

4.3.1 Avaliac¸˜ao das concretizac¸˜oes do espac¸o de tuplos . . . 43

4.3.2 DDS vs DepSpace . . . 44

4.3.3 Logging& Checkpointing . . . 45

4.4 Desempenho do DDS . . . 46

4.4.1 100% de inserc¸˜oes de tuplos . . . 47

4.4.2 100% de remoc¸˜oes de tuplos . . . 48

4.4.3 100% de leituras de tuplos . . . 49

4.4.4 50% inserc¸˜oes e 50% remoc¸˜oes de tuplos . . . 49

4.4.5 80% leituras, 10% inserc¸˜oes e 10% remoc¸˜oes de tuplos . . . 51

4.5 Recuperac¸˜ao no DDS . . . 52 4.6 Considerac¸˜oes finais . . . 54 5 Conclus˜ao 55 Abreviaturas 58 Bibliografia 62 ´Indice 63 xii

(15)
(16)
(17)

Lista de Figuras

2.1 Protocolo de trˆes fases do PBFT [24]. . . 7

2.2 Arquitectura da UpRight [13]. . . 8

2.3 Servic¸o de coordenac¸˜ao vs Servic¸o de comunicac¸˜ao em grupo [35]. . . 10

2.4 Arquitectura do Chubby [11]. . . 12

2.5 Arquitectura do Sinfonia [2]. . . 13

2.6 Execuc¸˜ao de operac¸˜oes de escrita e de leitura no ZooKeeper [20]. . . 15

2.7 Recuperac¸˜ao para tr´as vs Recuperac¸˜ao para a frente. . . 18

2.8 Loggingoptimista [44]. . . 21

3.1 Arquitectura do DDS. . . 27

3.2 Execuc¸˜ao de operac¸˜oes, ordenadas e n˜ao ordenadas, no DDS. . . 28

3.3 Loggingde operac¸˜oes s´ıncrono (`a esquerda) e paralelo (`a direita). . . 30

3.4 Execuc¸˜ao s´ıncrona (`a esquerda) e paralela (`a direita) de operac¸˜oes nos diversos espac¸os de tuplos do DepSpace. . . 35

3.5 Espac¸o de tuplos com ´ındices. . . 36

4.1 Resultados das experiˆencias no DepSpace e no DDS sem a camada de replicac¸˜ao. . . 45

4.2 Resultados das experiˆencias efectuadas com as camadas de logging e checkpointingdo DDS. . . 46

4.3 Resultados do DepSpace e do DDS com 100% de inserc¸˜oes de tuplos. . . 48

4.4 Resultados do DepSpace e do DDS com 100% de remoc¸˜oes de tuplos. . . 49

4.5 Resultados do DepSpace e do DDS com 100% de leituras de tuplos. . . . 50

4.6 Resultados do DepSpace e do DDS com 50% de inserc¸˜oes e 50% de remoc¸˜oes de tuplos. . . 50

4.7 Resultados do DepSpace e do DDS com 80% de leituras, 10% de inserc¸˜oes e 10% de remoc¸˜oes de tuplos. . . 51

4.8 Comparac¸˜ao dos resultados do DDS com moderate e extreme locking. . . 52

4.9 Latˆencias das recuperac¸˜oes de estado do DDS. . . 53

(18)
(19)

Lista de Tabelas

4.1 Latˆencia das escritas para o disco da Workstation. . . 41 4.2 Latˆencia das escritas para o disco da Servidor. . . 41 4.3 Latˆencias das operac¸˜oes out com o processamento de batches de

diferen-tes tamanhos no DepSpace e no DDS com diferendiferen-tes concretizac¸˜oes dos espac¸os de tuplos. . . 44 4.4 Latˆencias das operac¸˜oes inp com o processamento de batches de

diferen-tes tamanhos no DepSpace e no DDS com diferendiferen-tes concretizac¸˜oes dos espac¸os de tuplos. . . 44

(20)
(21)

Cap´ıtulo 1

Introduc¸˜ao

Um sistema distribu´ıdo ´e composto por processos que comunicam atrav´es de uma rede. Estes processos podem comunicar entre si atrav´es de m´etodos como a troca expl´ıcita de mensagens ou o acesso a recursos partilhados. Para al´em de comunicarem, existem situac¸˜oes em que os processos precisam de se coordenar entre si, de forma a que, por exemplo, possam controlar o acesso a recursos partilhados (p.ex., atrav´es de exclus˜ao m´utua).

Um servic¸o de coordenac¸˜ao ´e um servic¸o que permite manter informac¸˜oes de con-trolo e configurac¸˜ao e realizar sincronizac¸˜ao distribu´ıda em aplicac¸˜oes distribu´ıdas. Estes servic¸os apresentam uma forma de retirar ao programador a responsabilidade de coorde-nar os processos, dando espac¸o para que este se foque no desenvolvimento da aplicac¸˜ao propriamente dita, reduzindo consideravelmente o esforc¸o e as linhas de c´odigo necess´arias.

Existem diversos servic¸os de coordenac¸˜ao, comerciais, abertos e de investigac¸˜ao, como por exemplo o GigaSpace [18], ZooKeeper [20], Chubby [11], Sinfonia [2] e DepS-pace [5]. Estes servic¸os diferem em v´arios aspectos, entre os quais o modelo de dados que suportam (p.ex., sistema de ficheiros ou espac¸os de tuplos). Apesar das suas diferenc¸as, o prop´osito ´e sempre o mesmo: disponibilizar uma abstracc¸˜ao de coordenac¸˜ao que simpli-fique a programac¸˜ao de mecanismos como a eleic¸˜ao de um l´ıder ou o consenso.

Sendo o objectivo destes servic¸os suportar aplicac¸˜oes distribu´ıdas, dois dos seus re-quisitos fundamentais s˜ao a fiabilidade e a disponibilidade. Por isso, geralmente os servi-dores que implementam esses servic¸os s˜ao replicados, usando replicac¸˜ao de m´aquinas de estados [37] ou t´ecnicas similares.

Al´em da fiabilidade e disponibilidade, algumas aplicac¸˜oes distribu´ıdas requerem que o servic¸o garanta a durabilidade dos dados, ou seja, que estes sejam recuper´aveis caso acontec¸a uma falha generalizada (p.ex., a paragem de todo um centro de dados devido a uma quebra prolongada de energia) ou a reinicializac¸˜ao do sistema por parte dos seus administradores. No entanto, garantir a durabilidade dos dados aumenta a latˆencia das operac¸˜oes dos clientes e reduz o d´ebito do servic¸o [29]. Tanto quanto ´e do nosso conheci-mento, nenhuma das publicac¸˜oes sobre servic¸o de coordenac¸˜ao faz referˆencia ao impacto

(22)

Cap´ıtulo 1. Introduc¸˜ao 2

da durabilidade no desempenho do servic¸o.

Quando uma r´eplica de um servic¸o falha, ´e reinicializada e tem de recuperar o seu estado. Esta recuperac¸˜ao pode ser feita atrav´es da rede recorrendo `as demais r´eplicas ou a partir do disco. Apesar de v´arios dos servic¸o de coordenac¸˜ao descritos na literatura oferecerem este tipo de durabilidade dos dados, apenas o Sinfonia [2] tem em conta uma falha total do sistema, na qual todas as r´eplicas falham e reiniciam o seu estado a partir do disco. No entanto, o protocolo utilizado ´e referido de uma forma muito sucinta e pouco clara.

Esta tese tem como objectivo melhorar o DepSpace atrav´es da implementac¸˜ao da du-rabilidade dos seus dados. O DepSpace ´e um sistema de coordenac¸˜ao tolerante a faltas ar-bitr´arias baseado num espac¸o de tuplos, que tem como foco principal a confidencialidade dos dados guardados. A introduc¸˜ao da durabilidade dos dados vai aumentar a fiabilidade do sistema e vai ser garantida atrav´es de mecanismos como o logging de operac¸˜oes. De forma a recuperar de falhas totais do sistema, o servic¸o deve ter tamb´em um protocolo de recuperac¸˜ao de estado que permite `as suas r´eplicas trocarem os seus estados entre si e recuperar o estado que tinham antes de a falha acontecer.

1.1

Motivac¸˜ao

Como foi referido na secc¸˜ao anterior, a durabilidade dos dados ´e vital para que os sistemas tolerem qualquer tipo de faltas que possam ocorrer.

Normalmente, garantir a durabilidade de dados implica um aumento das latˆencias das operac¸˜oes efectuadas no sistema, o que se traduz numa perda de desempenho consi-der´avel.

Com este projecto pretende-se desenvolver o Durable DepSpace, ou DDS, uma ex-tens˜ao do DepSpace que garante a durabilidade dos dados e que mant´em o seu desem-penho muito pr´oximo do original (i.e., muito pr´oximo do seu desemdesem-penho sem durabi-lidade dos dados). A persistˆencia dos dados permite ainda desenvolver protocolos de recuperac¸˜ao para que o sistema consiga continuar a sua execuc¸˜ao normal mesmo na existˆencia de faltas.

1.2

Objectivos

O REGENESYS, projecto em que esta tese se enquadra, tem como objectivo o estudo, desenvolvimento e avaliac¸˜ao de sistemas distribu´ıdos que consigam lidar com faltas aci-dentais (p.ex., falha de um servidor) e faltas maliciosas (p.ex., intrus˜oes no sistema).

Este projecto tem como principal prop´osito o desenvolvimento e avaliac¸˜ao do DDS, um sistema que garante a durabilidade dos dados dos processos clientes sem comprometer significativamente o seu desempenho.

(23)

Cap´ıtulo 1. Introduc¸˜ao 3

Assim, esta dissertac¸˜ao tem como objectivos:

• Apresentar de um mecanismo de persistˆencia de dados optimizado para diminuir o impacto das escritas para disco na latˆencia das operac¸˜oes;

• Introduzir de um protocolo de sincronizac¸˜ao de estados iniciais das r´eplicas para a recuperac¸˜ao de falhas totais do sistema.

O trabalho realizado teve ainda direito `a publicac¸˜ao do artigo:

• J.F´elix, A. Bessani, M. Correia, “Gest˜ao de Estado Eficiente no DDS”, em INFo-rum’12: Simp´osio de Inform´atica, Caparica, 2012.

1.3

Estrutura do documento

Este documento est´a organizado da seguinte forma:

• Cap´ıtulo 2 – Trabalho relacionado: Introduc¸˜ao a alguns trabalhos existentes que est˜ao relacionados com este projecto;

• Cap´ıtulo 3 – DDS: Apresentac¸˜ao e explicac¸˜ao do trabalho efectuado;

• Cap´ıtulo 4 – Avaliac¸˜ao: Apresentac¸˜ao das experiˆencias feitas com o DDS e dos respectivos resultados;

(24)
(25)

Cap´ıtulo 2

Trabalhos relacionados

Este cap´ıtulo apresenta os temas que s˜ao relevantes para o desenvolvimento do nosso trabalho. Apresentamos v´arios trabalhos existentes na literatura que est˜ao relacionados com o trabalho apresentado nesta dissertac¸˜ao e que n˜ao podem deixar de ser referenciados devido `a sua importˆancia.

Os temas abordados s˜ao: servic¸os de coordenac¸˜ao, protocolos tolerantes a faltas bi-zantinas (ou BFT, de Byzantine Fault-Tolerant), t´ecnicas para garantir a durabilidade de dados e protocolos de recuperac¸˜ao proactiva.

2.1

Replicac¸˜ao BFT

Num sistema cliente / servidor, um cliente envia operac¸˜oes a um servidor, que as executa e devolve os respectivos resultados de volta ao cliente. Se este o servidor for constru´ıdo por apenas uma m´aquina, uma falta nessa m´aquina faz o sistema falhar por completo.

Para colmatar esta falha, os sistemas distribu´ıdos actuais utilizam t´ecnicas, como a replicac¸˜ao de m´aquinas de estados [37], que permitem a interligac¸˜ao de v´arias m´aquinas servidoras, ou r´eplicas, que replicam a execuc¸˜ao do servic¸o. Esta replicac¸˜ao aumenta a fiabilidade do sistema, dado que uma falta numa r´eplica n˜ao implica a falha total do sistema, pois as restantes r´eplicas n˜ao afectadas por essa falta conseguem continuar a sua normal execuc¸˜ao.

Os protocolos de replicac¸˜ao seguem dois modelos distintos: o modelo tolerante a faltas por paragem, ou modelo CFT (Crash Fault-Tolerant) e modelo tolerante a faltas bizantinas, ou modelo BFT (Byzantine-Fault Tolerant). O primeiro modelo dita que o sistema deve utilizar n ≥ 2f + 1 r´eplicas para conseguir tolerar at´e f faltas por paragem (i.e., at´e f r´eplicas do sistema podem estar paradas / desligadas). No entanto, este modelo n˜ao assume a existˆencia de potenciais faltas nas r´eplicas que as fac¸am executar incorrec-tamente como, por exemplo, uma intrus˜ao maliciosa que controle uma r´eplica e a fac¸a enviar mensagens erradas para os clientes.

O modelo BFT vem colmatar esta falha, adicionando f r´eplicas `as 2f + 1, propostas

(26)

Cap´ıtulo 2. Trabalhos relacionados 6

pelo modelo CFT, de forma a conseguir tolerar at´e f faltas arbitr´arias, ou seja, at´e f fal-tas de qualquer tipo. Este modelo ´e cada vez mais utilizado na construc¸˜ao de servic¸os, nomeadamente de servic¸os de coordenac¸˜ao, devido aos benef´ıcios que introduz na dispo-nibilidade e fiabilidade dos mesmos.

Esta secc¸˜ao apresenta v´arios protocolos existentes que oferecem este tipo de replicac¸˜ao com tolerˆancia a faltas bizantinas, incluindo a BFT-SMaRt [41], a biblioteca utilizada para a replicac¸˜ao do servic¸o desenvolvido nesta tese.

2.1.1

PBFT

O PBFT [24], ou “Practical Byzantine Fault Tolerance”, ´e um protocolo BFT baseado no modelo de replicac¸˜ao de m´aquinas de estado [37] e que assumem a existˆencia de ligac¸˜oes fi´aveis ponto a ponto e de um modelo parcialmente s´ıncrono [16]. Num modelo de replicac¸˜ao de m´aquinas de estados, o estado de um servic¸o ´e replicado por um conjunto de m´aquinas, denominadas r´eplicas do servic¸o. Assim, os clientes executam operac¸˜oes sobre essas r´eplicas, modificando os seus estados sincronizadamente. Para que isto seja poss´ıvel, todas as r´eplicas devem iniciar com o mesmo estado e tˆem de executar todas as operac¸˜oes pela mesma ordem, utilizando um algoritmo de difus˜ao at´omica. Para al´em disso, as operac¸˜oes executadas devem ser deterministas, de modo a que a sua execuc¸˜ao fac¸a as r´eplicas avanc¸arem para o mesmo estado, mantendo a consistˆencia do sistema.

O PBFT garante as propriedades de disponibilidade e confiabilidade do servic¸o desde que existam no m´aximo f r´eplicas faltosas. Por´em, para tolerar faltas bizantinas, s˜ao necess´arias 3f + 1 r´eplicas.

Figura 2.1: Protocolo de trˆes fases do PBFT [24].

Para que um advers´ario n˜ao seja capaz de adulterar o protocolo (p.ex., atrav´es da reordenac¸˜ao de mensagens), o PBFT utiliza uma r´eplica prim´aria, encarregue, por exem-plo, da ordenac¸˜ao das mensagens dos clientes. Mesmo assim, a r´eplica prim´aria pode ser faltosa e por isso o protocolo deve ser capaz de lidar com esse problema.

Isto ´e feito atrav´es da adic¸˜ao de uma fase extra, a fase pre-prepare no in´ıcio do pro-tocolo de duas fases, como mostra a figura 2.1. Nesta fase adicional, a r´eplica prim´aria

(27)

Cap´ıtulo 2. Trabalhos relacionados 7

recebe uma nova operac¸˜ao de um cliente e envia uma mensagem PREPREPARE`as restan-tes r´eplicas. Ao receber essa mensagem, as r´eplicas adicionam-na ao seu log e enviam uma mensagem PREPARE `as outras r´eplicas. Quando uma r´eplica recebe 2f + 1 mensa-gens PREPAREde outras r´eplicas, referente `a mesma mensagem de um cliente, envia uma

mensagem COMMIT a todas as r´eplicas. Ao receber 2f + 1 mensagens COMMIT para uma mesma mensagem de um cliente, uma r´eplica entrega essa mensagem do cliente `a aplicac¸˜ao. Ap´os o seu processamento, o resultado de cada operac¸˜ao ´e enviado de volta ao cliente que a invocou.

Para ser poss´ıvel tolerar faltas na r´eplica l´ıder sem comprometer a execuc¸˜ao do pro-tocolo, o PBFT permite que diferentes r´eplicas assumam o papel de r´eplica l´ıder. Assim, o protocolo utiliza o conceito de vistas. Em cada vista existe a eleic¸˜ao de uma nova r´eplica l´ıder. Caso a r´eplica l´ıder apresente um comportamento malicioso, as r´eplicas ini-ciam uma mudanc¸a de vista para que uma nova r´eplica l´ıder seja eleita. O problema da utilizac¸˜ao de vistas num ambiente bizantino ´e perceber quais as operac¸˜oes que devem fa-zer parte da pr´oxima vista. Assim, todas as operac¸˜oes que tenham sido executadas numa r´eplica correcta tˆem de prosseguir para a vista seguinte pela mesma ordem em que foram processadas. ´E por isto que uma r´eplica correcta apenas executa uma operac¸˜ao depois de receber 2f + 1 mensagens COMMITde outras r´eplicas.

´

E poss´ıvel que apenas uma r´eplica correcta participe no protocolo de troca de vista, fazendo com que r´eplicas faltosas possam tamb´em participar e apresentar mensagens inv´alidas como sendo correctas. Este problema ´e resolvido atrav´es de certificados, cada um contendo as mensagens assinadas por 2f +1 r´eplicas referentes a uma mesma requisic¸˜ao de um cliente. Como as mensagens est˜ao assinadas com as chaves criptogr´aficas p´ublicas de cada r´eplica, as restantes r´eplicas podem verificar a validade de cada mensagem, vali-dando ou n˜ao o certificado.

Relativamente ao n´umero de mensagens trocadas, o PBFT ´e um protocolo significa-tivamente pesado. Para diminuir o tr´afego de mensagens, o protocolo recorre ao agrupa-mento (batching) de mensagens. Com isto, o protocolo ordena um n´umero de mensagens de uma s´o vez, ao inv´es de uma mensagem por execuc¸˜ao. Isto reduz o tempo de execuc¸˜ao do protocolo sem afectar a latˆencia das operac¸˜oes dos clientes.

2.1.2

UpRight

A biblioteca de replicac¸˜ao de m´aquinas de estados UpRight [13] foi desenhada de forma a oferecer tolerˆancia a faltas bizantinas a servic¸os CFT, aumentando a sua robustez. A UpRight foi implementada de forma a que a sua integrac¸˜ao num sistema n˜ao implique grandes esforc¸os de engenharia ou alterac¸˜oes de hardware.

Para que seja simples de integrar num servic¸o CFT, a UpRight isola a aplicac¸˜ao e o protocolo de replicac¸˜ao de m´aquinas de estado [37].

(28)

Cap´ıtulo 2. Trabalhos relacionados 8

shimda UpRight atrav´es da camada glue, que serve de middleware entre a aplicac¸˜ao CFT e o protocolo da UpRight. A camada shim ´e comum a todas as aplicac¸˜oes que utilizem esta biblioteca, sendo a camada respons´avel pela comunicac¸˜ao entre as diversas partes do sistema.

Figura 2.2: Arquitectura da UpRight [13].

A UpRight permite `as r´eplicas do servidor criarem logs e checkpoints dos seus esta-dos. No caso dos checkpoints, s˜ao oferecidas v´arias formas de os criar, como atrav´es da t´ecnica copy-on-write, ou atrav´es de um processo secund´ario. Para al´em disso, esta bibli-oteca permite tamb´em a execuc¸˜ao de operac¸˜oes de leitura sem que seja necess´aria a sua ordenac¸˜ao (como no PBFT [24]), processamento paralelo de v´arios pedidos de clientes.

2.1.3

BFT-SMaRt

A BFT-SMaRt1 [41] ´e uma biblioteca de replicac¸˜ao que implementa um protocolo si-milar ao no PBFT e que foi desenvolvida no LaSIGE. As principais diferenc¸as para o PBFT s˜ao a modularidade dos seus protocolos e ainda a n˜ao implementac¸˜ao de algumas optimizac¸˜oes que adicionam complexidade ao c´odigo.

Esta biblioteca BFT ´e completamente reconfigur´avel, para permitir uma f´acil adaptac¸˜ao `as diferentes necessidades dos sistemas, e foi desenvolvida na linguagem de programac¸˜ao Javapara evitar a existˆencia de vulnerabilidades comuns a linguagens de mais baixo n´ıvel (p.ex., buffer overflows em C). A sua implementac¸˜ao tem qualidade suficiente para ser usada em prot´otipos robustos de sistemas tolerantes a faltas e intrus˜oes.

Existem trˆes protocolos que comp˜oe esta biblioteca: ordenac¸˜ao de mensagens, eleic¸˜ao de l´ıder e transferˆencia de estados. O protocolo de ordenac¸˜ao de mensagens ´e semelhante ao apresentado anteriormente no PBFT.

(29)

Cap´ıtulo 2. Trabalhos relacionados 9

Se a r´eplica l´ıder for faltosa (p.ex., n˜ao envia uma mensagem de um cliente para, pelo menos, n+f2 r´eplicas), ´e activado o protocolo de eleic¸˜ao de l´ıder. O protocolo tamb´em ser´a activado no caso de a execuc¸˜ao normal da ordenac¸˜ao de mensagens n˜ao terminar num per´ıodo de tempo predefinido.

Quando uma r´eplica verifica alguma das anteriores condic¸˜oes, envia uma mensagem “STOP” a todas as r´eplicas. Ao receber 2f + 1 mensagens “STOP”, inicia-se a troca de l´ıder, sendo que o identificador da nova r´eplica ´e calculado deterministicamente. Ap´os a eleic¸˜ao do l´ıder, todas as r´eplicas enviam o seu respectivo log e mensagens pendentes `a nova r´eplica l´ıder. No caso de existirem r´eplicas atrasadas durante o protocolo de eleic¸˜ao de l´ıder, estas executam o protocolo de transferˆencia de estados para se actualizarem.

O protocolo de transferˆencia de estados permite que r´eplicas atrasadas se actualizem mais rapidamente e ´e ainda utilizado na recuperac¸˜ao de estados das r´eplicas faltosas. A sua execuc¸˜ao inicia-se com uma r´eplica a pedir o estado mais actual das restantes r´eplicas. Em resposta, as r´eplicas enviam os seus estados as respectivas estampilhas temporais. Na recepc¸˜ao de f + 1 respostas semelhantes, a r´eplica que iniciou o protocolo actualiza o seu estado e retorna `a sua execuc¸˜ao normal.

2.1.4

Outros protocolos BFT

Existem outros protocolos de replicac¸˜ao na literatura como, por exemplo, o Zyzziva [21], HQ [15], Q/U [1], Spinning [46] e o Aardvark [14]. No entanto, as suas concretizac¸˜oes n˜ao s˜ao suficientemente est´aveis para serem usadas na construc¸˜ao de servic¸os confi´aveis.

2.2

Servic¸os de coordenac¸˜ao

Os servic¸os de coordenac¸˜ao, tal como o nome indica, tˆem como func¸˜ao coordenar um conjunto de processos. Para isso, estes servic¸os oferecem abstracc¸˜oes suficientemente fortes que permitem aos processos, por exemplo, eleger um processo l´ıder, de forma de-terminista.

A figura 2.3, mostra as diferenc¸as entre um servic¸o de coordenac¸˜ao e um servic¸o de comunicac¸˜ao em grupo. Um servic¸o de comunicac¸˜ao em grupo consiste numa abstracc¸˜ao em que um participante envia uma mensagem e todos os membros do grupo a recebem (s˜ao suportadas diferentes qualidades de servic¸o). Um servic¸o de coordenac¸˜ao oferece abstracc¸˜oes fortes o suficiente para que processos possam, de forma determinista, par-tilhar estado, eleger um l´ıder, verificar quantos processos est˜ao ligados ao servic¸o e at´e concretizar comunicac¸˜ao em grupo.

Estes servic¸os s˜ao maioritariamente usados para que os processos consigam manter informac¸˜oes de configurac¸˜ao do sistema, podendo acedˆe-los e modific´a-los de uma forma simples e segura. Para al´em disso, os servic¸os de coordenac¸˜ao conseguem resolver o

(30)

Cap´ıtulo 2. Trabalhos relacionados 10

Figura 2.3: Servic¸o de coordenac¸˜ao vs Servic¸o de comunicac¸˜ao em grupo [35].

problema do consenso, o que permite a implementac¸˜ao de protocolos de eleic¸˜ao de l´ıder e de difus˜ao de mensagens com ordem total.

Nesta secc¸˜ao apresentamos alguns servic¸os de coordenac¸˜ao existentes, e comparamos as suas caracter´ısticas.

2.2.1

Chubby

O Chubby [11] ´e um servic¸o de coordenac¸˜ao da Google que oferece uma interface seme-lhante `a de um sistema de ficheiros. O sistema garante as propriedades de disponibilidade e fiabilidade e baseia-se num mecanismo de eventos (p.ex., eventos para modificac¸˜oes de ficheiros) e num mecanismo de locks, para controlo de concorrˆencia nos acessos a estes ficheiros. O sistema foi desenhado com o intuito de ser utilizado para a escrita e leitura de pequenos ficheiros onde, por exemplo, um conjunto de processos possa escrever e ler o resultado de uma eleic¸˜ao de um processo l´ıder.

Ao contr´ario dos locks usuais, o Chubby oferece locks que podem ser mantidos du-rante um longo per´ıodo de tempo (horas ou dias), permitindo que um lock sobreviva a falhas no servidor.

Uma c´elula Chubby ´e formada por poucos servidores (tipicamente s˜ao 5 de forma a tolerar 2 faltas), dos quais um ´e a r´eplica mestre (ver figura 2.4). As r´eplicas s˜ao colocadas em locais diferentes de modo a diminuir a a probabilidade da existˆencia de falhas corre-lacionadas. Todas as r´eplicas de uma c´elula mantˆem uma c´opia dos dados, mas apenas a r´eplica mestre inicia operac¸˜oes de leitura e escrita, propagando todas as actualizac¸˜oes nos dados para as restantes r´eplicas atrav´es do protocolo Paxos [23].

O Paxos oferece um protocolo de consenso, pelo qual s˜ao propagadas todas as operac¸˜oes de escrita dos clientes. As operac¸˜oes de leitura s˜ao satisfeitas apenas pela r´eplica mestre, pelo que n˜ao requerem a execuc¸˜ao do protocolo de consenso. Esta medida permite dimi-nuir o n´umero de mensagens trocadas entre as r´eplicas sem qualquer impacto no servic¸o, Os ficheiros e directorias mantidas no Chubby s˜ao generalizados como sendo n´os e podem ser permanentes ou ef´emeros. Qualquer n´o pode ser removido explicitamente, sendo os n´os ef´emeros removidos no caso de n˜ao estarem abertos por qualquer cliente ou se estiverem vazios, no caso de n´os representarem directorias. Isto significa que os

(31)

Cap´ıtulo 2. Trabalhos relacionados 11

Figura 2.4: Arquitectura do Chubby [11].

n´os ef´emeros s˜ao utilizados como ficheiros tempor´arios e como indicadores de que um cliente est´a activo (caso um cliente falhe, os seus ficheiros s˜ao removidos). Cada n´o pode comportar-se com um lock leitor-escritor, dado que um cliente pode obter um lock em modo exclusivo (de escrita) ou um n´umero arbitr´ario de clientes pode obter o mesmo lock em modo partilhado (de leitura), semelhantes aos apresentados em [8, 22].

De forma a reduzir o tr´afego de mensagens, os clientes deste servic¸o guardam os metadados dos seus n´os numa cache local. Esta cache ´e mantida consistente atrav´es de invalidac¸˜oes enviadas pela r´eplica mestre, que mant´em uma lista do que cada cliente pode ter armazenado na sua mem´oria. O protocolo garante que os clientes mantˆem uma vista actualizada do estado do servic¸o ou ´e lanc¸ado um erro no caso contr´ario.

Para alcanc¸ar uma maior escalabilidade, o Chubby utiliza mecanismos de proxies e de partic¸˜oes. Por um lado, o servic¸o permite que se utilizem proxies que encaminhem mensagens de v´arios clientes para as suas c´elulas. Por outro lado, a partic¸˜ao do espac¸o de nomes pelas diferentes r´eplicas permite a existˆencia de c´elulas maiores com pouco custo de comunicac¸˜ao entre as partic¸˜oes. No caso de se usar esta partic¸˜ao, uma c´elula Chubby seria composta por v´arias partic¸˜oes, cada uma com a sua r´eplica mestre e mais quatro r´eplicas. Estes dois mecanismos podem ser combinados para se conseguir lidar com um maior n´umero de clientes.

Em termos de durabilidade, o Chubby utiliza um mecanismo de write-ahead logging, onde as r´eplicas do servic¸o escrevem as operac¸˜oes dos clientes num log em disco antes de as executarem. Estes logs s˜ao replicados pelas diversas r´eplicas atrav´es da execuc¸˜ao do protocolo Paxos [23].

Ap´os um per´ıodo de tempo predefinido (normalmente horas), a r´eplicas mestre de cada c´elula Chubby escreve uma c´opia do seu estado para um servidor localizado num edif´ıcio diferente do seu. Este mecanismo permite a recuperac¸˜ao do estado do servic¸o mesmo ap´os um desastre e ainda a inicializac¸˜ao de uma nova r´eplica sem sobrecarregar as restantes r´eplicas que se encontram activas.

(32)

Cap´ıtulo 2. Trabalhos relacionados 12

2.2.2

Sinfonia

O Sinfonia [2] permite a partilha de dados entre aplicac¸˜oes num ambiente escal´avel atrav´es da introduc¸˜ao do paradigma das minitransacc¸˜oes. Uma minitransacc¸˜ao consiste num conjunto de trˆes operac¸˜oes: leitura, escrita, e comparac¸˜ao. A sua utilizac¸˜ao melhora o desempenho do sistema na medida em que agrupam as actualizac¸˜oes de estados de forma a reduzir o intervalo de tempo necess´ario a completar cada uma das actualizac¸˜oes. Para conseguir alcanc¸ar uma alta escalabilidade, o servic¸o desacopla as operac¸˜oes de clientes diferentes, para que possam ser executadas independentemente. O Sinfonia baseia-se em registos partilhados para manter os dados dos seus clientes, n˜ao impondo qualquer estrutura para os dados guardados (p.ex., tabelas). As r´eplicas do servic¸o s˜ao de-nominadas n´os de mem´oria (ver figura 2.5) e conseguem manter os dados na sua mem´oria RAM ou em mem´oria secund´aria (p.ex., disco r´ıgido), dependendo das necessidades da aplicac¸˜ao. Cada n´o tem um identificador ´unico e o seu pr´oprio conjunto de registos, forc¸ando os dados do servic¸o a ser referenciados por um par hid, addressi, sendo id o identificador do n´o a que pertence o registo address, onde est˜ao mantidos os dados.

Figura 2.5: Arquitectura do Sinfonia [2].

Ao contr´ario do que acontece no Chubby, o Sinfonia n˜ao mant´em dados na mem´oria cachedos clientes, oferecendo no entanto formas destes constru´ırem a sua pr´opria ca-che. Isto faz do Sinfonia um servic¸o mais simples, j´a que os seus dados est˜ao sempre actualizados.

Apesar de ser poss´ıvel utilizar a replicac¸˜ao de m´aquinas de estados [37] e o protocolo Paxos [23], o Sinfonia faz uso da t´ecnica de replicac¸˜ao prim´ario-secund´ario [10], na qual um n´o mestre ´e encarregue de servir os clientes. Antes de responder aos clientes, este n´o envia as modificac¸˜oes nos dados, causadas pelas operac¸˜oes executadas, a todos os restantes n´os.

Sendo um servic¸o CFT (Crash Fault-Tolerant), garante que os dados n˜ao s˜ao perdi-dos na ocorrˆencia de falhas por paragem perdi-dos n´os atrav´es da propriedade de atomicidade das minitransacc¸˜oes oferecidas. Para al´em disso, o sistema consegue executar normal-mente mesmo na presenc¸a de alguns n´os indispon´ıveis, preservando os dados mesmo na

(33)

Cap´ıtulo 2. Trabalhos relacionados 13

ocorrˆencia de faltas correlacionadas. Isto apenas ´e poss´ıvel no caso de existir uma maioria de n´os de mem´oria activos e actualizados, de forma a permitir a recuperac¸˜ao de r´eplicas faltosas. Adicionalmente, s˜ao utilizadas quatro t´ecnicas para a tolerˆancia de paragens de alguns n´os: imagens de disco, logging, replicac¸˜ao e backups.

As imagens de disco s˜ao c´opias do estado de cada n´o de mem´oria. Como estes da-dos s˜ao escritos assincronamente, podem ficar desactualizada-dos. Este problema ´e resol-vido atrav´es do logging das actualizac¸˜oes dos dados para um ficheiro. Aquando uma recuperac¸˜ao de uma falha, os n´os utilizam um algoritmo de recuperac¸˜ao que reproduz o conte´udo deste ficheiro de log.

Caso um n´o de mem´oria do Sinfonia perca o seu armazenamento seguro devido a uma falha, tem de recuperar os dados de um backup. Se n˜ao for poss´ıvel, o n´o actualiza-se atrav´es da sincronizac¸˜ao da sua imagem de disco e da execuc¸˜ao do seu ficheiro de log. De forma a n˜ao executar ficheiros de log muito longos, existe um apontador que indica a operac¸˜ao no log a partir da qual a recuperac¸˜ao dever´a ser iniciada. Este apontador ´e periodicamente escrito para disco. Para al´em disso, uma minitransacc¸˜ao conclu´ıda apenas poder´a ser removida do ficheiro de log quando tiver sido aplicada em todos os n´os de mem´oria envolvidos na sua execuc¸˜ao.

Na falha de um um cliente, o coordenador de recuperac¸˜oes do Sinfonia, que ´e exe-cutado num n´o dedicado, forc¸a todos os n´os a abortarem as minitransacc¸˜oes referentes a esse cliente.

2.2.3

ZooKeeper

O ZooKeeper [20] oferece uma API que manipula dados sob a forma de objectos orga-nizados hierarquicamente, como num sistema de ficheiros ou servic¸o de nomes, com o nome de znodes. Existem dois tipos de znodes: os regulares e os ef´emeros (cuja definic¸˜ao se encontra na secc¸˜ao 2.2.1). Adicionalmente ao que ´e descrito no Chubby, o ZooKeeper permite que znodes regulares tenham znodes filhos, ao contr´ario do que acontece com os ef´emeros. Ao criar um znode, um cliente pode solicitar a criac¸˜ao de um sentinela (ou watch), que o notifique no caso desse znode sofrer qualquer alterac¸˜ao. Este mecanismo permite aos clientes do ZooKeeper manterem-se informados sobre as actualizac¸˜oes dos seus dados sem que o sistema manipule as suas caches locais, como ´e feito no Chubby (ver secc¸˜ao 2.2.1).

O ZooKeeper utiliza a ordenac¸˜ao FIFO para as mensagens de clientes, o que significa que as suas operac¸˜oes s˜ao processadas pela ordem de chegada ao servic¸o, e escritas li-neariz´aveis, permitindo a um cliente ter m´ultiplas operac¸˜oes em espera. Para al´em disso, as operac¸˜oes oferecidas s˜ao tamb´em livres de espera (wait-free), significando que um cliente consegue completar uma operac¸˜ao num n´umero finito de iterac¸˜oes, independente-mente das acc¸˜oes dos restantes clientes, ao contr´ario do que acontece no Chubby, onde um cliente pode obter um lock por um tempo indeterminado e bloquear os restantes clientes.

(34)

Cap´ıtulo 2. Trabalhos relacionados 14

Para a comunicac¸˜ao entre as r´eplicas, ´e usado o Zab [36], um protocolo de difus˜ao at´omica similar ao Paxos [23] e que utiliza uma r´eplica l´ıder. Este protocolo forc¸a as r´eplicas a executarem as operac¸˜oes pela mesma ordem. Tal como no Chubby, apenas as operac¸˜oes de escrita requerem a execuc¸˜ao deste protocolo (ver figura 2.6).

Figura 2.6: Execuc¸˜ao de operac¸˜oes de escrita e de leitura no ZooKeeper [20].

A replicac¸˜ao dos dados pelas diferentes r´eplicas permite que este servic¸o CFT man-tenha uma alta disponibilidade e permite ainda a recuperac¸˜ao de r´eplicas indispon´ıveis. Para que a recuperac¸˜ao de estados seja poss´ıvel, as alterac¸˜oes efectuadas num znode s˜ao escritas num ficheiro de log em disco e s´o depois s˜ao executadas. Periodicamente, cada r´eplica escreve para disco uma c´opia do seu estado actual (checkpointing), de modo a processar menos mensagens na recuperac¸˜ao de eventuais falhas. As c´opias do estado de cada r´eplica s˜ao consideradas imprecisas (fuzzy) porque as r´eplicas n˜ao bloqueiam o es-tado para realizar as c´opias. Assim as c´opias de eses-tado obtidas podem n˜ao corresponder ao estado do sistema em qualquer momento, porque podem conter um subconjunto de operac¸˜oes realizadas paralelamente `a sua realizac¸˜ao.

UpRight ZooKeeper. Clement et al., apresentaram a UpRight [13], uma biblioteca que oferece tolerˆancia a faltas bizantinas a servic¸os CFT, de forma a aumentar a sua robustez. Para testar a UpRight transformaram o Zookeeper [20] num servic¸o BFT sem que fos-sem necess´arias muitas alterac¸˜oes no seu c´odigo. As maiores modificac¸˜oes foram efectu-adas na gerac¸˜ao de checkpoints, na interacc¸˜ao do servic¸o com a UpRight e na remoc¸˜ao do Zab.

Ao compararem o ZooKeeper CFT com o novo UpRight ZooKeeper, os resultados mostram que a performance deste ´ultimo se aproximava do primeiro, concluindo que a inclus˜ao de tolerˆancia a faltas bizantinas n˜ao tem um impacto significativo.

2.2.4

DepSpace

O DepSpace [5] foi o primeiro servic¸o de coordenac¸˜ao a fazer uso de replicac¸˜ao de m´aquinas de estado BFT e de um esquema de confidencialidade, oferecendo um espac¸o

(35)

Cap´ıtulo 2. Trabalhos relacionados 15

de tuplos fi´avel, concretizado sobre um conjunto de r´eplicas n˜ao confi´aveis.

O DepSpace usa um protocolo de difus˜ao com ordem total, originalmente baseado no protocolo Paxos at war [48], que garante que todas as r´eplicas recebem a mesma sequˆencia de operac¸˜oes. Para al´em disso, e contrariamente aos protocolos usados nos anteriores servic¸os, o Paxos at war tolera falta bizantinas.

O DepSpace opta por oferecer uma abstracc¸˜ao de espac¸o de tuplos (ao inv´es de, por exemplo, um espac¸o de nomes hier´arquico) devido `as suas propriedades de simplicidade, dada a existˆencia de apenas quatro operac¸˜oes b´asicas (e algumas variantes) s˜ao supor-tadas; enderec¸amento por conte´udo, o que faz os tuplos serem identificados pelo seu conte´udo, dando uma alta flexibilidade ao sistema e comunicac¸˜ao desacoplada, que per-mite a comunicac¸˜ao entre processos sem restric¸˜oes espac¸o-temporais. Ao fazerem uso de um mecanismo de pol´ıticas de controlo de acesso, o PEATS (de Policy-Enforced Augmen-ted Tuple Space[6]), as operac¸˜oes sobre os espac¸os de tuplos do DepSpace s˜ao efectuadas apenas pelos clientes que tˆem permiss˜oes para o fazer, o que torna o servic¸o mais seguro. Apesar do reduzido n´umero de operac¸˜oes, o modelo de espac¸o de tuplos pode ser utilizado em qualquer programa. Considerando uma operac¸˜ao adicional, a cas [4] (de conditional atomic swap), este modelo tem um poder de sincronizac¸˜ao suficiente para resolver o problema do consenso e, consequentemente, outros problemas de acordo como a eleic¸˜ao de um processo l´ıder.

O DepSpace tamb´em utiliza o modelo de replicac¸˜ao de m´aquinas de estados [37]. No entanto, este modelo n˜ao garante a confidencialidade dos dados mantida pelas r´eplicas, j´a que a replicac¸˜ao dos dados pelas r´eplicas oferece uma maior superf´ıcie de ataque, dado que uma r´eplica comprometida d´a acesso a todos os dados armazenados na sua mem´oria (e em todo o sistema). Assim, ´e necess´ario um esquema de confidencialidade que mantenha a informac¸˜ao confidencial nas r´eplicas do servic¸o.

Para resolver este problema, uma r´eplica n˜ao deve ter acesso ao conte´udo dos tuplos que guarda e o acesso a estes apenas deve ser poss´ıvel com a aprovac¸˜ao de um conjunto de r´eplicas. Neste sentido, o DepSpace implementa um tipo especial de esquema de partilha secreta [39].

Num esquema de partilha secreta, um cliente distribui um segredo por n r´eplicas, mas cada r´eplica apenas guarda parte desse segredo. Para recuperar um segredo inteiro, um cliente precisa de obter pelo menos f + 1 partes diferentes para que o segredo seja revelado. No caso do DepSpace, a soluc¸˜ao ´e baseado num esquema secreto publicamente verific´avel (n, f + 1), ou PVSS [38]. No PVSS, um cliente conhece as chaves p´ublicas de todas as n r´eplicas. Cada tuplo criado pelo cliente ´e dividido em n partes, sendo cada parte cifrada com uma chave partilhada entre o cliente e a r´eplica onde ser´a guardado. Como o modelo assume que apenas f r´eplicas podem ser faltosas e um tuplo apenas ´e revelado com a obtenc¸˜ao de f + 1 partes diferentes, a execuc¸˜ao de r´eplicas faltosas n˜ao revela o conte´udo dos tuplos guardados. O esquema PVSS tamb´em oferece `as r´eplicas

(36)

Cap´ıtulo 2. Trabalhos relacionados 16

um m´etodo para analisar as partes recebidas pelos clientes e ainda oferece aos clientes um m´etodo para verificar se as partes recebidas das r´eplicas est˜ao corrompidas.

A ideia fundamental o esquema de confidencialidade usado ´e que as r´eplicas n˜ao tˆem o mesmo estado, j´a que guardam partes diferentes dos dados. Em vez disso, o DepSpace garante que todas as r´eplicas possuem estados equivalentes, ou seja, para cada tuplo in-serido no espac¸o de tuplos, cada r´eplica guarda a sua respectiva parte. Isto ´e assegurado pelo protocolo de multicast de ordem total oferecido pela camada de replicac¸˜ao.

DepSpace 2.0. A segunda vers˜ao do DepSpace [35], foi criada para colmatar algumas limitac¸˜oes da vers˜ao anterior.

A integrac¸˜ao com a biblioteca BFT-SMaRt [41] foi melhorada e simplificada e foram criadas operac¸˜oes para a manipulac¸˜ao de conjuntos de tuplos, que permitem, por exemplo, ler ou remover um conjunto de tuplos em vez de tuplos singulares.

2.3

Durabilidade de dados e recuperac¸˜ao de estado

Na ocorrˆencia de falhas no sistema, ´e vital que os processos faltosos possam recupe-rar para um estado correcto. Esta recuperac¸˜ao ´e feita armazenando o estado do sistema atrav´es do logging das mensagens trocadas entre os processos. Este armazenamento ´e feito de forma a ser poss´ıvel reproduzir o estado armazenado [44].

Nesta secc¸˜ao ser˜ao apresentadas as t´ecnicas de durabilidade comuns `a maioria do servic¸os de coordenac¸˜ao. Estas t´ecnicas ser˜ao tamb´em utilizadas neste projecto, com algumas optimizac¸˜oes que visam melhorar o desempenho do sistema.

2.3.1

Armazenamento est´avel, checkpoints e logs

Tal como ´e mostrado da figura 2.7, a recuperac¸˜ao de estados pode ser feita de duas for-mas: para tr´as e para a frente. No primeiro caso, a recuperac¸˜ao ´e feita de forma a que o processo faltoso recupere para o ´ultimo estado correcto que conheceu antes de falhar. Para que isto acontec¸a, ´e necess´ario que o estado do sistema seja armazenado periodica-mente para que, na presenc¸a de falhas, seja poss´ıvel voltar a recuper´a-lo. Pelo contr´ario, na recuperac¸˜ao para a frente, um processo faltoso evolui para um novo estado correcto, de onde ´e seguro continuar a execuc¸˜ao normal do sistema. Aqui, o problema reside no facto de, para avanc¸ar para um novo estado, o sistema tem de conhecer todos os erros poss´ıveis de forma a conseguir corrigi-los.

(37)

Cap´ıtulo 2. Trabalhos relacionados 17

No geral, a recuperac¸˜ao para tr´as ´e a mais utilizada, apesar de o seu uso levantar al-guns problemas. Em primeiro lugar, ´e uma operac¸˜ao cara em termos de desempenho do sistema, devido ao uso de mecanismos de logging e checkpointing, que ser˜ao discutidos de seguida. Em segundo lugar, n˜ao nos garante que uma falta n˜ao se repetir´a no futuro. Finalmente, existem estados para o quais n˜ao ´e poss´ıvel recuperar. Por exemplo, na mai-oria dos sistemas UNIX, ´e muito pouco prov´avel conseguir-se recuperar para um estado anterior `a execuc¸˜ao da operac¸˜ao rm -fr * (remoc¸˜ao de todo o conte´udo de uma directoria).

Armazenamento est´avel. O armazenamento est´avel consiste em guardar dados no local que oferec¸a boas garantias de que esses dados permanecer˜ao intactos em caso de falha. Este armazenamento ´e de extrema importˆancia no ˆambito da recuperac¸˜ao de processos faltosos, dado que o estado de um sistema precisa de ser armazenado de forma a sobrevi-ver a paragem ou falha de processos. Tamb´em ´e importante que esse estado sobreviva a falhas o local onde ´e armazenado (p.ex., disco r´ıgido) [29, 44].

Existem trˆes tipos de armazenamento: em mem´oria RAM, em disco, ou armazena-mento est´avel. O problema da mem´oria RAM ´e que ´e apagada em caso de falha de energia ou paragem da m´aquina. O armazenamento em disco sobrevive a falhas da m´aquina mas n˜ao sobrevive a falhas no disco em si.

O armazenamento est´avel foi desenhado para sobreviver a quase qualquer falha, ex-cepto a desastres naturais de grande escala, como inundac¸˜oes e terramotos, e ´e bom para aplicac¸˜oes que requeiram um alto n´ıvel de tolerˆancia a faltas, tal como as transacc¸˜oes at´omicas, devido `a m´ınima probabilidade de perda de dados nas operac¸˜oes de escrita.

Este ´ultimo pode ser implementado com um par de discos r´ıgidos ligados, digamos Disco1 e Disco2. O Disco2 serve de backup do Disco1, sendo que uma modificac¸˜ao dos dados ´e efectuada em primeiro lugar no Disco1, os dados s˜ao verificados e s˜ao finalmente guardados no Disco2. No caso de os discos terem blocos com diferentes valores, pode-se assumir que os do Disco1 s˜ao os correctos, j´a que foi o primeiro a ser modificado. Os blocos do Disco1 podem ent˜ao ser copiados para o Disco2 para que, quando o processo de recuperac¸˜ao iniciar, os discos estejam idˆenticos.

Este tipo de armazenamento ´e bom para aplicac¸˜oes que requeiram um alto n´ıvel de tolerˆancia a faltas, tal como as transacc¸˜oes at´omicas, devido `a m´ınima probabilidade de perda de dados nas operac¸˜oes de escrita.

Checkpoints. O checkpointing consiste em criar uma c´opia do estado actual do sistema e grav´a-la para um local seguro. Esta t´ecnica ´e a mais utilizada na recuperac¸˜ao para tr´as, j´a que permite o armazenamento est´avel peri´odico do estado do sistema [44]. Este estado do sistema ´e global e consistente em todos os processos, sendo denominado de snapshot. Aquando uma recuperac¸˜ao, os processos devem recuperar a snapshot mais recente, sendo que esta define a linha de recuperac¸˜ao do sistema. No entanto, encontrar a linha de

(38)

Cap´ıtulo 2. Trabalhos relacionados 18

recuperac¸˜ao pode n˜ao ser simples usando apenas checkpoints. Para o fazer, cada processo tem de retroceder o seu estado at´e ao checkpoint mais recente e, caso o estado recuperado desse checkpoint n˜ao forme uma snapshot distribu´ıda, os processos ter˜ao de retroceder ainda mais, at´e que isso acontec¸a.

Caso os checkpoints efectuados sejam independentes, i.e., se os processos realiza-rem os seus checkpoints locais e independentemente dos restantes, o c´alculo da linha de recuperac¸˜ao torna-se ainda mais complexo. Para al´em disso, tem de existir tamb´em um garbage collectorque limpa periodicamente o armazenamento local de cada processo, `a medida que o n´umero de checkpoints guardados aumenta.

Para resolver os problemas dos checkpoints independentes, ´e preciso coorden´a-los en-tre os processos. Isto significa que todos os processos sincronizam as suas escritas para o local de armazenamento, mantendo o estado gravado consistente. Uma soluc¸˜ao simples para implementar estes checkpoints coordenados ´e um protocolo de commit de duas fases e bloqueante. Um processo coordenador envia uma mensagem CHECKPOINT REQUEST

a todos os restantes processos. Ao receberem essa mensagem, criam um checkpoint local e guardam quaisquer operac¸˜oes posteriores para mais tarde serem executadas, ou seja, bloqueiam a sua execuc¸˜ao. Depois, confirmam com o processo coordenador que j´a efec-tuaram o checkpoint. Quando o coordenador recebe todas as confirmac¸˜oes, envia uma mensagem CHECKPOINT DONE a todos os restantes processos que estejam bloqueados, para que estes possam continuar a execuc¸˜ao de operac¸˜oes.

Muitos sistemas distribu´ıdos BFT combinam checkpoints com logging de mensagens. Um processo poderia tamb´em fazer um log das mensagens que recebe (logging baseado no receptor), antes de as entregar `a aplicac¸˜ao. Na reproduc¸˜ao do estado, cada processo retrocede para o checkpoint mais recente e reproduz o log de mensagens pela respectiva ordem. Isto garante a reproduc¸˜ao dos eventos que ocorreram ap´os a criac¸˜ao do checkpoint mais recente.

Logging de mensagens. A ideia do logging de mensagens ´e que, se a transmiss˜ao de mensagens pode ser repetida, ent˜ao conseguimos atingir um estado globalmente consis-tente sem que seja necess´ario carreg´a-lo do local de armazenamento. Em vez disso, um checkpointpreviamente armazenado ´e considerado um ponto de partida e todas as mensa-gens trocadas ap´os esse checkpoint s˜ao simplesmente retransmitidas e reprocessadas [44]. Esta abordagem funciona bem assumindo um modelo determin´ıstico, em que os processos executam eventos n˜ao deterministas (p.ex., recepc¸˜ao de mensagens), deterministicamente. Existem duas formas de logging poss´ıveis: pessimista e optimista. Os protocolos de logging pessimista asseguram que cada mensagem n˜ao est´avel m ´e entregue a um pro-cesso P , no m´aximo uma vez. As mensagens s˜ao consideradas est´aveis quando s˜ao guar-dadas de forma a que n˜ao se percam (p.ex., s˜ao escritas para o armazenamento est´avel). No pior cen´ario, o processo P falha sem ter armazenado m. Para lidar com este cen´ario, o

(39)

Cap´ıtulo 2. Trabalhos relacionados 19

loggingpessimista faz com que P armazene m antes de enviar qualquer outra mensagem, para evitar inconsistˆencias no estado entre processos correctos e faltosos.

Figura 2.8: Logging optimista [44].

Pelo contr´ario, os protocolos de logging optimista, permitem que o processo R envie m2 antes de a armazenar num local seguro (ver figura 2.8). Isto significa que, ap´os a falha de Q e a sua respectiva recuperac¸˜ao, R n˜ao reenvia m2 a Q, fazendo com que este processo n˜ao re-execute m2 e reenvie m3. Esta situac¸˜ao deixa o sistema num estado inconsistente.

Para evitar esta inconsistˆencia, os protocolos de logging optimista fazem com que os processos correctos que dependem dos processos que falharam (R depende de Q na recepc¸˜ao de m3), retrocedam para um estado onde a inconsistˆencia deixe de se verificar. No caso da figura 2.8, R recuaria at´e ao momento anterior `a recepc¸˜ao de m1 e voltaria a executar m1, seguindo-se o envio de m2 que levaria `a recepc¸˜ao de m3.

Os protocolos de logging optimista s˜ao mais complexos e portanto mais dif´ıceis de implementar, sendo os protocolos de logging pessimista os mais utilizados na pr´atica.

2.3.2

ARIES

No anos 90, Mohan et al. apresentaram o ARIES [27], um m´etodo eficiente de recuperac¸˜ao de transacc¸˜oes que suporta retrocessos parciais ou totais de transacc¸˜oes. Este m´etodo ga-rante as propriedades ACID [19] das transacc¸˜oes, mesmo na existˆencia de falhas nos processos, transacc¸˜oes ou no sistema.

Como foi referido, as transacc¸˜oes podem ser parcialmente retrocedidas at´e a um save-pointpreviamente efectuado, assegurando a propriedade de atomicidade. Este retrocesso significa que todas as alterac¸˜oes efectuadas desde ent˜ao s˜ao descartadas e a transacc¸˜ao continua a sua execuc¸˜ao com os valores que tinha no savepoint.

O ARIES utiliza um mecanismo de write-ahead logging, tal como o Chubby [11] e, `a semelhanc¸a da maioria dos servic¸os e protocolos referidos nas secc¸˜oes anteriores, executa batches de operac¸˜oes numa s´o operac¸˜ao de I/O. Os logs criados contˆem operac¸˜oes de retrocesso e de reparac¸˜ao das transacc¸˜oes efectuadas.

(40)

Cap´ıtulo 2. Trabalhos relacionados 20

Para reduzir o trabalho efectuado durante a recuperac¸˜ao, o algoritmo tamb´em cria checkpointsperi´odicos dos logs do sistema. Estes checkpoints consistem em gravar duas tabelas no log: a tabela de p´aginas sujas (a DPT), que mant´em o registo de todos os dados modificados que ainda n˜ao est˜ao armazenados fisicamente; e a tabela de transacc¸˜oes (a TT), que mant´em o registo de todas as transacc¸˜oes que est˜ao em execuc¸˜ao.

O ARIES prop˜oe a recuperac¸˜ao de processos divida em trˆes fases: a an´alise, a fase de recuperac¸˜ao e a de retrocesso. A fase de an´alise consiste na recuperac¸˜ao do conte´udo das tabelas DPT e TT, de forma a recuperar todas as transacc¸˜oes incompletas no momento da ocorrˆencia da falha. A fase de recuperac¸˜ao executa o paradigma de repetic¸˜ao do hist´orico, ou seja, s˜ao efectuadas todas as alterac¸˜oes pendentes que fazem as transacc¸˜oes incom-pletas avanc¸arem na sua execuc¸˜ao. Finalmente, a fase de retrocesso faz com que todas as operac¸˜oes que n˜ao terminaram sejam retrocedidas. Nesta fase, o algoritmo escreve no log todas as alterac¸˜oes efectuadas, para que estas n˜ao se repitam no caso de existirem m´ultiplos rein´ıcios do processo.

O processo de recuperac¸˜ao tem de levar os processos a manterem um estado con-sistente e ainda assegurar a atomicidade e durabilidade das transacc¸˜oes efectuadas. A disponibilidade do sistema tem tamb´em de ser assegurada pelo processo, pelo que deve executar o menor espac¸o de tempo poss´ıvel.

2.3.3

Gaios

Como j´a referido, o Paxos [23] ´e um protocolo importante para a implementac¸˜ao da replicac¸˜ao de m´aquinas de estados [37]. Apesar disso, ´e considerado um protocolo com um baixo desempenho.

Para contradizer isso, Bolosky et al. criaram o sistema Gaios [9], que oferece um servic¸o de armazenamento de dados constru´ıdo sobre a SMARTER, uma vers˜ao melho-rada da biblioteca SMART [25] (que ´e baseada no Paxos; n˜ao confundir com a BFT-SMaRt [41]). A SMARTER foi desenhada para oferecer m´etodos de armazenamento de grupos de operac¸˜oes e para melhorar o esquema de logging da SMART, reduzindo a latˆencia das operac¸˜oes.

Tratando-se de um servic¸o de armazenamento de dados, o Gaios tem de ser o mais eficiente poss´ıvel. Por´em, as m´aquinas de estados apenas executam uma operac¸˜ao por ronda, enquanto os discos r´ıgidos s˜ao mais eficientes na presenc¸a de m´ultiplas operac¸˜oes de escritas, que podem ser reordenadas de forma a minimizar o movimento do brac¸o do disco. O Gaios implementa soluc¸˜oes diferentes para operac¸˜oes de leitura e de escrita. Na presenc¸a de operac¸˜oes de escrita, as modificac¸˜oes apenas s˜ao escritas para a mem´oria cachedo sistema. Mais tarde, na criac¸˜ao de um checkpoint, os dados em mem´oria s˜ao reordenados para serem escritos em disco. Depois de reordenados, os dados s˜ao escritos para disco em grupos, para minimizar o movimento do brac¸o do disco.

(41)

Cap´ıtulo 2. Trabalhos relacionados 21

escritas nos logs. O sistema tenta escolher as r´eplicas que n˜ao est˜ao a criar checkpoints para processar estas operac¸˜oes, para que as operac¸˜oes n˜ao sejam adicionadas `a fila de operac¸˜oes pendentes. Isto permite melhorar o desempenho das operac¸˜oes de leitura.

Em termos de tolerˆancia a faltas, o Gaios n˜ao ´e um servic¸o BFT, j´a que apenas detecta um conjunto de faltas bizantinas simples, relacionadas com a corrupc¸˜ao de dados em disco, transformando-as em faltas por paragem e obrigando as r´eplicas a reiniciar. As r´eplicas do servic¸o s˜ao ainda protegidas por medidas de seguranc¸a externas, para que n˜ao sejam comprometidas por agentes maliciosos. Este modelo de tolerˆancia a faltas ´e justificado pelo maior n´umero de r´eplicas utilizadas em servic¸os BFT (3f + 1) em comparac¸˜ao com as 2f + 1 requeridas pelo Paxos.

Para testar o desempenho do Gaios, compararam-no a trˆes sistemas diferentes: um disco de uma m´aquina e duas vers˜oes de um sistema com replicac¸˜ao prim´ario-secund´ario [10]. Os autores dizem que o seu sistema apresentou resultados pr´oximos dos resultados dos seus concorrentes. Desta forma conseguiram alcanc¸ar o seu objectivo de constru´ırem um sistema baseado no protocolo Paxos e que apresenta um bom desempenho.

2.3.4

Recuperac¸˜ao proactiva

Em [12], Castro e Liskov estenderam o protocolo PBFT (ver secc¸˜ao 2.1.1) com um pro-tocolo de recuperac¸˜ao proactiva que permite ao sistema tolerar um qualquer n´umero de faltas durante o seu per´ıodo de execuc¸˜ao, desde que menos do que 1/3 das r´eplicas do sistema sejam faltosas numa determinada janela de vulnerabilidade.

A recuperac¸˜ao proactiva ´e usada para rejuvenescer periodicamente as r´eplicas de um servic¸o, eliminando os efeitos de ataques maliciosos ou falhas do sistema. O algoritmo reinicia periodicamente as r´eplicas, atrav´es do uso de temporizadores, independentemente de serem detectadas faltas ou n˜ao. Quando um temporizador expira, uma r´eplica guarda os seus estado e log no disco, reiniciando de seguida. Ao reiniciar, a r´eplica carrega o seu c´odigo correcto (removendo, por exemplo, qualquer c´odigo malicioso existente) e tamb´em o estado que guardou antes de reiniciar.

A r´eplica que est´a a reiniciar, descarta as chaves que partilha com os seus clientes e restantes r´eplicas, para prevenir que um atacante consiga personificar qualquer um deles. O passo seguinte consiste no envio de uma mensagem `as restantes r´eplicas para determi-nar se o seu estado est´a corrompido ou inv´alido.

A transferˆencia de estado que decorre ap´os o envio desta mensagem tem de ser efici-ente, de modo a permitir um grande n´umero de recuperac¸˜oes de estado com pouco im-pacto no desempenho do protocolo. O processo de recuperac¸˜ao de estado ´e considerado completo quando as r´eplicas conseguem criar um checkpoint est´avel do estado global do sistema. Isto garante que o checkpoint criado est´a presente em, pelo menos, f + 1 r´eplicas correctas, conseguindo assim sobreviver a falhas de at´e f r´eplicas.

(42)

Cap´ıtulo 2. Trabalhos relacionados 22

2.4

Considerac¸˜oes finais

Neste cap´ıtulo apresent´amos o conceito de servic¸os de coordenac¸˜ao, apresentando v´arios exemplos como o ZooKeeper e o DepSpace.

De seguida s˜ao apresentados v´arios protocolos de replicac¸˜ao CFT e BFT, utilizados na comunicac¸˜ao entre as r´eplicas dos servic¸os de coordenac¸˜ao, tal como o PBFT e o BFT-SMaRt.

Por ´ultimo introduzimos algumas t´ecnicas utilizadas para garantir a durabilidade dos dados em servic¸os de coordenac¸˜ao, tal como mecanismos de logging e de armazenamento est´avel. Estas t´ecnicas s˜ao o foco principal do desta dissertac¸˜ao, que ir´a descrever a forma como foram optimizadas e implementadas na construc¸˜ao de um servic¸o baseado no DepSpace.

(43)

Cap´ıtulo 3

DDS – Durable DepSpace

Este cap´ıtulo apresenta e descreve o trabalho efectuado na construc¸˜ao do servic¸o de coordenac¸˜ao DDS (Durable DepSpace), nomeadamente a arquitectura do DDS, a durabi-lidade de dados no DDS, o modelo de dados utilizado e ainda o protocolo de sincronizac¸˜ao inicial de estados das r´eplicas do servic¸o.

3.1

Arquitectura

O DDS tem como base o DepSpace [5], um servic¸o de coordenac¸˜ao BFT que oferece uma abstracc¸˜ao de espac¸os de tuplos para a coordenac¸˜ao de processos. O modelo de coordenac¸˜ao baseado em espac¸os de tuplos foi introduzido pela linguagem de programac¸˜ao Linda [17]. Este modelo suporta comunicac¸˜ao desacoplada no tempo e no espac¸o: os pro-cessos clientes n˜ao necessitam de estar activos no mesmo instante de tempo nem de conhe-cer a localizac¸˜ao ou enderec¸os dos restantes processos para ser poss´ıvel sincronizarem-se. Um espac¸o de tuplos, como o pr´oprio nome indica, consiste num conjunto de tuplos. Um tuplo pode ser definido como uma sequˆencia finita de atributos. Estes atributos s˜ao independentes entre si e podem assumir, por exemplo, valores num´ericos e sequˆencias de bytes. As operac¸˜oes suportadas pelos espac¸os de tuplos s˜ao basicamente as de escrita, leitura e remoc¸˜ao de tuplos, existindo ainda diversas variantes destas.

Assim como o DepSpace, o DDS suporta a existˆencia de diversos espac¸os de tuplos em simultˆaneo e ´e constitu´ıdo por diversas camadas, encarregues de garantir as suas pro-priedades (ver figura 3.1). A camada mais complexa ´e a de replicac¸˜ao, que ´e concretizada pela biblioteca BFT-SMaRt [41]. As camadas de controlo de acesso, pol´ıticas de acesso e confidencialidade garantem que os tuplos armazenados s˜ao acedidos apenas por proces-sos que tenham permiss˜ao para o fazer. N˜ao s˜ao fornecidos aqui mais detalhes sobre essas camadas dado serem semelhantes `as do DepSpace (ver secc¸˜ao 2.2.4).

O DDS vem adicionar trˆes componentes `a arquitectura original do DepSpace [5]: Du-rability Manager (DM), Logging e Checkpointing (cf. figura 3.1). Os componentes de logginge de checkpointing s˜ao respons´aveis pela criac¸˜ao dos ficheiros de log e de

(44)

Cap´ıtulo 3. DDS – Durable DepSpace 24

point, respectivamente. Est˜ao ainda encarregues da gest˜ao desses ficheiros, bem como das suas actualizac¸˜oes. O DM ´e a camada que faz a comunicac¸˜ao entre a biblioteca de replicac¸˜ao e as camadas de logging, de checkpointing e os espac¸os de tuplos, encami-nhando as mensagens recebidas para as camadas adjacentes. Esta camada est´a tamb´em encarregue de executar o protocolo de transferˆencia de estado entre as r´eplicas.

No DDS foi introduzida a execuc¸˜ao de batches de pedidos de clientes. Este meca-nismo possibilita a entrega de um conjunto, ou batch, de mensagens `a aplicac¸˜ao, em vez de ser entregue uma mensagem de cada vez, fazendo com que a fila de mensagens `a espera de serem executadas esvazie mais rapidamente. Uma das tarefa realizada pelo Durability Manager ´e a de dividir um batch de mensagens em batches menores, cada um contendo as mensagens relativas a um dos espac¸os de tuplos. Estes batches s˜ao depois entregues em paralelo a todos os espac¸os de tuplos de destino, que processam as mensagens e devol-vem as respostas pela mesma ordem pela qual receberam as mensagens. Esta ordenac¸˜ao ´e importante na medida em que os clientes necessitam de receber as respostas pela ordem em que enviaram as suas mensagens.

Figura 3.1: Arquitectura do DDS.

3.2

Durabilidade no DDS

3.2.1

Logging de mensagens

De forma a manter as operac¸˜oes dos clientes deste servic¸o em caso de falha, ´e necess´ario que estas sejam guardadas num local que oferec¸a boas garantias de durabilidade. No caso do DDS, consideramos que os discos das r´eplicas oferecem tais garantias. Foi ent˜ao desenvolvida uma camada de logging que, como mostra a figura 3.2, apenas faz logging

(45)

Cap´ıtulo 3. DDS – Durable DepSpace 25

das operac¸˜oes que alteram o estado do sistema. O facto de n˜ao efectuarem qualquer modificac¸˜ao no estado do sistema faz com que seja desnecess´ario fazer o logging das operac¸˜oes como a leitura de tuplos (operac¸˜ao rdp).

Figura 3.2: Execuc¸˜ao de operac¸˜oes, ordenadas e n˜ao ordenadas, no DDS.

Na inicializac¸˜ao de uma r´eplica, e no caso do logging de mensagens estar activo, a ca-mada de logging ´e respons´avel pela criac¸˜ao dos ficheiros de log. Normalmente, operac¸˜oes de escrita para disco s˜ao mantidas em buffers internos de modo a melhorar a sua eficiˆencia [40, p. 514]. Quando uma aplicac¸˜ao cliente quer escrever dados para um ficheiro guar-dado em disco, faz uma chamada ao kernel do sistema operativo para efectuar tal escrita (operac¸˜oes de escrita para disco s˜ao operac¸˜oes privilegiadas, sendo o kernel o ´unico a poder execut´a-las) [40, p. 515]. O kernel verifica se a regi˜ao do ficheiro pedida est´a dis-pon´ıvel em mem´oria. Se estiver, a operac¸˜ao de escrita para o disco f´ısico ´e adiada, caso contr´ario a operac¸˜ao ´e guardada em mem´oria para permitir largas transferˆencias de dados para disco [40, p. 414].

Para assegurarmos que as actualizac¸˜oes ao ficheiro de log s˜ao escritas para disco, n˜ao podemos utilizar estas escritas que retˆem os dados em mem´oria porque pode dar-se uma falha numa r´eplica antes do sistema operativo dessa r´eplica conseguir armazenar os da-dos, que est˜ao em mem´oria, no disco. Isto significa que se o DDS entregar o resultado de uma operac¸˜ao ao cliente e depois perder as alterac¸˜oes feitas por essa operac¸˜ao, n˜ao existe qualquer garantia de que essas alterac¸˜oes sobrevivam no futuro. Precisamos ent˜ao de fazer com que as escritas de disco sejam directamente enviadas para disco sem que sejam mantidas em mem´oria pelo sistema operativo. Para isso utilizamos a classe Rando-mAccessFile[31] do Java. A criac¸˜ao de um objecto desta classe permite o acesso a um

Referências

Documentos relacionados

O fortalecimento da escola pública requer a criação de uma cultura de participação para todos os seus segmentos, e a melhoria das condições efetivas para

Não obstante a reconhecida necessidade desses serviços, tem-se observado graves falhas na gestão dos contratos de fornecimento de mão de obra terceirizada, bem

Nessa perspectiva, o objetivo geral deste trabalho é o de analisar a proposta curricular do Curso de Especialização em Gestão e Avaliação da Educação Pública, oferecido

[r]

O Plano de Metas Compromisso Todos pela Educação, de 2007, e a Política Nacional de Formação de Profissionais do Magistério da Educação Básica, instituída em 2009 foram a base

Para analisar as Componentes de Gestão foram utilizadas questões referentes à forma como o visitante considera as condições da ilha no momento da realização do

Oncag, Tuncer & Tosun (2005) Coca-Cola ® Sprite ® Saliva artificial Compósito não é referido no estudo 3 meses 3 vezes por dia durante 5 minutos Avaliar o efeito de

Portanto, conclui-se que o princípio do centro da gravidade deve ser interpretado com cautela nas relações de trabalho marítimo, considerando a regra basilar de