• Nenhum resultado encontrado

TSC: uma abordagem para o controle de restrições de integridade em bancos de dados eventualmente consistentes

N/A
N/A
Protected

Academic year: 2021

Share "TSC: uma abordagem para o controle de restrições de integridade em bancos de dados eventualmente consistentes"

Copied!
111
0
0

Texto

(1)

TSC: UMA ABORDAGEM PARA O CONTROLE DE RESTRIC¸ ˜OES DE INTEGRIDADE EM BANCOS DE

DADOS EVENTUALMENTE CONSISTENTES

Disserta¸c˜ao submetida ao Programa de P´os-Gradua¸c˜ao em Ciˆencia da Com-puta¸c˜ao para a obten¸c˜ao do Grau de Mestre em Ciˆencia da Computa¸c˜ao. Orientador: Prof. Frank Augusto Si-queira

Florian´opolis 2017

(2)

Flores, Paulo Arion

TSC: Uma abordagem para o controle de restrições de integridade em bancos de dados eventualmente consistentes / Paulo Arion Flores ; orientador, Frank Augusto Siqueira, 2017.

111 p.

Dissertação (mestrado) - Universidade Federal de Santa Catarina, Centro Tecnológico, Programa de Pós Graduação em Ciência da Computação, Florianópolis, 2017.

Inclui referências.

1. Ciência da Computação. 2. Bancos de Dados Distribuídos (BDDs). 3. Restrições de Integridade. 4. Consistência Eventual. 5. NoSQL. I. Siqueira, Frank Augusto. II. Universidade Federal de Santa

Catarina. Programa de Pós-Graduação em Ciência da Computação. III. Título.

(3)

TSC: UMA ABORDAGEM PARA O CONTROLE DE RESTRIC¸ ˜OES DE INTEGRIDADE EM BANCOS DE

DADOS EVENTUALMENTE CONSISTENTES

Esta Disserta¸c˜ao foi julgada aprovada para a obten¸c˜ao do T´ıtulo de “Mestre em Ciˆencia da Computa¸c˜ao”, e aprovada em sua forma final pelo Programa de P´os-Gradua¸c˜ao em Ciˆencia da Computa¸c˜ao.

Florian´opolis, 20 de agosto 2017.

Prof. Dr. Jos´e Lu´ıs Almada G¨untzel Coordenador do Curso Banca Examinadora:

(4)

Prof. Mario Antonio Ribeiro Dantas Universidade Federal de Santa Catarina

Prof. Ronaldo dos Santos Mello Universidade Federal de Santa Catarina

Prof. Fabiano Baldo

(5)

que os filhos estudassem em uma univer-sidade e ao sobrinho Dante, novo membro da fam´ılia.

(6)
(7)

Agrade¸co ao meu orientador Frank Siqueira, pela nova amizade, por me dar essa oportunidade de voltar a estudar na UFSC, me acom-panhar em todo o processo de escolha e realiza¸c˜ao do projeto da dis-serta¸c˜ao e elabora¸c˜ao de artigos, pelos conselhos dados, paciˆencia, in-cont´aveis revis˜oes e dicas de como escrever e desenvolver o projeto. Agrade¸co a Rossana Cunha, pelo carinho, ter sido parceira e por ter dividido comigo os momentos de estudo em hor´arios alternativos de-gustando ch´as de diferentes lugares. Agrade¸co a minha irm˜a Leandra Flores e ao Emerson Fedechen pelos muitos momentos que passamos juntos todo ano. Ao Denis Dalzotto pelos caf´es e amizade. Agrade¸co ao meu amigo Ramon Hugo, por publicarmos juntos e pela grande ajuda para que eu voltasse a estudar na UFSC, e pelas ´aguas tˆonicas falando bobagem. Agrade¸co a Claudia Pereira pela ajuda no inglˆes na elabora¸c˜ao de artigos e boas conversas. Agrade¸co ao professor Mario Dantas, que sempre procurou realizar trabalhos conjuntos, procurou me ajudar no tema da disserta¸c˜ao e me encaminhou ao meu orientador, sem o qual n˜ao seria poss´ıvel iniciar o curso. Agrade¸co conjuntamente aos professores Mario Dantas e Ronaldo dos Santos Mello pelas observa¸c˜oes para que o meu trabalho fosse aperfei¸coado. Agrade¸co ao Jos´e Ernesto, Pablo Beber e Omar Afif, da Secretaria de Estado da Fazenda de Santa Catarina, pelo apoio e compreens˜ao, o que tornou poss´ıvel realizar o mestrado e continuar trabalhando ao mesmo tempo. Agrade¸co tamb´em a UFSC, que novamente me proporcionou uma forma¸c˜ao que me faz crescer profissionalmente.

(8)
(9)

Com a crescente demanda para armazenamento de dados provenien-tes de sistemas computacionais, os bancos de dados NoSQL surgiram como uma op¸c˜ao de Bancos de Dados Distribu´ıdos (BDDs) para lidar com grandes massas de dados sem comprometer o desempenho do sis-tema. Por´em, diferentemente dos bancos de dados relacionais, os ban-cos de dados NoSQL n˜ao suportam transa¸c˜oes ACID (Atomicidade, Consistˆencia, Isolamento e Durabilidade) que visam garantir a con-sistˆencia dos dados, dificultando o desenvolvimento de aplica¸c˜oes que necessitam manter algumas invariˆancias do sistema. Diferentes abor-dagens surgiram na literatura com o intuito de manter a integridade em BDDs: o uso de Replicated Data Types (RDTs) para controlar o conflito de opera¸c˜oes de atualiza¸c˜ao; e o uso de diferentes modelos de consistˆencia para cada tipo de opera¸c˜ao, empregando l´ogica de primeira ordem (FOL) e provadores de teoremas (TP). N˜ao obstante, o uso de RDTs e a descri¸c˜ao de Restri¸c˜oes de Integridade (RIs) atrav´es de FOL ainda s˜ao de dif´ıcil utiliza¸c˜ao para os desenvolvedores. Com o objetivo de simplificar a constru¸c˜ao de aplica¸c˜oes que necessitam de consistˆencia em BDDs, esta disserta¸c˜ao define uma abordagem para a constru¸c˜ao de RIs na camada de aplica¸c˜ao utilizando RDTs com base nos poss´ıveis estados de transi¸c˜ao das opera¸c˜oes, denominada Transition State Con-sistency (TSC). A abordagem TSC extrai as opera¸c˜oes de uma RI em um RDT e define a consistˆencia de cada opera¸c˜ao, levando em consi-dera¸c˜ao a semˆantica das invariˆancias e as poss´ıveis anomalias dessas invariˆancias quando utilizadas em BDDs. Nos experimentos realizados em um BDD com consistˆencia eventual, em cen´arios em que diversas opera¸c˜oes impactam RIs, foi justificado o uso da abordagem TSC para o controle da consistˆencia, j´a que a diferencia¸c˜ao das opera¸c˜oes pelo estado de transi¸c˜ao permitiu reduzir a quantidade de opera¸c˜oes exe-cutadas com consistˆencia forte, causando uma melhora significativa no desempenho do sistema.

Palavras-chave: Bancos de Dados Distribu´ıdos (BDDs). NoSQL. Restri¸c˜oes de Integridade (RIs). RDT. Consistˆencia Eventual.

(10)
(11)

With the increasing demand for data storage from computational sys-tems, NoSQL databases have emerged as an option of Distributed Da-tabases (BDD) in order to handle a significant amount of data without compromising system’s performance. However, unlike relational data-bases, NoSQL databases mostly have no ACID transactions (Atomicity, Consistency, Isolation, and Durability) designed to ensure data consis-tency, hindering the development of applications that need to maintain some system invariance. Different approaches have emerged in the li-terature to support integrity in BDDs: the use of replicated data types (RDTs) to control conflicting updates; and the use of different consis-tencies models for each type of operation, using first-order logic (FOL) and theorem provers (TP). Notwithstanding, the use of RDT or the integrity constraints (RI) descriptions through languages using FOL is still difficult to be used by programmers. Aiming to simplify the cons-truction of applications that require consistency in BDDs, this work proposes an approach to the creation of RIs at the application layer, using RDTs based on the possible states of transition of operations, cal-led Transition State Consistency (TSC). The TSC approach extracts the operations of an RI in an RDT and defines the consistency of each operation, taking into account the semantics of the invariances and the possible anomalies of those invariances when using BDDs. In the expe-riments carried out in a BDD with eventual consistency with scenarios in which several operations impact RIs, the use of the TSC approach for consistency control was justified since the differentiation of operati-ons by the transition state allowed to reduce the number of operatioperati-ons performed with strong consistency, causing a significant improvement in system performance.

Keywords: Distributed Databases (DDBs). NoSQL. Integrity Cons-traints. RDT. Eventual Consistency.

(12)
(13)

Figura 1 Exemplo de um RDT em BDDs. . . 43

Figura 2 Arquitetura TSC. . . 58

Figura 3 Persistˆencia dos RDTs. . . 59

Figura 4 Mapeamento de consistˆencia por opera¸c˜ao. . . 61

Figura 5 Modelo de dados. . . 63

Figura 6 Exemplo com TSC. . . 66

Figura 7 Mapeamento das opera¸c˜oes para cria¸c˜ao dos RDTs. . . 67

Figura 8 Exemplos de anomalias. . . 69

Figura 9 Exemplo de uso da abordagem TSC. . . 73

Figura 10 Arquitetura do experimento. . . 77

Figura 11 Modelo de dados do experimento. . . 79

Figura 12 RDTs dos casos do experimento. . . 80

Figura 13 Tempo de dura¸c˜ao total das opera¸c˜oes da inequa¸c˜ao. . . . 81

Figura 14 Throughput das opera¸c˜oes da inequa¸c˜ao. . . 82

Figura 15 Erros ocorridos nas opera¸c˜oes da inequa¸c˜ao. . . 83

Figura 16 Tempo de dura¸c˜ao total das opera¸c˜oes de chave estran-geira. . . 84

Figura 17 Throughput das opera¸c˜oes da chave estrangeira. . . 85

Figura 18 Erros evitados nas opera¸c˜oes da chave estrangeira. . . 86

Figura 19 Tempo de dura¸c˜ao total das opera¸c˜oes da inferˆencia. . . . 87

Figura 20 Throughput das opera¸c˜oes da inferˆencia. . . 88

(14)
(15)

Tabela 1 Caracter´ısticas de cada aplica¸c˜ao. . . 54 Tabela 2 Consistˆencia necess´aria nas opera¸c˜oes com TSC. . . 71 Tabela 3 Compara¸c˜ao do TSC com os trabalhos relacionados. . . . 90 Tabela 4 Artigos publicados. . . 111

(16)
(17)

ACID Atomicidade, Consistˆencia, Isolamento e Durabilidade ADS Abstract Data Store

ADT Abstract Data Type BD Banco de Dados

BDDs Bancos de dados distribu´ıdos CRDT Conflict-free replicated data type EC Consistˆencia Eventual

FOL L´ogica de primeira ordem MAV Monotonic Atomic View MVC Model-view-controller ORM Object-relational mapping RC Read Committed

RDT Replicated data type RI Restri¸c˜ao de Integridade RR Repeatable Read

SMT Satisfiability modulo theories TP Theorem Prover

(18)
(19)

1 INTRODUC¸ ˜AO . . . 21 1.1 JUSTIFICATIVA . . . 25 1.2 OBJETIVO GERAL . . . 26 1.3 OBJETIVOS ESPEC´IFICOS . . . 26 1.4 METODOLOGIA . . . 26 1.5 ORGANIZAC¸ ˜AO DO TEXTO . . . 27

2 BANCOS DE DADOS NOSQL . . . 29

2.1 BANCOS DE DADOS CHAVE-VALOR . . . 29

2.2 BANCOS DE DADOS ORIENTADOS A COLUNA . . . 30

2.3 BANCOS DE DADOS ORIENTADOS A DOCUMENTO 31 2.4 BANCOS DE DADOS ORIENTADOS A GRAFOS . . . 32

2.5 BANCOS DE DADOS NOSQL X BANCOS DE DADOS NEWSQL . . . 33

2.6 CONSIDERAC¸ ˜OES FINAIS DO CAP´ITULO . . . 34

3 CONSIST ˆENCIA EM BANCOS DE DADOS . . . . 37

3.1 CONSIST ˆENCIA SEM ˆANTICA . . . 37

3.2 CONSIST ˆENCIA EM TRANSAC¸ ˜OES . . . 40

3.3 CONSIST ˆENCIA NA DISTRIBUIC¸ ˜AO E REPLICAC¸ ˜AO 41 3.4 CONSIST ˆENCIA EVENTUAL . . . 42

3.5 RDT . . . 42

3.6 CONSIDERAC¸ ˜OES FINAIS DO CAP´ITULO . . . 43

4 REVIS ˜AO BIBLIOGR ´AFICA . . . 45

4.1 QUELEA . . . 45 4.2 ADS . . . 47 4.3 INDIGO . . . 49 4.4 CISE . . . 50 4.5 REDBLUE E SIEVE . . . 51 4.6 I-CONFLUENCE . . . 52 4.7 PROTOCOLO HOMEOSTASIS . . . 52

4.8 CONSIDERAC¸ ˜OES FINAIS DO CAP´ITULO . . . 53

5 TSC . . . 57

5.1 ARQUITETURA DE SOFTWARE . . . 57

5.2 QUELEA COM TSC . . . 59

5.3 MODELO DE DADOS . . . 62

5.4 RESTRIC¸ ˜OES DE INTEGRIDADE . . . 64

5.5 RDTS, CONTRATOS E TSC . . . 68

(20)

5.6 CONSIDERAC¸ ˜OES FINAIS DO CAP´ITULO . . . 74 6 AVALIAC¸ ˜AO DA PROPOSTA . . . 77 6.1 AVALIAC¸ ˜AO EXPERIMENTAL . . . 77 6.1.1 Caso 1 . . . 80 6.1.2 Caso 2 . . . 84 6.1.3 Caso 3 . . . 86

6.1.4 Considera¸c˜oes Finais dos Experimentos . . . 89

6.2 AN ´ALISE QUALITATIVA . . . 89

6.3 CONSIDERAC¸ ˜OES FINAIS DO CAP´ITULO . . . 94

7 CONCLUS ˜OES E TRABALHOS FUTUROS . . . . 97

7.1 CONTRIBUIC¸ ˜OES . . . 98

7.2 TRABALHOS FUTUROS . . . 99

REFER ˆENCIAS . . . 103

(21)

1 INTRODUC¸ ˜AO

BDDs hoje s˜ao uma tendˆencia para as novas aplica¸c˜oes que sur-gem no mercado. Requisitos como a disponibilidade, desempenho e escalabilidade come¸cam a fazer parte do conhecimento necess´ario que desenvolvedores de sistemas e profissionais em banco de dados (BD) devem possuir. O aumento da capacidade vertical de servidores de aplica¸c˜ao, aumentando a mem´oria e o n´umero de processadores para oferecer maior disponibilidade e desempenho, n˜ao ´e suficiente para al-gumas aplica¸c˜oes, sendo necess´aria a distribui¸c˜ao do processamento e do armazenamento (POKORNY, 2013).

BDs relacionais foram adaptados para permitir trabalhar de for-ma distribu´ıda, por´em, com uma grande complexidade envolvida, j´a que garantir as propriedades ACID n˜ao ´e algo facilmente escal´avel ( PO-KORNY, 2013). O surgimento da Web 2.0 e de aplica¸c˜oes com integra¸c˜ao com smarthphones, tablets e outros dispositivos m´oveis permitiu o ar-mazenamento de uma vasta quantidade de dados de diferentes fontes e estruturas. Esse crescimento criou uma demanda por BDs mais apro-priados que os BDs relacionais para trabalhar com essa quantidade de informa¸c˜oes.

BDs NoSQL apareceram como uma das solu¸c˜oes alternativas para o armazenamento, como no caso do Bigtable (CHANG et al., 2008). A escalabilidade dos BDs chamados NoSQL acontece de forma mais natural devido a sua estrutura de dados e `a forma de consistˆencia ofe-recida. Existem diversos modelos usados em bancos NoSQL, sendo os principais os que trabalham com chave-valor, apropriados para armaze-namento de informa¸c˜oes sem estrutura de dados, em que a recupera¸c˜ao dos dados acontecem somente pela chave do registro; os BDs orien-tados a documentos, que possibilitam a cria¸c˜ao de estruturas com o uso de formatos como XML ou JSON (SADALAGE; FOWLER, 2012); BDs orientados a coluna, que permitem o armazenamento dos mes-mos tipos de informa¸c˜ao em uma coluna, possibilitando a utiliza¸c˜ao de indexa¸c˜ao e compress˜ao dos dados de forma mais eficiente; e BDs de grafos, vi´aveis para modelos de dados que possuem muitos relaciona-mentos. BDs NewSQL surgiram para oferecer a escalabilidade dos BDs NoSQL e ao mesmo tempo suportar transa¸c˜oes utilizando as proprie-dades ACID e um modelo de dados relacional, procurando trazer para o desenvolvedor, acostumado com BDs relacionais, uma maior facili-dade na adapta¸c˜ao para trabalhar com BDDs (PAVLO; ASLETT, 2016). Por´em, a utiliza¸c˜ao de outros modelos de dados e a possibilidade de

(22)

ex-plorar de forma mais granularizada o controle da consistˆencia, ou seja, diferenciar a consistˆencia por opera¸c˜ao, ao inv´es de utilizar transa¸c˜oes com garantia ACID, estimulam o uso de BDs NoSQL.

Uma dificuldade encontrada em aplica¸c˜oes com diversas fontes de dados, como aplicativos Mobile e aplicativos Web, ´e a versatilidade do modelo de dados que estes necessitam. BDs e as aplica¸c˜oes clientes possuem um desafio de mapeamento entre os dados persistidos e os dados mantidos em mem´oria, como no caso de BDs relacionais usados por aplica¸c˜oes orientadas a objetos. BDs relacionais possuem como vantagem a possibilidade de interoperabilidade mais simplificada entre diversas aplica¸c˜oes que acessam o mesmo BD por possu´ırem uma alta granularidade, atrav´es da normaliza¸c˜ao das tabelas, permitindo a repre-senta¸c˜ao de diferentes vis˜oes dos dados mais facilmente. Apesar disso, a grande diferen¸ca na estrutura de dados dos modelos de dados usados em aplica¸c˜oes e o modelo relacional gera a necessidade de mapeamento objeto-relacional (ORM). Uma alternativa para isso ´e criar BDs ori-entados para uma aplica¸c˜ao (SADALAGE; FOWLER, 2012), permitindo uma defini¸c˜ao de estrutura dos dados mais rica no BD e dessa forma, evitando uma maior complexidade na tradu¸c˜ao dos dados persistidos para os dados em mem´oria. BDs relacionais trabalham com tuplas e rela¸c˜oes e n˜ao permitem a defini¸c˜ao de estruturas de dados mais com-plexas. Por´em, alguns BDs como o Mysql (ORACLE, 2017a), Oracle (ORACLE, 2017b) e PostgreSQL (GROUP, 2017) fornecem suporte na-tivo para Json e alguns trabalhos surgiram para fornecer suporte nana-tivo de formatos mais complexos em BDs relacionais, como o suporte para o formato XML de forma nativa, usando consultas XQuery (MOHAN, 2013) e o trabalho de (LIU; GAWLICK, 2015) que cria um esquema de dados flex´ıvel em BDs relacionais.

J´a os BDs NoSQL se adaptam melhor para representar dados complexos de aplica¸c˜oes. Os modelos de dados NoSQL permitem cons-truir estruturas mais similares `as estruturas de dados da aplica¸c˜ao. Por´em, modelar a estrutura de dados de aplica¸c˜oes que usam BDs NoSQL resulta em uma maior complexidade para o desenvolvedor do sistema, como, por exemplo, a cria¸c˜ao de estruturas de dados otimiza-dos para consultas (MIOR, 2014). Nos experimentos de (SCHERZINGER et al., 2013) foi simulada a escrita de dados em um ambiente de nu-vem utilizando dois modelos distintos e foi constatada grande diferen¸ca no desempenho e na quantidade de falhas ocorridas, dependendo do modelo escolhido para a representa¸c˜ao dos dados. A complexidade, portanto, fica na escolha do melhor modelo, dependendo da utiliza¸c˜ao da aplica¸c˜ao.

(23)

Por´em, apesar dos BDs NoSQL permitirem o armazenamento de estruturas mais complexas, algumas facilidades normalmente encontra-das em BDs relacionais, como o controle da integridade dos dados, man-tendo a consistˆencia das invariˆancias do sistema, ainda ´e um desafio. Invariˆancias do sistema s˜ao propriedades que a aplica¸c˜ao deve sempre manter verdadeira, como, por exemplo, as RIs. Segundo (GHAZIZADEH; MUKKAMALA; OLARIU, 2013), a integridade em BDs ´e uma das grandes preocupa¸c˜oes na terceiriza¸c˜ao de servi¸cos de tecnologia da informa¸c˜ao, como servi¸cos de nuvens. A integridade em BDs visa garantir o estado dos dados (ou transi¸c˜ao de estados) correto, ou seja, a consistˆencia dos dados. Para isso s˜ao definidas regras atrav´es de declara¸c˜oes chama-das de RIs semˆanticas. Segundo (OZSU; VALDURIEZ¨ , 2001), o controle

dessas RIs ´e um dos requisitos para manter a consistˆencia, al´em do controle de concorrˆencia, da confiabilidade e da prote¸c˜ao.

A integridade em BDDs possui desafios diferenciados. Ao proje-tar o modelo de dados e suas restri¸c˜oes, ´e preciso calcular o impacto em opera¸c˜oes, como consultas e atualiza¸c˜oes, al´em do planejamento da sin-croniza¸c˜ao entre os dados necess´aria para manter a consistˆencia reque-rida pela aplica¸c˜ao. Segundo (OZSU; VALDURIEZ¨ , 2001), v´arias solu¸oes

tˆem sido desenvolvidas procurando diminuir o n´umero de assertivas de integridade utilizadas em opera¸c˜oes no BD. Procura-se, com isso, di-minuir a quantidade de dados acessados, principalmente quando esses dados est˜ao espalhados em parti¸c˜oes diferentes; evitar opera¸c˜oes que acarretam desfazer muitas atualiza¸c˜oes ao detectar uma inconsistˆencia; e aplicar regras de integridade em tempo de compila¸c˜ao sempre que poss´ıvel.

Algumas RIs, como a dependˆencia entre dados, podem se man-ter consistentes em BDs NoSQL que oferecem garantia de atomicidade nas opera¸c˜oes. Com a utiliza¸c˜ao de um modelo de dados com in-forma¸c˜oes “agregadas” (SADALAGE; FOWLER, 2012), em que todos os dados relacionados s˜ao armazenados na mesma unidade de informa¸c˜ao, as opera¸c˜oes de atualiza¸c˜ao, com garantia de atomicidade, sempre s˜ao mantidas consistentes. Por´em, em algumas situa¸c˜oes, a dependˆencia ocorre entre dados n˜ao armazenados na mesma unidade de informa¸c˜ao, sendo necess´ario, para manter a RI entre os dados, que as opera¸c˜oes se-jam sincronizadas e existam mecanismos de recupera¸c˜ao ou preven¸c˜ao tratadas pela pr´opria aplica¸c˜ao devido `a falta de suporte na maioria dos bancos NoSQL. De forma semelhante, quando existe a necessidade de que dados replicados mantenham a consistˆencia entre as r´eplicas, ´e necess´ario que a aplica¸c˜ao crie mecanismos para o controle. Apesar dos BDs relacionais oferecerem um bom suporte para garantir RIs, fazendo

(24)

uso de transa¸c˜oes com propriedades ACID, segundo (SADALAGE; FO-WLER, 2012), isso n˜ao significa que s˜ao adequados para este fim, pois o desempenho das opera¸c˜oes de consulta e escrita se torna problem´atico. Devido ao conflito entre consistˆencia e desempenho em siste-mas geo-replicados, muitos BDs implementaram diferentes combina¸c˜oes de garantias de consistˆencia e protocolos para replica¸c˜ao (ALMEIDA; LEIT ˜AO; RODRIGUES, 2013). Execu¸c˜ao de atualiza¸c˜oes sem sincro-niza¸c˜ao entre os v´arios nodos normalmente ´e alcan¸cada atrav´es de um modelo de consistˆencia mais fraco utilizando BDDs com consistˆencia eventual (EC), em que os dados estar˜ao consistentes em um deter-minado momento. Uma tendˆencia atual ´e oferecer tanto modelos de consistˆencia forte como modelos de consistˆencia fraca, em BDDs com EC, dependendo de cada opera¸c˜ao, pois nem todas as opera¸c˜oes ne-cessitam de garantias de consistˆencia fortes. Ao contr´ario dos modelos de consistˆencia forte, como o modelo linear, que oferece para o de-senvolvedor uma semˆantica intuitiva (ALMEIDA; LEIT ˜AO; RODRIGUES, 2013), os sistemas com m´ultiplos modelos de consistˆencia s˜ao de dif´ıcil implementa¸c˜ao, pois ´e necess´ario que cada opera¸c˜ao seja classificada corretamente a fim de garantir a consistˆencia requerida pela aplica¸c˜ao. Para definir e controlar os diversos modelos de consistˆencia para as opera¸c˜oes podem ser utilizadas implementa¸c˜oes na camada de aplica-¸c˜ao, atrav´es de extens˜oes do BD em uso, possibilitando, dessa forma, que os modelos de consistˆencia possam ser representados atrav´es de lin-guagens de programa¸c˜ao e controlados atrav´es de solu¸c˜oes na camada de aplica¸c˜ao. Uma das formas em que os modelos de consistˆencia po-dem ser especificados ´e atrav´es do uso de FOL, sendo que uma das formas de declarar e controlar RIs ´e atrav´es do uso de RDTs. RDT ´e um tipo de dado que encapsula vari´aveis cujos valores podem sofrer al-tera¸c˜oes de forma concorrente em diferentes servidores e mesmo assim convergir de forma consistente na combina¸c˜ao das opera¸c˜oes realiza-das no RDT em cada servidor. Originalmente os RDTs s˜ao tipos de dados para valores replicados que devem assegurar que, em um ambi-ente com EC, a resolu¸c˜ao de conflitos entre as r´eplicas seja uniforme e que convirja para o mesmo valor (BURCKHARDT et al., 2014). Desse modo, RDTs se tornam uma op¸c˜ao para encapsular as opera¸c˜oes re-lacionadas `as RIs em BDDs com EC. A escolha do modelo adequado de consistˆencia para cada opera¸c˜ao de um RDT pode ser especificado atrav´es do uso de FOL (SIVARAMAKRISHNAN; KAKI; JAGANNATHAN, 2015), pois ´e poss´ıvel declarar as rela¸c˜oes entre as opera¸c˜oes do RDT e utilizar TP para escolher o modelo apropriado de consistˆencia. Com isso, o controle das RIs ´e realizado na camada de aplica¸c˜ao, sem a

(25)

neces-sidade de suporte espec´ıfico nos BDs. Apesar disso, as implementa¸c˜oes de RDTs existentes descrevem invariˆancias de uma vari´avel em sua es-pecifica¸c˜ao, sendo que, algumas RIs s˜ao especificadas utilizando mais de uma vari´avel, o que exige uma complexidade maior de controle dos RDTs ao serem utilizadas em BDDs eventualmente consistentes.

1.1 JUSTIFICATIVA

BDs que n˜ao implementam as propriedades ACID em sua to-talidade somente podem ser eventualmente consistentes (POKORNY, 2013). Dessa forma, ao inv´es de usar transa¸c˜oes com propriedades ACID, aplica¸c˜oes que utilizam EC procuram controlar programatica-mente a sincroniza¸c˜ao das atualiza¸c˜oes a fim de manter a consistˆencia no final das opera¸c˜oes. BDs NoSQL utilizam EC nas opera¸c˜oes, evi-tando o uso de consistˆencia forte e transa¸c˜oes com propriedades ACID (POKORNY, 2013). Por essa raz˜ao, BDs NoSQL levam o desenvolvedor do sistema a gastar muito tempo com a implementa¸c˜ao de controles de poss´ıveis inconsistˆencias (PAVLO; ASLETT, 2016), com uma grande complexidade na implementa¸c˜ao de opera¸c˜oes de atualiza¸c˜ao e leitura dos dados. Isso porque deve ser de conhecimento pr´evio do desenvol-vedor o n´ıvel de consistˆencia requerido por cada tipo de opera¸c˜ao da aplica¸c˜ao. Em sistemas distribu´ıdos, a replica¸c˜ao e a distribui¸c˜ao dos dados tamb´em dificultam o controle da consistˆencia.

A extra¸c˜ao das RIs e das opera¸c˜oes em um n´ıvel intermedi´ario que permita o mapeamento para n´ıveis de consistˆencia necess´arios por cada opera¸c˜ao, de acordo com as RIs descritas, permite uma dimi-nui¸c˜ao da complexidade para o desenvolvedor do sistema ao projetar um sistema que mantenha as garantias de consistˆencia. Al´em disso, ´

e poss´ıvel economizar recursos, pois a classifica¸c˜ao das opera¸c˜oes per-mite utilizar o modelo de consistˆencia mais fraco poss´ıvel que atenda as RIs, favorecendo com isso o desempenho e a disponibilidade. Por´em, apesar da existˆencia de formas de representar na camada de aplica¸c˜ao invariˆancias do sistema, assim como formas de especificar a consistˆencia por opera¸c˜ao, existe uma complexidade em encontrar formas de espe-cificar invariˆancias mais complexas, como chaves estrangeiras e fun¸c˜oes envolvendo mais de uma vari´avel.

(26)

1.2 OBJETIVO GERAL

Este trabalho tem como objetivo desenvolver uma abordagem para possibilitar a cria¸c˜ao, na camada de aplica¸c˜ao, de um modelo de dados intermedi´ario que represente e controle RIs simples e complexas, possibilitando que uma aplica¸c˜ao com RIs utilize BDs replicados com EC.

1.3 OBJETIVOS ESPEC´IFICOS

Este trabalho pretende alcan¸car os seguintes objetivos espec´ıficos: • Definir um modelo de dados para representar as RIs que podem

ser descritas em um RDT;

• Especificar uma abordagem atrav´es da qual, a partir das RIs mul-tivari´aveis, seja poss´ıvel construir RDTs customizados;

• Classificar, a partir da abordagem proposta, o n´ıvel de consistˆencia necess´ario para cada opera¸c˜ao executada no BD, utilizando con-tratos escritos em FOL.

• Executar experimentos para validar RDTs criados com a aborda-gem proposta e para avaliar o seu desempenho.

1.4 METODOLOGIA

Para controlar as RIs na camada de aplica¸c˜ao, ao utilizar BDs re-plicados e eventualmente consistentes, esta abordagem utiliza um mid-dleware constru´ıdo com base em uma vers˜ao modificada no framework QUELEA. As modifica¸c˜oes no framework QUELEA possibilitaram o controle de RDTs para invariˆancias multivari´aveis constru´ıdos com a abordagem TSC. Para isso s˜ao executadas as seguintes atividades:

• Revis˜ao dos trabalhos relacionados: identifica¸c˜ao dos trabalhos recentes que desenvolveram modelos e metodologias para contro-lar as invariˆancias em n´ıvel de aplica¸c˜ao;

• Modelo intermedi´ario: criar um modelo para representar as in-variˆancias de um sistema, opera¸c˜oes e n´ıveis de consistˆencia;

(27)

• Abordagem para extra¸c˜ao de RIs e suas opera¸c˜oes: criar uma abordagem para criar RDTs para RIs que envolvem uma ou mais vari´aveis;

• N´ıvel de consistˆencia por opera¸c˜ao: para cada opera¸c˜ao presente na aplica¸c˜ao, criar um m´etodo para classificar o n´ıvel de con-sistˆencia requerida de acordo com a semˆantica e sintaxe das in-variˆancias, utilizando como base o framework QUELEA;

• Desenvolvimento:

– Modifica¸c˜ao do framework QUELEA para poder trabalhar com opera¸c˜oes com m´ultiplas vari´aveis que possuam depen-dˆencia entre si;

– Abordagem para cria¸c˜ao de RDTs para invariˆancias com uma ou mais vari´aveis levando em conta os estados de uma invariˆancia antes e depois da atualiza¸c˜ao;

– Mapeamento para a classifica¸c˜ao das opera¸c˜oes no n´ıvel de consistˆencia necess´ario para cada tipo de invariˆancia; – Implementa¸c˜ao de um experimento para verificar o

desempe-nho dos RDTs criados com a abordagem em um cluster com nodos executando o BD Cassandra, por se tratar de um BD eventualmente consistente e com implementa¸c˜ao do controle de RDTs j´a pronta no framework QUELEA. Foi utilizado dois cen´arios para compara¸c˜ao: uso apenas de consistˆencia forte, para simular o uso de propriedades ACID; e outro so-mente com EC, para simular BDDs com EC sem controle da consistˆencia;

• An´alise dos resultados: descri¸c˜ao das vantagens, limita¸c˜oes e poss´ıveis melhorias na abordagem desenvolvida.

1.5 ORGANIZAC¸ ˜AO DO TEXTO

Este trabalho est´a organizado nos seguintes cap´ıtulos:

• CAP´ITULO 1 - INTRODUC¸ ˜AO: contextualiza o problema do controle de consistˆencia em BDDs, descrevendo o problema, a motiva¸c˜ao, a justificativa, os objetivos e a abordagem empregada no trabalho;

• CAP´ITULO 2 - BANCOS DE DADOS NOSQL: descreve os prin-cipais tipos de BDs NoSQL e as diferen¸cas com BDs NewSQL;

(28)

• CAP´ITULO 3 - CONSISTˆENCIA EM BANCOS DE DADOS: descreve as formas de consistˆencia existentes no armazenamento dos dados;

• CAP´ITULO 4 - REVIS ˜AO BIBLIOGR ´AFICA: apresenta os tra-balhos relacionados que buscam controlar as invariˆancias do sis-tema em n´ıvel de aplica¸c˜ao;

• CAP´ITULO 5 - TSC: apresenta a abordagem para a cria¸c˜ao de RDTs para as RIs de uma aplica¸c˜ao, possibilitando, dessa forma, o controle de consistˆencia em BDDs eventualmente consistentes; • CAP´ITULO 6 - AVALIAC¸ ˜AO DA PROPOSTA: implementa¸c˜ao de testes de desempenho comparativo entre esquemas de EC, forte e utilizando a abordagem proposta e an´alise qualitativa em rela¸c˜ao aos trabalhos relacionados;

• CAP´ITULO 7 - CONCLUS ˜OES E TRABALHOS FUTUROS: descri¸c˜ao das contribui¸c˜oes que a abordagem TSC oferece para o controle de integridade em BDDs eventualmente consistentes, vantagens e desvantagens do uso da abordagem TSC e trabalhos futuros.

(29)

2 BANCOS DE DADOS NOSQL

NoSQL ´e um termo usado para denominar um conjunto de BDs que n˜ao utilizam o modelo relacional e que s˜ao mais apropriados para lidar com dados em grande escala e para representa¸c˜ao de dados semi-estruturados, n˜ao estruturados ou de estruturas de dados mais seme-lhantes ao modelo seguido na aplica¸c˜ao. Uma grande vantagem do uso desses BDs no desenvolvimento de aplica¸c˜oes ´e que as formas de arma-zenamento dispon´ıveis n˜ao exigem do usu´ario uma defini¸c˜ao de mode-lagem mais elaborada, suprindo a necessidade de formas mais flex´ıveis de armazenar grandes e diversificadas quantidades de informa¸c˜oes.

Entre os grupos de BDs NoSQL mais comuns est˜ao os orienta-dos a chave-valor, os orientaorienta-dos a coluna, os orientaorienta-dos a documento e os orientados a grafos. Os BDs orientados a chave-valor, documen-tos e colunas possuem como caracter´ıstica em comum a possibilidade de armazenamento de estruturas de dados complexas, com a possibili-dade de modelagem de dados mais “agregados” (SADALAGE; FOWLER,

2012) e, portanto, abrindo um campo de possibilidades de modelagens que possam tirar proveito das caracter´ısticas espec´ıficas das aplica¸c˜oes. J´a os BDs orientados a grafos se distanciam dos demais por serem apropriados para aplica¸c˜oes espec´ıficas que necessitam de muitos re-lacionamentos entre as entidades. Este cap´ıtulo descreve os quatro principais tipos de BDs NoSQL, com ˆenfase no esquema de dados e na consistˆencia, assim como, descreve a diferen¸ca entre BDs NoSQL e NewSQL.

2.1 BANCOS DE DADOS CHAVE-VALOR

BDs chave-valor armazenam estruturas no formato de hash ta-ble, em que uma informa¸c˜ao ´e gravada, recuperada e removida atrav´es de uma chave, de forma semelhante a uma chave prim´aria. Estes BDs controlam a consistˆencia normalmente usando o conceito de EC, o que significa que em algum momento os dados estar˜ao consistentes. BDs chave-valor s˜ao adequados para aplica¸c˜oes que precisam de alta dis-ponibilidade para armazenamento de dados, como sess˜oes de usu´arios, carrinhos de compras e informa¸c˜oes de perfis, permitindo a utiliza¸c˜ao e compartilhamento dessas informa¸c˜oes em v´arios dispositivos ao mesmo tempo. Por´em, esses bancos n˜ao s˜ao adequados quando as consultas envolvem o conte´udo interno dos dados, assim como n˜ao s˜ao

(30)

adequa-dos para aplica¸c˜oes com relacionamento entre os dados (SADALAGE; FOWLER, 2012).

Exemplos de BDs chave-valor utilizados pela comunidade s˜ao o Riak (BASHO, 2015) e o Voldemort (LINKEDIN, 2016). No Riak o n´ıvel de consistˆencia ´e configur´avel, ou seja, pode ser ajustado pelo usu´ario. No caso, pode ser configurado o n´umero de r´eplicas, a quantidade de no-dos acessano-dos necess´arios para considerar uma leitura v´alida e o n´umero de nodos necess´ario para considerar uma grava¸c˜ao v´alida.

2.2 BANCOS DE DADOS ORIENTADOS A COLUNA

BDs orientados a coluna armazenam os dados em colunas ma-peadas por uma chave, sendo que as colunas podem ser agrupadas em fam´ılias de colunas. Fam´ılias de colunas s˜ao agrupamentos de dados relacionados e servem como mapeamento para as pesquisas juntamente com as chaves. Uma coluna tem o formato nome-valor, sendo que o nome pode ser usado tamb´em como chave em pesquisas. Cada coluna pode ser armazenada tamb´em com um timestamp, que ´e usado para resolver conflitos e diagnosticar um dado desatualizado, entre outras funcionalidades.

Uma linha em uma fam´ılia de colunas ´e composta por m´ultiplas e dinˆamicas colunas relacionadas a uma chave. Cada linha n˜ao possui necessariamente as mesmas colunas, e pode ser modificada a qualquer momento sem acarretar uma atualiza¸c˜ao de outras linhas da mesma fam´ılia. Cada coluna pode ser um valor simples ou pode ser uma super-coluna. A super-coluna acontece quando o valor ´e um mapeamento para v´arias outras colunas. Super-colunas s˜ao ´uteis para armazenar dados agregados que devem sempre ser retornados na pesquisa.

BDs orientados a coluna s˜ao apropriados para Analytics, OLAP, gravar eventos de log, informa¸c˜oes de blogs e dados de administra¸c˜ao de sistemas. Por´em, n˜ao s˜ao aconselhados para quem precisa das propri-edades ACID nas leituras e grava¸c˜oes de dados (SADALAGE; FOWLER, 2012), al´em de n˜ao serem eficientes para dados com muitos relaciona-mentos que necessitam de valida¸c˜ao.

Um exemplo de BD orientado a coluna ´e o Cassandra (APACHE, 2015), utilizado pela abordagem TSC nos experimentos. O Cassan-dra controla a consistˆencia atrav´es de logs e de uma memtable. Uma grava¸c˜ao ´e considerada v´alida se ambos, logs e memtable, foram atu-alizados com o novo valor. Periodicamente os valores s˜ao persistidos em uma estrutura chamada SSTable. Essa estrutura ´e sempre criada,

(31)

nunca atualizada, e as estruturas n˜ao mais usadas s˜ao tamb´em periodi-camente revisadas. A consistˆencia ´e controlada atrav´es de parˆametros informados para o sistema. ´E poss´ıvel configurar o n´umero de r´eplicas, a quantidade de nodos necess´arios para validar uma leitura e o n´umero de nodos necess´arios para validar uma grava¸c˜ao. Ao configurar estes parˆametros se busca sempre respeitar a f´ormula (R + W ) > N , sendo R o parˆametro para leitura, W o parˆametro para escrita e N o parˆametro para o n´umero de r´eplicas. A importˆancia de atender essa f´ormula ´e para que o sistema n˜ao fique indispon´ıvel se algum nodo falhar.

No Cassandra as transa¸c˜oes n˜ao funcionam da mesma maneira que a forma tradicional de um BD relacional. Cada atualiza¸c˜ao ´e re-alizada de forma atˆomica e o que importa ´e a grava¸c˜ao acontecer no logs e na memtable dos nodos conforme configurado no parˆamero W. ´E poss´ıvel usar bibliotecas externas, como o ZooKeeper (APACHE, 2016), para coordenar a sincroniza¸c˜ao de m´ultiplas atualiza¸c˜oes.

No Cassandra as opera¸c˜oes poss´ıveis s˜ao GET, SET e DEL. A intera¸c˜ao com o banco pode ser feita atrav´es de comandos, atrav´es de bi-bliotecas como o Hector (ECHAGUE; MCCALL, 2011) e tamb´em atrav´es

de CQL (APACHE, 2011), uma linguagem de consulta semelhante ao SQL. ´E poss´ıvel tamb´em criar ´ındices em colunas para consultas muito usadas. Qualquer escrita e leitura pode ser feita em todas as colunas de uma chave ou em uma coluna espec´ıfica, ganhando com isso desem-penho. Durante a modelagem ´e importante decidir quais dados devem ser usados com uma chave diretamente ao inv´es de pertencer a uma coluna para melhorar o desempenho das consultas.

2.3 BANCOS DE DADOS ORIENTADOS A DOCUMENTO

BDs orientados a documento suportam a utiliza¸c˜ao de dados es-truturados, como os formatos JSON, BSON e XML, de forma nativa no armazenamento. Isso possibilita o uso de indexadores e pesquisas com mais facilidade, como por exemplo, pesquisas utilizando um atributo presente em um documento no formato JSON. Em BDs orientados a documento, cada documento possui seu pr´oprio conjunto de colunas, por´em, apesar de ser comum cole¸c˜oes de documentos possu´ırem colunas iguais, n˜ao existe uma restri¸c˜ao para impor isso, facilitando modelos de dados que evoluem com o tempo na aplica¸c˜ao. ´E normal tamb´em ter cole¸c˜oes de dados relacionados no pr´oprio documento, ganhando em desempenho nas consultas.

(32)

na mesma unidade de informa¸c˜ao, facilitando o mapeamento entre a estrutura de dados da aplica¸c˜ao e o BD. BDs orientados a documentos tamb´em s˜ao adequados para armazenar dados que sofrem altera¸c˜ao com frequˆencia na estrutura interna do modelo de dados, pois n˜ao ´e necess´aria uma modifica¸c˜ao na estrutura de armazenamento no BD.

Um exemplo de BD orientado a documentos bastante utilizado no mercado ´e o MongoDB (MONGODB, 2016). A organiza¸c˜ao do Mon-goDB utiliza conceitos como database, collection e document similares aos conceitos de database, table e row, respectivamente, em um BD re-lacional. O MongoDB realiza consultas sobre dados JSON, ou seja, ´e poss´ıvel consultar os dados utilizando os atributos internos dos docu-mentos. O MongoDB trabalha a consistˆencia atrav´es de replica sets, onde s˜ao configurados, por exemplo, o n´umero de nodos necess´arios para considerar uma escrita como v´alida. Isso pode ser realizado no pr´oprio comando para a escrita, como por exemplo configurando o parˆametro w como majority implica em validar o comando somente se a maioria dos nodos participaram do comando. Em uma leitura ´e poss´ıvel configurar a opera¸c˜ao com o m´etodo slaveOK para poder usar um nodo de backup como origem do dado, melhorando o desempenho mas tamb´em correndo o risco de trazer um dado n˜ao atualizado. A escrita dos dados tamb´em pode ser configurada usando a propriedade writeConcern, atrav´es da qual ´e poss´ıvel configurar para a opera¸c˜ao ser considerada v´alida somente quando todos os nodos estiverem atualiza-dos ou, ao contr´ario, considerar v´alida com somente um nodo atuali-zado.

Apesar de existirem bancos NoSQL que utilizam transa¸c˜oes, como o RavenDB (RHINOS, 2015), a maioria dos BDs NoSQL utiliza transa¸c˜oes atˆomicas simples, envolvendo uma opera¸c˜ao, como na atua-liza¸c˜ao de um documento no MongoDB. A disponibilidade ´e garantida no MongoDB atrav´es tamb´em da configura¸c˜ao das replicas sets, onde podem ser definidos os crit´erios para a escolha do novo nodo principal quando da falha de um dos nodos (SADALAGE; FOWLER, 2012).

2.4 BANCOS DE DADOS ORIENTADOS A GRAFOS

BDs orientados a grafos armazenam entidades (nodos) e os re-lacionamentos entre as entidades. Tanto os nodos quanto as rela¸c˜oes podem possuir propriedades, sendo que n˜ao existe um limite para o n´umero de rela¸c˜oes de cada nodo. Estes bancos s˜ao apropriados para aplica¸c˜oes que requerem dependˆencias complexas entre os dados, como

(33)

em uma aplica¸c˜ao de rede social. As diferen¸cas entre um banco ori-entado a grafos e um banco relacional se tornam claras em pesquisas: enquanto bancos relacionais utilizam chaves estrangeiras para poder na-vegar entre os relacionamentos dos dados, um banco orientado a grafos consegue, a partir de um dado pesquisado, navegar pelos relacionamen-tos de forma muito mais eficiente.

O Neo4J (NEO, 2016) ´e um exemplo de um banco orientado a grafos. Nesse banco ´e poss´ıvel criar nodos e rela¸c˜oes, al´em de indicar a dire¸c˜ao que cada rela¸c˜ao possui, ou seja, qual ´e o nodo de origem e de destino em cada rela¸c˜ao. Cada rela¸c˜ao pode ter propriedades, o que ajuda a enriquecer os tipos de pesquisas poss´ıveis no grafo. Uma carac-ter´ıstica em bancos com grafos ´e que a modelagem dos dados deve ser bem trabalhada previamente, pois mudan¸cas de relacionamentos po-dem se tornar custosas quando j´a em uso (SADALAGE; FOWLER, 2012). A consistˆencia nesses BDs normalmente se d´a atrav´es de transa-¸

c˜oes ACID quando n˜ao h´a distribui¸c˜ao dos dados. Por´em, quando os dados s˜ao distribu´ıdos em diferentes clusters, a consistˆencia se torna eventual. No Neo4J n˜ao se usa distribui¸c˜ao dos dados em clusters e cada atualiza¸c˜ao dos dados deve ser efetuada como uma transa¸c˜ao ACID. O Neo4J pode prover alta disponibilidade atrav´es de r´eplicas com uma EC coordenada pelo ZooKeeper.

2.5 BANCOS DE DADOS NOSQL X BANCOS DE DADOS NEWSQL

NewSQL pode ser definido como uma classe de BDs relacionais moderna que procura prover a mesma escalabilidade e desempenho que os BDs NoSQL para opera¸c˜oes de leitura e escrita em Online Tran-saction Processing (OLTP), por´em, mantendo as garantias ACID nas transa¸c˜oes. Os BDs NewSQL tamb´em fazem uso de instru¸c˜oes SQL para executar as transa¸c˜oes concorrentes que modificam o estado do BD. Isso evita a necessidade do desenvolvedor controlar no c´odigo da aplica¸c˜ao as consequˆencias do uso da EC, como necess´ario ao utilizar BDs NoSQL (PAVLO; ASLETT, 2016). Implementa¸c˜oes em NewSQL de-vem ser livres de bloqueios para controlar a concorrˆencia e devem pos-suir a arquitetura distribu´ıda shared-nothing (PAVLO; ASLETT, 2016), arquiteturas onde cada nodo servidor n˜ao compartilha recursos de ar-mazenamento e mem´oria (STONEBRAKER, 1986).

Devido ao uso de transa¸c˜oes com propriedades ACID, os BDs NewSQL disponibilizaram para o desenvolvedor uma forma de traba-lhar com BDs relacionais distribu´ıdos sem a preocupa¸c˜ao do controle

(34)

da consistˆencia. Por´em, o baixo desempenho para manter as RIs ainda permanece, sendo amenizado em grande parte pela utiliza¸c˜ao de meios de armazenamento mais r´apidos, como o uso do BD em mem´oria, al´em de melhorias na infraestrutura.

2.6 CONSIDERAC¸ ˜OES FINAIS DO CAP´ITULO

A fam´ılia de BDs NoSQL proporciona `as aplica¸c˜oes novas formas de modelagem dos dados. As estruturas de dados disponibilizadas nos BDs NoSQL s˜ao mais apropriadas para o armazenamento de alguns tipos de informa¸c˜oes presentes nas aplica¸c˜oes que lidam com grandes volumes de dados, como por exemplo o uso de BD orientados a grafos para armazenamento de informa¸c˜oes de redes sociais.

BDDs tamb´em s˜ao mais facilmente desenvolvidos quando utili-zado BDs NoSQL, com exce¸c˜ao dos orientados a grafos, que s˜ao mais adaptados para serem utilizados de forma centralizada. O escalona-mento dos dados se torna menos complexo com o uso de BDs orien-tados a documentos e orienorien-tados a colunas, que permitem armazenar dados agregados em uma unidade de informa¸c˜ao, diferindo do modelo relacional que armazena em cada atributo somente valores atˆomicos. Com a possibilidade de dados aninhados em um ´unico documento ou coluna ´e poss´ıvel decidir de forma mais f´acil a distribui¸c˜ao se compa-rado com os dados normalizados espalhados em diferentes tabelas em um BD relacional. Al´em disso, quando em um ambiente distribu´ıdo, a modelagem dos dados nos bancos NoSQL requer cuidado. Devem ser levadas em conta, por exemplo, as pesquisas realizadas na aplica¸c˜ao e as garantias de integridade, j´a que consultas e atualiza¸c˜oes podem resultar em opera¸c˜oes onerosas. De forma diferente, os BDs NewSQL se especializaram em manter para o desenvolvedor as facilidades do uso de SQL e ao mesmo tempo utilizar BDDs, mantendo um modelo de dados com o qual o desenvolvedor est´a adaptado.

Por´em, os BDs NewSQL n˜ao oferecem formas de controlar as RIs sem o uso de consistˆencia forte. Ao mesmo tempo, os BDs NoSQL pos-suem algumas limita¸c˜oes em rela¸c˜ao aos bancos relacionais. Aspectos como a consistˆencia dos dados NoSQL n˜ao s˜ao t˜ao facilmente abstra´ıdos como s˜ao em BDs relacionais. A consistˆencia em bancos NoSQL, dife-rentemente dos BDs relacionais, que oferecem uma consistˆencia forte, pode ser usada de forma configur´avel, podendo, por exemplo, no caso de replica¸c˜ao dos dados, ser relevada uma inconsistˆencia tempor´aria para favorecer o desempenho de uma atualiza¸c˜ao. Por´em, o suporte

(35)

para RIs, que buscam garantir a consistˆencia dos dados, n˜ao ´e de f´acil implementa¸c˜ao, com exce¸c˜ao de algumas formas simples de RIs, como a unicidade de chaves.

(36)
(37)

3 CONSIST ˆENCIA EM BANCOS DE DADOS

Consistˆencia em BDs ´e um conceito fundamental ao projetar aplica¸c˜oes que necessitam armazenar informa¸c˜oes. Apesar da importˆ an-cia, projetos que utilizam BDs centralizados, sem distribui¸c˜ao dos da-dos, conseguem usufruir de abstra¸c˜oes da complexidade envolvida na garantia de consistˆencia, n˜ao exigindo no projeto a cria¸c˜ao de mecanis-mos sofisticados, pois o pr´oprio BD fornece funcionalidades para ad-ministrar a consistˆencia, como por exemplo com transa¸c˜oes ACID em BDs relacionais e a atomicidade das opera¸c˜oes em BDs NoSQL. Por´em, para aplica¸c˜oes que necessitam de distribui¸c˜ao dos dados, as facilida-des que garantem uma consistˆencia forte nesses bancos se tornaram um problema de desempenho. Apesar da adapta¸c˜ao para trabalhar em clusters de alguns BDs relacionais, estes ainda n˜ao possuem a mesma facilidade em escalonamento horizontal (SCHREINER; DUARTE; MELLO, 2015). Com o crescimento do uso de BDDs, em especial dos bancos NoSQL, a defini¸c˜ao dos requisitos de consistˆencia passa a ser uma fase importante no desenvolvimento das aplica¸c˜oes.

A consistˆencia pode ser definida em termos de RIs, sendo que, essas assertivas devem permanecer em um estado v´alido ap´os cada mudan¸ca de valor das vari´aveis persistidas no BD. (DECKER; MU ˜ NOZ-ESCO´I; MISRA, 2015) distingue quatro situa¸c˜oes em que uma altera¸c˜ao no BD pode violar as RIs. A primeira ´e o caso de uma simples atu-aliza¸c˜ao que viola diretamente uma regra de integridade; a segunda ´

e quando alguma redundˆancia ou dependˆencia n˜ao foi considerada na atualiza¸c˜ao do dado; a terceira resulta de problemas causados por fa-lhas em sistemas de controle de concorrˆencia; e a quarta em problemas ocasionados por defeitos em sistemas de distribui¸c˜ao e replica¸c˜ao dos dados.

Este cap´ıtulo descreve alguns dos principais t´opicos de consistˆ en-cia em BDs: a consistˆencia semˆantica, consistˆencia em transa¸c˜oes, con-sistˆencia na distribui¸c˜ao e replica¸c˜ao dos dados, EC e RDT.

3.1 CONSIST ˆENCIA SEM ˆANTICA

A consistˆencia semˆantica pode ser vista como o conjunto de es-tados (ou transi¸c˜ao de estados) v´alidos poss´ıveis que um BD pode as-sumir. A consistˆencia semˆantica ´e garantida atrav´es do uso da teoria de integridade, usando um conjunto de RIs. Essas RIs s˜ao regras que

(38)

representam o conhecimento acerca do dom´ınio de aplica¸c˜ao de um projeto. Segundo (OZSU; VALDURIEZ¨ , 2001), RIs definem as

proprie-dades est´aticas ou dinˆamicas de um dom´ınio que n˜ao podem ser cap-tadas diretamente pelos conceitos de objeto e opera¸c˜ao de um modelo de dados, ou seja, o conceito de regra de integridade est´a fortemente relacionado com o de um modelo de dados, no sentido de que mais in-forma¸c˜oes semˆanticas sobre o aplicativo podem ser captadas por meio dessas regras. Exemplos de RIs s˜ao RIs referenciais, de dom´ınio dos valores e obrigatoriedade, assim como regras de neg´ocio que podem en-volver campos de diferentes tabelas. Segundo (DECKER; MU ˜NOZ-ESCO´I; MISRA, 2015), na pr´atica n˜ao s˜ao muito bem suportadas pelos BDs re-lacionais, pois esses n˜ao possuem uma ´unica solu¸c˜ao para declarar e aplicar as RIs, de modo que muitas aplica¸c˜oes imp˜oem restri¸c˜oes mais complexas atrav´es de triggers, stored procedures, c´odigos em n´ıvel de aplica¸c˜ao e transa¸c˜oes compensat´orias.

Segundo (OZSU; VALDURIEZ¨ , 2001) podemos distinguir dois tipos

principais de RIs: restri¸c˜oes estruturais e restri¸c˜oes comportamentais. As “restri¸c˜oes estruturais” s˜ao as inerentes ao modelo de dados, como por exemplo, chaves estrangeiras no modelo relacional. J´a as “restri¸c˜oes comportamentais” s˜ao relacionadas `a semˆantica da aplica¸c˜ao: os rela-cionamentos entre entidades, estruturas de dados e propriedades dos objetos.

Os m´etodos declarativos para expressar as RIs, de acordo com (OZSU; VALDURIEZ¨ , 2001), surgiram com o modelo relacional para

ate-nuar os problemas da dependˆencia de programas e dados, redundˆancias de c´odigo e o baixo desempenho de m´etodos procedurais. Com o uso de assertivas do c´alculo de predicados, a declara¸c˜ao e altera¸c˜ao de regras de integridade se tornam mais f´aceis. Por´em, o controle de integridade semˆantica possui desafios para lidar com verifica¸c˜oes complexas que podem utilizar um grande conjunto de dados para a valida¸c˜ao, o que se torna ainda mais cr´ıtico quando o BD ´e distribu´ıdo.

Segundo (IBRAHIM, 2006) um sistema de verifica¸c˜ao eficiente em BDDs ´e crucial pois:

• Os dados necess´arios para verificar uma RI podem estar espalha-dos em diversos noespalha-dos, o que acarreta em transferˆencia de dados entre os nodos para realizar a valida¸c˜ao;

• Em ambientes que usam a t´ecnica de fragmenta¸c˜ao na distri-bui¸c˜ao dos dados, RIs adicionais devem ser criadas junto com os fragmentos a fim de preservar a consistˆencia. Al´em disso na replica¸c˜ao dos dados tamb´em deve ser garantido que os valores

(39)

estejam iguais;

• Atualiza¸c˜oes frequentes podem acarretar verifica¸c˜oes dispendiosas de RIs;

• Atualiza¸c˜oes em que o processamento ´e abortado ao finalizar a opera¸c˜ao s˜ao ineficientes, pois devem realizar o retorno aos esta-dos anteriores atrav´es de cancelamentos de opera¸c˜oes (rollback ) e recupera¸c˜oes (recovery) em poss´ıveis nodos distintos que parti-ciparam do processamento tornando a opera¸c˜ao onerosa.

RIs em BDs relacionais, segundo (OZSU; VALDURIEZ¨ , 2001), s˜ao

definidas como assertivas, sendo que uma “assertiva” ´e uma express˜ao do c´alculo relacional de tuplas, podendo assumir o valor verdadeiro ou falso. De acordo com (OZSU; VALDURIEZ¨ , 2001), duas solu¸oes para o

controle de integridade semˆantica podem ser diferenciadas: a primeira em um sistema centralizado e a segunda em um sistema distribu´ıdo.

Em um “sistema centralizado” que usa o modelo relacional pode-mos especificar as RIs atrav´es de restri¸c˜oes predefinidas, pr´e-compiladas e gerais, de acordo com (OZSU; VALDURIEZ¨ , 2001). As restri¸oes

“pre-definidas” s˜ao as regras mais comuns do modelo relacional como o atri-buto n˜ao nulo, chave exclusiva, chave estrangeira e dependˆencia funci-onal. As restri¸c˜oes “pr´e-compiladas” s˜ao as que expressam condi¸c˜oes que devem ser respeitadas por todas as tuplas de uma rela¸c˜ao para uma atualiza¸c˜ao, remo¸c˜ao ou inclus˜ao. Podem ser criados, por exemplo, res-tri¸c˜oes de dom´ınio em que um campo deve assumir um valor simples ou pertencente a um intervalo de valores. Em uma restri¸c˜ao “geral” a defini¸c˜ao envolve f´ormulas que podem conter mais de uma rela¸c˜ao e, por isso, s˜ao mais concisas de serem declaradas que as restri¸c˜oes “pr´e-compiladas”.

De acordo com (OZSU; VALDURIEZ¨ , 2001), em um “sistema

dis-tribu´ıdo”, a especifica¸c˜ao deve levar em conta que os dados podem es-tar fragmentados. Usando o c´alculo relacional, as “assertivas” podem ser separadas em trˆes classes: assertivas individuais, assertivas orien-tadas a conjuntos e assertivas que incluem agregados, segundo (OZSU;¨ VALDURIEZ, 2001). “Assertivas individuais” s˜ao as que envolvem uma vari´avel em uma rela¸c˜ao. Seu funcionamento envolve todos os nodos que contˆem fragmentos dos dados envolvidos na “assertiva”. Caso al-guns dos fragmentos n˜ao satisfa¸ca o predicado presente na “assertiva”, pelo motivo do fragmento possuir um predicado incompat´ıvel ou porque o dado presente no fragmento n˜ao satisfazer o predicado da “assertiva” testada, ent˜ao esta ser´a rejeitada globalmente. Um exemplo dessas “assertivas individuais” s˜ao as restri¸c˜oes de dom´ınio. As “assertivas

(40)

orientadas a conjuntos” podem envolver diversas vari´aveis relaciona-das atrav´es de predicados de jun¸c˜ao. Apesar dos predicados de jun¸c˜ao poderem envolver mais de uma rela¸c˜ao, quando as vari´aveis presentes na jun¸c˜ao pertencem a rela¸c˜oes diferentes, cada “assertiva orientada a conjuntos” especifica uma restri¸c˜ao envolvendo uma rela¸c˜ao. Dessa forma, a verifica¸c˜ao de compatibilidade exige a jun¸c˜ao dos fragmentos das rela¸c˜oes envolvida no predicado, o que pode tornar as opera¸c˜oes dispendiosas. Como exemplo de “assertivas orientadas a conjuntos” temos as restri¸c˜oes de chave estrangeira. As “assertivas que incluem agregados”, s˜ao as mais dispendiosas, envolvendo fun¸c˜oes como o so-mat´orio, m´ınimo, m´aximo e total de registros em uma rela¸c˜ao. Essas “assertivas” cont´em uma parte que descreve uma proje¸c˜ao nos dados e outra parte que envolve a sele¸c˜ao. Por exemplo, uma “assertiva” que envolve um somat´orio de um aglomerado de dados no modelo relacional poderia ser uma regra em que, para uma tabela que possui os dados dos gastos mensais de uma pessoa, a soma dos gastos no mˆes atual nunca ultrapasse um limite definido.

3.2 CONSIST ˆENCIA EM TRANSAC¸ ˜OES

Consistˆencia em transa¸c˜oes ´e a garantia da integridade dos da-dos ao executar um grupo de transa¸c˜oes concorrentes. Considerando uma hist´oria H com T transi¸c˜oes, ao executar cada transi¸c˜ao T, de forma isolada, cada transa¸c˜ao n˜ao deve violar o conjunto de regras semˆanticas existentes no BD, segundo (BERNSTEIN; HADZILACOS; GO-ODMAN, 1987). Ao executar transa¸c˜oes sem concorrˆencia entre si em uma hist´oria, a integridade semˆantica ´e facilmente garantida, por´em, quando existem transa¸c˜oes concorrentes, mesmo que cada transa¸c˜ao seja executada de forma individual e consistente, um conflito entre transa¸c˜oes pode gerar erros comuns de concorrˆencia, como por exem-plo, uma atualiza¸c˜ao perdida em que uma transa¸c˜ao sobrescreve um dado gravado por outra transa¸c˜ao concorrente. Para conseguir traba-lhar com transa¸c˜oes concorrentes, uma solu¸c˜ao usada ´e a serializa¸c˜ao de dados, de acordo com (GRAY et al., 1976).

Em transa¸c˜oes, as propriedades ACID descrevem as caracter´ısti-cas que uma transa¸c˜ao deve fornecer. Isolamento, tamb´em chamado em (TRAIGER et al., 1982) de concorrˆencia transparente, garante que cada transa¸c˜ao execute de forma independente, mesmo sendo executada de forma concorrente com outras transa¸c˜oes. A consistˆencia garante que cada transa¸c˜ao em um conjunto de transa¸c˜oes resultar´a em um estado

(41)

v´alido dos dados. Atomicidade garante que tudo ´e persistido ou nada, evitando atualiza¸c˜oes parciais dos dados. A durabilidade ´e relacionada com a garantia da persistˆencia dos dados ao final de sess˜oes, final de transa¸c˜oes, execu¸c˜oes de programas e recupera¸c˜ao dos dados em uma falha.

3.3 CONSIST ˆENCIA NA DISTRIBUIC¸ ˜AO E REPLICAC¸ ˜AO

A consistˆencia na distribui¸c˜ao dos dados tem o objetivo traba-lhar de forma que os mecanismos de consistˆencia entre BDs distintos fiquem transparentes para os usu´arios. Segundo (DECKER; MU ˜ NOZ-ESCO´I; MISRA, 2015) isso pode ser expresso pela consistˆencia na

transa-¸

c˜ao, somada `a atomicidade em um commit.

Na distribui¸c˜ao dos dados, os conflitos na atualiza¸c˜ao podem ser controlados de forma otimista ou de forma pessimista. A forma pessimista previne a atualiza¸c˜ao de um dado quando j´a existe uma outra atualiza¸c˜ao concorrente em andamento, como por exemplo, com o uso de mecanismos de reserva exclusiva (lock ) em um dado. Apesar de garantir a consistˆencia, a reserva exclusiva traz como consequˆencias problemas de desempenho, j´a que um dos clientes deve esperar pelo final da reserva, podendo ocasionar erros dif´ıceis de detectar, como deadlocks. A forma otimista permite a atualiza¸c˜ao concorrente dos dados, podendo gerar problemas como a perda de uma atualiza¸c˜ao. Uma forma comum de m´etodo otimista ´e a atualiza¸c˜ao condicional, na qual pode ocorrer falha antes de salvar o dado se verificado que ocorreu outra modifica¸c˜ao no intervalo de tempo do processamento da atualiza¸c˜ao. Outra forma otimista ´e tratar os dados diferentes atrav´es de merge autom´atico ou manual.

J´a a consistˆencia na replica¸c˜ao dos dados requer uma sincro-niza¸c˜ao das opera¸c˜oes de leitura e escrita que garanta um estado v´alido nas atualiza¸c˜oes e nos cancelamentos de transa¸c˜oes. Segundo (DECKER; MU ˜NOZ-ESCO´I; MISRA, 2015), isso pode ser expresso usando um proto-colo com a propriedade de serializa¸c˜ao one-copy (1SR) (BERNSTEIN; HADZILACOS; GOODMAN, 1987) e a consistˆencia na distribui¸c˜ao. Em replica¸c˜oes, conflitos nas atualiza¸c˜oes de dados podem ser controlados mais facilmente, pois a maioria dos modelos de replica¸c˜ao, com exce¸c˜ao dos modelos peer-to-peer, utiliza um nodo para centralizar atualiza¸c˜oes para cada dado, segundo (SADALAGE; FOWLER, 2012).

(42)

3.4 CONSIST ˆENCIA EVENTUAL

A EC garante que, em um dado momento, os dados estar˜ao atu-alizados. Segundo (SAITO; SHAPIRO, 2005), a EC pode ser vista como uma forma de consistˆencia de replica¸c˜ao atrasada, que enfraquece a serializa¸c˜ao em favor da alta disponibilidade, por´em, com um acordo entre as r´eplicas para que eventualmente as opera¸c˜oes convirjam para os mesmos valores com a mesma ordena¸c˜ao. As c´opias replicadas nessa forma de consistˆencia estar˜ao consistentes em um determinado mo-mento, ou seja, as viola¸c˜oes das RIs n˜ao existir˜ao no final do processo de replica¸c˜ao segundo (DECKER; MU ˜NOZ-ESCO´I; MISRA, 2015).

O teorema CAP ´e bastante utilizado para justificar essa forma de consistˆencia. Segundo o teorema CAP (GILBERT; LYNCH, 2002), somente ´e poss´ıvel atender dois dos trˆes requisitos: consistˆencia, dispo-nibilidade e tolerˆancia ao particionamento. Em clusters que utilizam principalmente bancos NoSQL, enfraquecer a consistˆencia para fornecer disponibilidade e tolerˆancia ao particionamento ´e comum. Al´em disso, (BREWER, 2012) afirma que a escolha entre consistˆencia e disponibili-dade, quando o BD ´e tolerante ao particionamento, deve ser feito de forma ponderada. J´a que, falhas de particionamento s˜ao raras; a con-sistˆencia pode ser diferenciada por opera¸c˜ao ou dado envolvido; deve ser levado em conta que os BDDs normalmente possuem uma alta taxa de disponibilidade; diferentes esquemas de consistˆencia s˜ao poss´ıveis; e as falhas de particionamento possuem diferentes nuances de como ocorrem.

3.5 RDT

O conceito de RDT foi proposto por diferentes trabalhos ( PRE-GUICA et al., 2009), (BURCKHARDT; LEIJEN, 2011), (ROH et al., 2011) e (SHAPIRO et al., 2011a), e consiste em um tipo de dados que encapsula a complexidade de replica¸c˜ao e resolu¸c˜ao de conflitos relacionados ao controle de um dado em sistemas distribu´ıdos, com garantias de confia-bilidade, disponibilidade e tempo de resposta. Um RDT ´e similar a um tipo de dados simples, como um simples registrador de leitura e escrita, um conjunto de valores, um mapa de valores ou um grafo, por´em, com opera¸c˜oes de manipula¸c˜ao dos dados adaptados para o uso em BDDs replicados.

Do ponto de vista de um Abstract Data Type (ADT), um RDT possui opera¸c˜oes para controlar o estado interno dos dados

(43)

encapsu-lados. Por exemplo, um RDT para encapsular um registrador ´e cons-truido com opera¸c˜oes para ler e configurar o valor do registrador. Da mesma forma, um RDT para encapsular um conjunto de valores, deve possuir opera¸c˜oes para verificar a existˆencia de elementos, assim como, adicionar e remover elementos do conjunto (SHAPIRO, 2017).

Figura 1: Exemplo de um RDT em BDDs.

A Figura 1 ilustra um RDT sendo utilizado em um sistema com BDDs com fator de replica¸c˜ao 3. Os dados encapsulados pelo RDT s˜ao replicados sempre que uma nova opera¸c˜ao for executada em um dos RDTs, atrav´es de um dos trˆes servidores. Cada uma das opera¸c˜oes de um RDT pode operar com uma consistˆencia diferente, possibilitando que configura¸c˜oes com um maior desempenho possam ser utilizadas para o controle de invariˆancias do sistema, de acordo com a semˆantica da invariˆancia que o RDT procura preservar.

3.6 CONSIDERAC¸ ˜OES FINAIS DO CAP´ITULO

A consistˆencia em BDs envolve diversos mecanismos: formas de especifica¸c˜ao de regras de integridade, uso de transa¸c˜oes para a garantia da consistˆencia entre m´ultiplas opera¸c˜oes, controle da consistˆencia nas r´eplicas dos dados e, no caso de fragmenta¸c˜ao dos dados, o controle da consistˆencia tanto na fragmenta¸c˜ao quanto com as regras de integridade especificadas. Al´em disso, em alguns sistemas, principalmente em clus-ters, ´e preciso especificar o n´ıvel de consistˆencia dos dados necess´arios, levando em conta que a disponibilidade e a tolerˆancia ao particiona-mento v˜ao ser afetadas. Outros mecanismos de consistˆencia em n´ıvel

(44)

de hardware, em n´ıvel de comunica¸c˜ao e seguran¸ca tamb´em s˜ao ne-cess´arios, por´em, foram descritos os mais relacionados `a consistˆencia semˆantica, que ser´a usada para descrever a proposta do trabalho.

(45)

4 REVIS ˜AO BIBLIOGR ´AFICA

Neste cap´ıtulo s˜ao revisados trabalhos que desenvolveram for-mas de descri¸c˜ao e valida¸c˜ao de invariˆancias de um sistema em n´ıvel de aplica¸c˜ao atrav´es de linguagens para especifica¸c˜ao das invariˆancias e mapeamentos para modelos de consistˆencia apropriados nas opera¸c˜oes relacionadas as invariˆancias. Os trabalhos relacionados buscaram solu-¸

c˜oes do controle de consistˆencia em aplica¸c˜oes com opera¸c˜oes concor-rentes e BDDs com EC.

4.1 QUELEA

Em (SIVARAMAKRISHNAN; KAKI; JAGANNATHAN, 2015) foi cri-ada uma linguagem de programa¸c˜ao chamada QUELEA para BDDs com EC. Atrav´es dessa linguagem s˜ao declaradas propriedades que es-pecificam a consistˆencia de forma detalhada em n´ıvel de aplica¸c˜ao. O objetivo dessa linguagem ´e identificar o n´ıvel de consistˆencia necess´aria para que as restri¸c˜oes presentes na aplica¸c˜ao n˜ao sejam violadas.

A linguagem QUELEA ´e uma extens˜ao da linguagem de pro-grama¸c˜ao funcional Haskell (HASKELL.ORG, 2015). A extens˜ao dispo-nibiliza funcionalidades para valida¸c˜ao dos dados replicados de forma axiom´atica, envolvendo um conjunto de execu¸c˜oes permitidas em um tipo de dado replicado. Essas valida¸c˜oes fazem parte do contrato que, atrav´es de um sistema de verifica¸c˜ao do contrato, mapeiam estatistica-mente as opera¸c˜oes no n´ıvel de consistˆencia dispon´ıvel no BD utilizado. O modelo descrito envolve um BD distribu´ıdo constitu´ıdo de r´eplicas com objetos armazenados. O estado de cada objeto em uma r´eplica ´e o conjunto de todas as atualiza¸c˜oes, denominadas efeitos, efetuado no objeto. Cada objeto ´e associado com um conjunto de opera¸c˜oes, atrav´es dessas opera¸c˜oes, os clientes conseguem executar a¸c˜oes nos objetos no BD. Uma sequˆencia de opera¸c˜oes executadas pelo cliente no BD ´e denominada sess˜ao.

Atrav´es de um replicated data type foram definidas opera¸c˜oes em uma aplica¸c˜ao simulando um sistema banc´ario. As opera¸c˜oes cri-adas, getBalance, deposit e withdraw, atrav´es da linguagem QUELEA, s˜ao opera¸c˜oes atˆomicas. Para evitar algumas formas de anomalia que violam as RIs da aplica¸c˜ao, como atualiza¸c˜oes concorrentes no mesmo objeto, foram especificados contratos no QUELEA. Esses contratos, ex-pressos pela sintaxe da linguagem Haskell, permitem mapear o n´ıvel de

(46)

consistˆencia que cada opera¸c˜ao necessita manter e dessa forma, evitar as anomalias que violam as RIs da aplica¸c˜ao. Por exemplo, considerando que uma das opera¸c˜oes definidas, a opera¸c˜ao withdraw, somente ´e exe-cutada quando houver saldo dispon´ıvel, ou seja, existe uma fun¸c˜ao no servidor local da atualiza¸c˜ao que n˜ao permite que a opera¸c˜ao aconte¸ca se o valor resultante negativar o saldo, a regra definida no contrato para controlar essa opera¸c˜ao e evitar que o BD crie uma valor negativo na conta corrente da aplica¸c˜ao ao ser executado concorrentemente em diferentes servidores, ´e expresso pelo seguinte contrato ψω:

∀(a : withdraw)sameobj(a, ˆη) ⇒ a = ˆη ∨ vis(a, ˆη) ∨ vis(ˆη, a) (4.1) O contrato ψω define que, dadas duas opera¸c˜oes withdraw, o efeito ˆ

η de uma das opera¸c˜oes deve ser igual ao efeito a resultante da ou-tra opera¸c˜ao ou um dos efeitos deve ser vis´ıvel para o outro. Dessa forma, ´e poss´ıvel garantir, quando respeitado esse contrato, que as duas opera¸c˜oes de withdraw n˜ao se sobreponham e mantenham uma consistˆencia forte.

A sintaxe do contrato ´e baseada em FOL. Dessa forma, foi de-finido para a linguagem do contrato opera¸c˜oes, efeitos, predicados e rela¸c˜oes. Os efeitos podem ser classificados pelas opera¸c˜oes que par-ticipam, como a sintaxe a : withdraw, significando que o efeito a ´e da opera¸c˜ao withdraw. Os predicados s˜ao formados pelas rela¸c˜oes, permitindo as fun¸c˜oes matem´aticas de conjun¸c˜ao (∨), disjun¸c˜ao (∧) e implica¸c˜ao (⇒). As rela¸c˜oes s˜ao formadas por um par de efeitos, como vis, so e sameobj, significando, respectivamente, que um efeito ´e vis´ıvel para outro, dois efeitos est˜ao na mesma sess˜ao e os dois efeitos s˜ao originados do mesmo objeto. As fun¸c˜oes matem´aticas poss´ıveis nas rela¸c˜oes s˜ao a uni˜ao (∪), intersec¸c˜ao (∩) e fechamento transitivo (R+). Para mapear a consistˆencia requerida de uma opera¸c˜ao na ca-mada de aplica¸c˜ao para o n´ıvel de consistˆencia necess´ario no BD, foram definidos, atrav´es dos contratos, trˆes n´ıveis de consistˆencia poss´ıveis -eventual, causal e forte - nos BDs. O n´ıvel de EC acontece quando n˜ao ocorre sincroniza¸c˜ao e coordena¸c˜ao entre os servidores para as opera¸c˜oes de atualiza¸c˜oes, por´em, mantendo a garantia de que os efei-tos das atualiza¸c˜oes aconte¸cam em algum momento. J´a a consistˆencia causal ocorre quando as opera¸c˜oes necessitam de coordena¸c˜ao ao se-rem executadas nos servidores, ou seja, o efeito de uma opera¸c˜ao s´o ´e considerado quando as outras opera¸c˜oes, as quais essa opera¸c˜ao possui dependˆencia, j´a tenham sido realizadas no servidor atual da opera¸c˜ao. A consistˆencia forte acontece quando ´e necess´ario uma coordena¸c˜ao e

(47)

sincroniza¸c˜ao entre todos os servidores participantes da replica¸c˜ao dos dados, afim de evitar que outras atualiza¸c˜oes conflitantes possam ser realizadas antes que a opera¸c˜ao atual seja sincronizada entre os servi-dores. Com a consistˆencia dos BDs e as RIs da aplica¸c˜ao mapeadas por contratos, foi poss´ıvel, atrav´es de TP, comparar e determinar se uma opera¸c˜ao, com um contrato definido de acordo com as regras da aplica¸c˜ao, pode ser atendida pelo n´ıvel de consistˆencia oferecido no BD. Caso n˜ao possa, um n´ıvel mais forte de consistˆencia ´e requisitado para o BD ao executar a opera¸c˜ao.

No caso de opera¸c˜oes envolvendo muitos objetos, a sintaxe de QUELEA possui uma extens˜ao para trabalhar com transa¸c˜oes. Como, por exemplo, a rela¸c˜ao sametxn, indicando que os efeitos pertencem `a mesma transa¸c˜ao. ´E poss´ıvel especificar no contrato a semˆantica de transa¸c˜oes sem coordena¸c˜ao (coordination-free transactions) como, por exemplo, Read Committed (BERENSON et al., 1995) (RC), Monotonic Atomic View (MAV) (BAILIS et al., 2013) e Repeatable Read (RR) ( BE-RENSON et al., 1995). A classifica¸c˜ao para o mapeamento das restri¸c˜oes da aplica¸c˜ao para a transa¸c˜ao adequada ´e realizada de forma similar ao mapeamento realizado com os n´ıveis de semˆantica do BD. Seguindo uma classifica¸c˜ao, ´e escolhida a transa¸c˜ao mais simples para atender a restri¸c˜oes da aplica¸c˜ao.

QUELEA foi implementada atrav´es de uma extens˜ao do compi-lador Haskell GHC (HASKELL.ORG, 2007) e testada no BD Cassandra. Atrav´es de templates em Haskell (SHEARD; JONES, 2002) foram cri-adas classifica¸c˜oes para os contratos, sendo que, para trabalhar com as provas l´ogicas, foi utilizada a ferramenta Z3 (MOURA; BJØRNER, 2008). Atrav´es da interface disponibilizada no Cassandra foi criada uma camada para interceptar as requisi¸c˜oes no BD e garantir a re-plica¸c˜ao e consistˆencia dos dados. Foi suportada EC, causal e forte na implementa¸c˜ao para as opera¸c˜oes que n˜ao envolvem transa¸c˜oes. Para as opera¸c˜oes com transa¸c˜oes foram suportadas as semˆanticas de con-sistˆencia RC, MAV e RR.

4.2 ADS

Em (BOCI ´C; BULTAN, 2014) ´e desenvolvido um mecanismo para preservar as invariˆancias do sistema da aplica¸c˜ao atrav´es da verifica¸c˜ao das a¸c˜oes executadas na mesma. Para isso foi criada uma especifica¸c˜ao, chamada Abstract Data Store (ADS), para representar o modelo de dados da aplica¸c˜ao. A ADS cont´em um conjunto de objetos, rela¸c˜oes

(48)

e a¸c˜oes e ´e criada de forma automatizada atrav´es da instrumenta¸c˜ao do c´odigo seguida da transforma¸c˜ao do c´odigo instrumentado para a linguagem ADS. Com a linguagem ADS ´e poss´ıvel uma redu¸c˜ao para uma especifica¸c˜ao de FOL e o uso de TP para que, atrav´es de uma verifica¸c˜ao indutiva de invariˆancia, seja poss´ıvel validar as invariˆancias do modelo de dados. O TP usado foi o Spass (WEIDENBACH et al., 2009), e como o TP ´e indecid´ıvel em alguns casos, foi usado um limitador no tempo de espera na execu¸c˜ao do provador.

A linguagem ADS, formalmente, segue a estrutura DS =< C, R, A, I >, sendo DS o BD representando, C o conjunto de classes, R o conjunto de rela¸c˜oes, A o conjunto de a¸c˜oes e I o conjunto de in-variˆancias. Cada rela¸c˜ao segue a estrutura r =< c0, ct, card >, com r ∈ R, sendo c0 a classe de origem, ct a classe destino e card a car-dinalidade da rela¸c˜ao, como muito para muitos ou um para muitos por exemplo. O conjunto de todos os estados poss´ıveis em um BD ´e denotado por DS, que possui a estrutura < O, T >, sendo O o con-junto de objetos e T o concon-junto de tuplas. Cada a¸c˜ao no BD ´e re-presentada pelo conjunto de transi¸c˜oes poss´ıveis entre os estados do BD: (< O, T >, < O0, T0 >) ⊆ DSXDS. Uma invariˆancia corresponde a uma fun¸c˜ao booleana no formato: DS → {true, f alse}. Um com-portamento no BD ´e formado por um conjunto de estados, sendo que cada par de estados ´e uma a¸c˜ao e o primeiro estado est´a de acordo com as invariˆancias da aplica¸c˜ao. Dessa forma, ao usar a verifica¸c˜ao via FOL, um BD ser´a consistente quando todos os estados alcan¸c´aveis satisfazem todas as invariˆancias da aplica¸c˜ao, ou seja, DS ´e consistente quando ∀(< O, T > | < O, T >∈ DSR∧ i ∈ I → i(< O, T >) = true.

O mecanismo de gera¸c˜ao da linguagem ADS foi desenvolvido utilizando a linguagem Ruby no framework Rails (RUBYONRAILS.ORG, 2017). Em Rails, o modelo de dados ´e implementado usando a bi-blioteca de persistˆencia e ORM ActiveRecord. Dessa forma, o me-canismo de cria¸c˜ao da linguagem ADS ´e baseado na transforma¸c˜ao de m´etodos como User.find by name, instrumentando o c´odigo, de-vido principalmente `a dinamicidade na gera¸c˜ao autom´atica de c´odigo pelo framework. A gera¸c˜ao da linguagem ADS requer que o c´odigo implementado pela aplica¸c˜ao siga corretamente a arquitetura Model-view-controller MVC. A¸c˜oes na interface n˜ao s˜ao capturadas na trans-forma¸c˜ao. As invariˆancias do sistema s˜ao descritas usando uma sintaxe pr´oxima a FOL em uma extens˜ao criada para o framework Rails. A descri¸c˜ao das invariˆancias foi feita manualmente, observando o c´odigo fonte dos projetos testados.

Referências

Documentos relacionados

Para cavernas da Serra do Ramalho, região localizada no sudoeste da Bahia e parte da Bacia do Médio São Francisco (Figura 6 - localização), foram registrados

Henrique Couto e a cobrança dos alunos do Ensino Médio desta instituição por aulas mais interativas e dinâmicas onde pudessem aproximar a teoria à prática, é que foi

Grande Dourados, no uso das atribuições que lhe foram conferidas pela Portaria nº 779, de 26/08/2014, considerando a Portaria nº 1.369/10, de 07/12/2010, que

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

No sentido de reverter tal situação, a realização deste trabalho elaborado na disciplina de Prática enquanto Componente Curricular V (PeCC V), buscou proporcionar as

Os casos não previstos neste regulamento serão resolvidos em primeira instância pela coorde- nação do Prêmio Morena de Criação Publicitária e, em segunda instância, pelo

O desenvolvimento das interações entre os próprios alunos e entre estes e as professoras, juntamente com o reconhecimento da singularidade dos conhecimentos

Os conselhos de assistência social caracterizam-se como conselhos gestores, pois atuam na proposição e formulação das políticas sociais, integram representantes da