Baixe o app para aproveitar ainda mais
Prévia do material em texto
Sistema Distribuídos, resumo capítulo 07 Consistência e Replicação Chrystian Paulino Nunes A replicação de dados é uma questão muito importante em sistemas distribuídos. Dados são replicados para aprimorar a confiabilidade e melhorar o desempenho, mas um dos principais problemas é deixar essas réplicas consistentes e isso significa que, quando uma cópia é atualizada, precisamos assegurar que todas as outras também atualizem, se não, as réplicas deixaram de ser iguais. Antes de mais nada, temos que entender por que razões a importância de replicar dados se dar. A replicação pode ser uma técnica para conseguir escalabilidade. Há duas razões primárias para replicar dados: confiabilidade e desempenho. Dados são replicados para aumentar sua confiabilidade, por exemplo, se um sistema de arquivos for replicado, podemos continuar trabalhando mesmo após a queda de uma réplica simplesmente com a comutação para uma das outras réplicas, toda vida, manter várias cópias possibilita oferecer melhor proteção contra dados corrompidos. A replicação para conseguir desempenho é importante quando um sistema distribuído precisa ser ampliado em quantidade e área geográfica. A ampliação ocorre, por exemplo, quando um número cada vez maior de processos precisa acessar dados que são gerenciados por um único servidor, podendo melhorar o desempenho ao se replicar o servidor e dividir o trabalho. A ampliação em relação a área geográfica também pode exigir replicação, tendo como ideia colocar uma cópia dos dados próximos ao processo que os está usando, assim o tempo de acesso diminui e o desempenho aumenta. O problema da replicação é que ter múltiplas cópias de dados pode levar a sérios problemas de consistência. Sempre que uma cópia é modicada ela se torna diferente das restantes e em decorrência disso é preciso modificar todas as cópias para garantir a consistência. Para melhorar o desempenho os browsers web costumam armazenar no local uma cópia de uma página web que já foi acessada anteriormente, isto é, colocam a página em cache. Replicação e cache para melhorar o desempenho encontram ampla aplicação como técnicas de aumento do tamanho. Um provável compromisso que vai precisar ser feito é que para manter as cópias atualizadas requer mais largura de banda de rede. Um problema mais sério ainda é que manter várias cópias consistentes pode, por si só, estar sujeito a sérios problemas de escalabilidade. A ideia fundamental é que uma atualização seja realizada em todas as cópias como uma única operação atômica, ou transação, mas as dificuldades surgem pelo fato que precisamos sincronizar todas as réplicas. Toda via, por ouro lado, esses problemas de escalabilidade pode ser amenizados pela aplicação de replicação e cache, mas que resulta em menor desempenho, por outro lado manter todas as cópias consistentes em geral requer sincronização global, que são inerentemente cara em termos de desempenho. Em muitos casos, a solução real é relaxar as restrições de consistências, mas assim as cópias nem sempre podem ser iguais em todos os lugares. Por tradição, a consistência tem sido discutida no contexto de operações de leitura e escrita em dados compartilhados disponíveis por meio de memória compartilhada, de um banco de dados compartilhado ou de um sistema de arquivos. Um depósito de dados pode ser distribuído por várias máquinas, a ideia é que cada processo que pode acessar dados do deposito tem uma cópia local disponível do deposito inteiro. Um modelo de consistência é, em essência, um contrato entre processos e deposito de dados. Se os processos coordenarem e obedecerem a certas regras o deposito funcionara de maneira correta. A replicação de dados propõe problemas de consistência que não podem ser resolvidos com eficiência de modo geral. Há modos diferentes para as aplicações especificarem quais inconsistências elas podem tolerar. Adota-se três eixos independentes para definir inconsistências: desvio em valores numéricos entre replicas, desvio em idade entre replicas e desvio em relação a ordenação de operações de atualizações. Esses desvios são referenciados como se fossem consistência contínua. Além de consistência contínua, já um imenso acervo de trabalho sobre modelos de consistência centrados em dados acumulado em décadas passadas. Todos os modelos tratam de ordenar operações consistentemente em dados compartilhados replicados. Em principio, os modelos ampliam os de consistência continua no sentido de que, quando for preciso comprometer atualizações provisórias em replicas, estas terão que chegar a um acordo sobre uma ordenação global dessas atualizações, isso quer dizer que as replicas precisam concordar com uma ordenação consistente dessas atualizações. A consistência sequencial é um importante modelo de consistência centrado em dados que foi definido pela primeira vez por Lamport no contexto de memória compartilhada para sistemas multiprocessadores. Dizemos que um deposito de dados é sequencialmente consistente quando: “O resultado de qualquer execução é o mesmo que seria se suas operações realizadas por todos os processos no depósito de dados fossem executadas na mesma ordem sequencial e as operações de cada processo individual aparecessem nessa sequencia na ordem especifica por seu programa.” O modelo de consistência causal representa um enfraquecimento da consistência sequencial no sentido de que faz uma distinção entre eventos que são potencialmente relacionados por causalidade e os que não são. Para um deposito de dados ser considerado consistente por causalidade, é preciso que ele obedeça a condição: “Escritas que são potencialmente relacionadas por causalidade devem ser vistas por todos os processos na mesma ordem.” Implementar consistência causal requer monitorar quais processos viram quais escritas. Significa construir e manter um gráfico de dependência que mostre qual operação é dependente de quais outras operações e uma maneira de fazer isso se dá por meio de marcas de tempo vetoriais. A capacidade de manipular operações concorrentes sobre dados compartilhados e manter a consistência sequencial é fundamental para sistemas distribuídos. Deposito de dados de consistência eventual tem a prioridade de na ausência de atualizações, todas as replicas convergem em direção a copias idênticas umas as outras. Modelos de consistência centrados no cliente se originam do trabalho com o Bayou, que é um sistema de banco de dados desenvolvido para computação móvel, no qual a premissa é que a conectividade de rede é não confiável e sujeita a vários problemas de desempenho. Redes sem fio e redes que abrangem grandes áreas, como a internet, caem nessa categoria. O Bayou distingue quatro modelos de consistência diferentes. São esses: ● Leituras monotonicas, se um processo ler o valor de um item de dados x, qualquer operação de leitura sucessiva de x executada por esse processo sempre retornara o mesmo valor ou um valor mais recente. ● Escritas monotonicas, se dá quando uma operação de escrita executada por um processo em um item de dado x é concluída antes de qualquer operação de escrita sucessiva em x pelo mesmo processo. ● Leia-suas-escritas, quando o efeito de uma operação por escrita por um processo no item de dados x sempre será visto por uma operação de leitura sucessiva em x pelo mesmo processo. ● Escritas-seguem-leituras, garante que uma operação de escrita em um processo por um item de dados x em seguida a uma operação de leituraanterior em x pelo mesmo processo ocorre sobre o mesmo valor, ou sobre o valor mais recente de x que foi lido. Uma questão relevante para qualquer sistema distribuído que suporta replicação é decidir onde, quando e por quem as replicas devem ser posicionadas e, na sequencia, quais mecanismos usar para manter as replicas consistentes. O problema do posicionamento deve ser subdividido em dois grupos: posicionar servidores de replicas e posicionar conteúdo. Posicionar servidores e replicas possuem vários modos de calcular o melhor posicionamento de servidores de replicas. Ocorre que o posicionamento de servidor não percebido pelo cliente obtem resultados similares ao posicionamento percebido pelo cliente se adotarmos como premissa que os clientes estão distribuídos uniformemente pela internet. Quando se trata de posicionamento de conteúdo, podemos distinguir três diferentes tipos de replicas organizadas logicamente: ● Réplicas permanentes. ● Réplicas iniciadas pelo servidor. ● Réplicas iniciadas pelo cliente. O gerenciamento de replicas trata da propagação de conteúdo para servidores de replicas relevantes. Uma importante questão de projeto, refere-se aquilo que, na verdade, deve ser propagado. Basicamente, há três habilidades: Propagar somente uma notificação de uma atualização; Transferir dados de uma cópia para outra; Propagar a operação de atualização para outras cópias. Propagar uma notificação é o que fazem os Protocolos de Invalidação. Em um protocolo de invalidação, outras cópias são informadas de que uma atualização ocorreu e que os dados que elas contem não são mais validos. A invalidação pode especificar que parte do deposito de dados foi atualizada, de modo que somente parte de uma copia esta realmente invalidada. A principal vantagem dos protocolos de invalidação é que eles usam pouca largura de banda de rede. Tais protocolos funcionam geralmente melhor quando há muitas operações de atualização em comparação com operações de leitura. Em uma abordagem baseada em envio, também denominada protocolo baseado em servidor, as atualizações são propagadas para outras replicas sem que essas replicas tenham solicitado essas atualizações. A necessidade de um alto grau de consistência esta relacionada com o fato de que replicas permanentes e iniciadas por servidor, bem como grandes caches compartilhados, costumam ser compartilhados pormuitos clientes que executam principalmente operações de leitura. Por isso razão leitura/atualização em cada replica é relativamente alta. Nesses casos, protocolos baseados em envio de atualizações são eficientes no sentido de que se pode esperar que toda atualização enviada seja útil para um ou mais leitores. Ao contrário, em uma abordagem baseada em recuperação de atualizações, um servidor ou cliente requisita que outro servidor lhe envie quaisquer atualizações que ele tiver no momento em questão. Protocolos baseados em recuperação de atualizações, também denominados protocolos baseados no cliente, costumam ser usados por caches de clientes. Um leasing é uma promessa feita por um servidor de que ele enviará atualizações ao cliente por tempo especificado. Leasings foram introduzidos pela primeira vez fornecendo um mecanismo conveniente para comunicação dinâmica entre uma estratégia baseada em envio e uma baseada em recuperação de atualizações. Os autores distinguem três tipos de leasings: Leasings baseado em idade, baseado em frequência e por ultimo por critério de sobrecarga de estado de espaço do servidor. A implementação de modelos de consistência utiliza protocolos de consistência. Um protocolo de consistência descreve uma implementação de um modelo de consistência especifico. Foram desenvolvidos vários protocolos para lidar com as três formas de consistência. Temos várias soluções, tais como: ● Limitação de desvio numérico ● Limitação de desvio de idade ● Limitação de desvio de ordenação De modo geral, na prática as aplicações distribuídas seguem modelos de consistência. Entre esses estão o de limitação de desvio de idade, em menor medida, e limitação de desvios numéricos. É preciso impor uma ordenação de escritas provisórias globalmente conmsistente. Dentre os modos de fazer isso, são utilizados os protocolos baseados em primários ou em quórum. ● O protocolo mais simples baseado em primário é o protocolo de escrita remota. ● Protocolo de escrita loca, protocolo variante dos protocolos primários e backup é aquela emque a copia primaria migra entre processos. ● Protocolo baseado em quórum, suporta escritas replicadas, usando votação. A ideia básica é exigir que clientes requisitem e adquiram a permissão de vários servidores antes de ler ou escrever um item de dados replicado
Compartilhar