• Nenhum resultado encontrado

2.3 Durabilidade de dados e recuperac¸˜ao de estado

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.

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.

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.

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.

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 check-

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

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

Cap´ıtulo 3. DDS – Durable DepSpace 26

ficheiro num destes quatro modos:

r: Abre o ficheiro apenas para leitura;

rw: Abre o ficheiro para escrita e leitura;

rws: Semelhante ao modo “rw”, mas faz com que todas as actualizac¸˜oes ao conte´udo e os metadados do ficheiro sejam escritas sincronamente para o dispositivo de arma- zenamento;

rwd: Semelhante ao modo “rw”, mas faz com que todas as actualizac¸˜oes ao conte´udo do ficheiro apenas sejam escritas sincronamente para o dispositivo de armazenamento.

O modo “r” n˜ao nos ´e ´util, pois apenas permite o acesso para leitura e n´os precisamos de escrever no ficheiro. O modo “rw” entrega os dados ao sistema operativo que, como j´a foi discutido, os armazena em mem´oria. Os ´unicos modos que forc¸am as escritas para disco s˜ao os modos “rws” e “rwd”. O que difere nestes dois modos ´e o facto de o primeiro, para al´em de forc¸ar as actualizac¸˜oes ao conte´udo, forc¸a tamb´em as actualizac¸˜oes aos metadados do ficheiro (informac¸˜ao adicional sobre o ficheiro, como por exemplo o seu tamanho, data da ´ultima modificac¸˜ao e permiss˜oes de acesso), enquanto o primeiro forc¸a apenas as actualizac¸˜oes ao conte´udo. A ´unica condic¸˜ao imposta pelo utilizac¸˜ao de um RandomAccessFile ´e a presenc¸a do ficheiro de destino no disco local (e n˜ao num sistema de ficheiros distribu´ıdo, por exemplo). Caso esta condic¸˜ao n˜ao se verifique, n˜ao ´e garantido que as actualizac¸˜oes ao ficheiro surtam efeito.

Para al´em de forc¸ar as escritas para disco, foi ainda utilizada a pr´e-alocac¸˜ao do fi- cheiro de log. A pr´e-alocac¸˜ao do ficheiro em disco permite definir antecipadamente um dado n´umero de bytes em disco, que ficam reservados `a escrita do ficheiro, diminuindo a latˆencia das escritas para o ficheiro que n˜ao fac¸am o ficheiro aumentar para l´a do n´umero de bytes pr´e-alocados. Assim, as escritas para ficheiro ser˜ao mais r´apidas, dado n˜ao ser necess´ario alocar recursos antes de cada escrita. No cap´ıtulo 4, apresentamos resultados que justificam a escolha do modo “rwd” na escrita dos ficheiros utilizados no DDS.

Grupos de mensagens. Com o aumento do n´umero de clientes, o n´umero de mensagens no servic¸o tamb´em aumenta, fazendo com que o processamento de apenas uma mensa- gem aumente a latˆencia de cada operac¸˜ao. O processamento de um grupo, ou batch, de mensagens permite ao DDS responder de uma s´o vez a v´arias mensagens que se encon- trem pendentes, diminuindo assim a latˆencia de cada operac¸˜ao e aumentando d´ebito do sistema.

No entanto, as escritas para disco imp˜oem sempre uma latˆencia adicional no servic¸o, por muito pequena que seja. A escrita de grupos de operac¸˜oes para disco reduziria essa latˆencia, pois a latˆencia da escrita simultˆanea de v´arias operac¸˜oes ser´a inferior `a da escrita

Cap´ıtulo 3. DDS – Durable DepSpace 27

alternada das mesmas. Com estes resultados podemos ent˜ao optimizar o DDS para escre- ver grupos de mensagens em simultˆaneo para disco, ao inv´es de uma mensagem de cada vez, de forma a aumentar o d´ebito do sistema. Assim, quando o nosso servic¸o recebe um grupo de mensagens, executa todas as operac¸˜oes contidas nessas mensagens e em seguida escreve para disco todas as operac¸˜oes de uma vez s´o.

Logging paralelo. As escritas das operac¸˜oes do DDS para os discos das r´eplicas imp˜oem uma latˆencia adicional na execuc¸˜ao das operac¸˜oes, o que afecta o desempenho do sis- tema. Como a latˆencia de um grupo de mensagens dentro do sistema (lat batch) ´e defi- nida pela latˆencia da sua execuc¸˜ao (lat exec) somada `a latˆencia da sua escrita para disco (lat write), temos ent˜ao de diminuir lat write de forma a n˜ao atrasar em demasia a en- trega de respostas aos clientes.

Para isso, paraleliz´amos as escritas para disco e a execuc¸˜ao de operac¸˜oes, o que dimi- nui lat batch para max(lat exec, lat log), como pode ser observado na figura 3.3. Note que a eficiˆencia deste m´etodo depende de lat log ≈ lat exec, o que requer batches de muitas mensagens, j´a que lat exec cresce linearmente com o tamanho do batch e lat log varia menos com o aumento do tamanho do batch. Esta optimizac¸˜ao permite garantir a durabilidade dos dados armazenados no DDS com um d´ebito muito melhor do que o conseguido com o logging n˜ao paralelo, como poderemos observar no cap´ıtulo 4.

Figura 3.3: Logging de operac¸˜oes s´ıncrono (`a esquerda) e paralelo (`a direita).

3.2.2

Checkpointing

Como j´a referido, os ficheiros de checkpoint s˜ao criados de modo a limitar o crescimento dos ficheiros de log. Enquanto os ficheiros de log contˆem as operac¸˜oes enviadas pelos clientes, o ficheiros de checkpoint contˆem o estado do sistema no momento em que s˜ao criados. Isto significa que, no momento da criac¸˜ao de um checkpoint, uma r´eplica p´ara de executar operac¸˜oes dos clientes e escreve o seu estado actual para o disco.

Para obter todo o estado actual do sistema, foi criada uma nova operac¸˜ao no DepSpace, a rdAll(), que devolve todos os tuplos presentes em todos os espac¸os de tuplos existentes. O novo checkpoint permite a remoc¸˜ao das operac¸˜oes do log que o antecedem, visto que o seu conte´udo reflecte as alterac¸˜oes no estado impostas por essas mesmas operac¸˜oes.

Cap´ıtulo 3. DDS – Durable DepSpace 28

No entanto, existe uma dificuldade na remoc¸˜ao do ficheiro de log. Por um lado, ele n˜ao pode ser removido antes da criac¸˜ao dos ficheiros de checkpoint, pois a existˆencia de uma falha entre a remoc¸˜ao e a criac¸˜ao de ficheiros poderia levar a que os dados dos clientes se perdessem, contradizendo a propriedade de durabilidade. Por outro lado, n˜ao podem ser removidos depois, porque a ocorrˆencia de uma falha ap´os a criac¸˜ao do checkpoint levaria o sistema a recuperar e a assumir que o log ´e mais recente do que o checkpoint. Isto faria o sistema executar em primeiro lugar as operac¸˜oes no checkpoint, sobrepondo depois as operac¸˜oes presentes no log. Como os checkpoints contˆem o estado presente no logque os antecede, a execuc¸˜ao errada destes ficheiros levaria uma mesma operac¸˜ao a ser executada duas vezes. Como as operac¸˜oes do DDS n˜ao s˜ao idempotentes, ao contr´ario do

Documentos relacionados