You are on page 1of 55

PBD Prof Guardado

Douglas Lima Glauco Elias Haroldo Reis Leandro Dalmaz

No SQL
O termo NoSQL uma abreviao de Not Only SQL, ou seja No Somente SQL. O termo surgiu em 1998, para denominar os bancos de dados relacionais de cdigo aberto que no possuam uma interface SQL.
Em 2009, o termo NoSQL passou a ser utilizado para descrever banco de dados de cdigo aberto, no relacionais e que fossem projetados para armazenamento distribudo de dados, execuo de consultas com baixa latncia e modelos flexveis de armazenamento de dados.

No SQL
NoSQL um modelo de banco de dados que surgiu como uma soluo alternativa aos bancos de dados relacionais, devido a dificuldade que algumas empresas tinham de tornar seus bancos de dados mais escalveis, devido ao alto custo e complexidade.
As tecnologias NoSQL no tm como objetivo substituir os bancos de dados relacionais, mas apenas propor algumas solues que em determinados cenrios so mais adequadas. Desta forma possvel trabalhar com tecnologias NoSQL e banco de dados relacionais dentro de uma mesma aplicao.

No SQL
Porm, vale ressaltar que para aumentar a performance e a escalabilidade, banco de dados NoSQL no suportam as propriedades ACID, que so um padro nos bancos de dados relacionais :
Atomicidade - Capacidade de uma transao ter todas as suas operaes executadas ou nenhuma delas. Resumindo " ou vai, ou racha Consistncia - Indica que a base de dados est consistente no incio da transao e ao seu final, porm durante a transao certas regras podem ser quebradas. Resumindo " antes do pai sair e depois que chegar as coisas tm que estar arrumadas, durante seja l o que Deus quiser

No SQL
Porm, vale ressaltar que para aumentar a performance e a escalabilidade, banco de dados NoSQL no suportam as propriedades ACID, que so um padro nos bancos de dados relacionais :
Isolamento - Capacidade das operaes de uma transao no serem vistas pelas outras transaes at que esta esteja encerrada. Duas transaes s podem ser simultneas se elas no alterarem os mesmos dados. Resumindo " no mete o bedelho no que estou fazendo

.
Durabilidade - Indica que depois de uma transao ser executada com sucesso, as alteraes efetuadas persistam e no sejam desfeitas. Garante que os dados estaro disponveis em definitivo. Resumindo " ajoelhou tem que rezar "

Um pouco de histria
O Cassandra foi desenvolvido pelo Facebook para ajudar no funcionamento da caixa de busca do Facebook e armazenar/vasculhar todas as mensagens das caixas de entrada dos usurios. Foi liberado sob licena Open Source em julho de 2008. Cassandra comeou como um projeto de incubao da Fundao Apache em janeiro de 2009.

Um pouco de histria
Implementado em Java, ele foi fortemente influenciado pelo Dynamo, da Amazon, pioneiro na criao de um banco de dados do tipo chave/valor. Porm a forma de armazenar os dados mais semelhante ao Google Bigtable (orientado a colunas).

Popularidade*

* http://db-engines.com/en/ranking

Diferenas Relacional x NoSQL


Escalonamento: Existem dois tipos de escalonamento:
Vertical: muito conhecido por ser simples e indicado para as camadas dos bancos de dados aumentando a capacidade de armazenamento no servidor. Horizontal: possui uma facilidade na distribuio dos dados desse modo aumenta o nmero de servidores e muito utilizado na Web. Modelo Relacional: Complexo, pois sua estrutura robusta, pouco flexvel no permite de forma fcil tal ao. NoSQL: de fcil aplicabilidade o escalonamento no sistema, um dos motivos pelo qual foi criado para suprir essa necessidade que o modelo relacional no possui.

Diferenas Relacional x NoSQL


Consistncia: Ocorre quando tem trocas de dados no banco, caso

ocorra algum erro nessa transio o sistema desfaz as ultimas modificaes e volta para o estado consistente sem erros.

Modelo Relacional: o ponto mais forte do modelo, proporciona uma grande consistncia s informaes nele contida.

NoSQL : No o ponto forte do modelo, caso no ocorra nenhuma atualizao nas informaes o prximo acesso recebe os dados da ultima atualizao.

Diferenas Relacional x NoSQL


Disponibilidade: Se torna presente quando ocorre algum problema em

uma determinada parte e no compromete o restante do sistema, pois o sistema no se concentra em apenas uma maquina e sim em vrias.

Modelo Relacional: Por ser difcil trabalhar de forma consistente com as distribuies de dados, o modelo pode no suportar tamanha demanda em seu banco.

NoSQL: Outro ponto forte no modelo, pois por trabalhar sem relacionamento entre as tabelas no tem dificuldade na distribuio dos dados. Assim podendo atender um nmero maior de distribuies sem que fique por muito tempo no disponvel.

Diferenas Relacional x NoSQL


Uma analogia de comparao entre os modelos Relacional e NoSQL

Vantagens Tcnicas apresentadas


Tornou to popular por causa de suas excelentes caractersticas tcnicas. Porm a forma de armazenar os dados mais semelhante ao Google Bigtable (orientado a colunas). durvel, facilmente escalvel, eventualmente consistente e tolerante a falhas. Pode armazenar centenas de Terabytes de dados com suporte para replicao em vrios datacenters. descentralizado e sem nenhum ponto nico de falha, cada n do cluster idntico.

Modelo de dados
O modelo de dados do Cassandra projetado para dados distribudos em uma escala muito grande, ou seja, milhares de dados distribudos e replicados ao longo de vrias mquinas (ns) que operam em conjunto de maneira a aparecem como uma nica instncia para o utilizador final.

Cluster
a estrutura mais externa do Cassandra, s vezes chamado de anel , um recipiente para os keyspaces. Desta forma, o Cassandra provavelmente no a melhor escolha se voc s precisa executar um nico n. Se o primeiro n para de funcionar, uma rplica pode responder a consultas.

Cluster
Exemplos de edio do Cluster e Visualizao em anel!

Cluster
Um cluster pode e geralmente tem mais de uma mquina ou n que mantm uma rplica para diferentes faixas de dados. Se o primeiro n para de funcionar, uma rplica pode responder a consultas. O protocolo peer-to-peer permite que os dados sejam replicados entre os ns de uma forma transparente para o usurio, e o fator de replicao o nmero de mquinas do cluster que ir receber cpias dos mesmos dados.

Keyspace
Um Keyspace o continer mais alto para dados no Cassandra.
O keyspace corresponde a um banco de dados no mundo relacional e assim como no mundo relacional os keyspaces possuem nomes e atributos que definem o seu comportamento.

Keyspace
O Cassandra permite a criao de vrios keyspaces por cluster ou aplicao, uma prtica que no muito recomendada.
Por exemplo, se seu aplicativo chamado Twitter, voc provavelmente teria um cluster chamado Twitter-Cluster e um keyspace chamado Twitter.

Keyspace Atributos Bsicos


Replication factor: O fator de replicao refere-se ao nmero de ns que atuaro como cpias (rplicas) de cada linha de dados inseridos . Se o seu fator de replicao 3, ento, trs ns no anel tero cpias de cada linha inserida, e essa replicao transparente aos clientes.
O fator de replicao essencialmente permite voc decidir o quanto voc quer pagar em desempenho para ganhar mais consistncia. Ou seja, o seu nvel de consistncia para a leitura e escrita de dados baseia-se no fator de replicao.

Keyspace Atributos Bsicos


Replica placement strategy: refere-se a forma como as rplicas sero colocados no anel. Existem diferentes estratgias para determinar quais ns vo receber as cpias de que chaves (keys), que podem ser:

Keyspace Atributos Bsicos


Simple Strategy usada por padro esta estratgia replica os dados em nico data center, de uma forma que o usurio no tem noo da sua colocao no rack de dados.

Keyspace Atributos Bsicos


OldNetwork Topology Strategy - utilizado para distribuir os dados em diferentes racks no mesmo data center. Indicado para quando quiser assegurar alta disponibilidade no acesso aos dados.

Keyspace Atributos Bsicos


Network Topology Strategy - possibilita especificar como as rplicas dos dados sero colocados nos data centers.

Keyspace Atributos Bsicos

Exemplo de setagem uso com Network Topology Strategy, padro para o pacote do Apache, visualizado no DataSax .

Keyspace Atributos Bsicos


Column Family: da mesma forma que uma base de dados relacional um recipiente para tabelas, um keyspace um recipiente para obter uma lista de uma ou mais famlias de coluna. Cada keyspace tem pelo menos uma e frequentemente muitas famlias de coluna.

Column Family
Uma famlia de coluna aproximadamente anlogo a uma tabela no modelo relacional, e um recipiente para uma coleo de linhas. Cada linha contm colunas ordenadas. Column Family representam a estrutura de seus dados.
No mundo relacional, quando voc cria fisicamente seu banco de dados a partir de um modelo, especificando o nome do banco de dados (keyspace), os nomes das tabelas, e em seguida, define os nomes das colunas que estaro em cada tabela.

Column Family
Mas as semelhanas param por a, Cassandra considerado livre de esquema porque, embora as Column Family so definidas, as colunas no so.
Voc pode adicionar livremente qualquer coluna para qualquer Column Family a qualquer momento.

Column Family
Uma Column Family possui dois atributos: um nome e um comparador (indicada como as colunas sero organizadas quando retornadas por uma Query).
As colunas esto armazenadas em arquivos separados no disco, importante manter colunas relacionadas definidos em conjunto na mesma coluna famlia.

Column Family
Visualizao de Colums Families no DataSax.

Super Column Family


um conjunto de colunas, ou seja, para cada linha da ColumnFamily, podemos ter SuperColumns que possuam vrias colunas.
Por padro, Column Families so configuradas com o tipo Standard, para uma super column Family voc configura seu padro para o tipo super.

Column
Situada dentro de uma column family ou super column Family, a coluna a unidade mais bsica da estrutura de dados no modelo de dados Cassandra. Uma coluna composta de um nome, um valor e um timestamp. Os tipos de dados para o nome e valor so matrizes de bytes Java, frequentemente fornecidos como strings. Uma vez que o nome e o valor so tipos binrios, que podem ser de qualquer comprimento.
O campo timestamp funciona como uma bssola verificando o campo mais atual entre as replicas.

Exemplo de Modelo de Dados

Exemplo de Modelo de Dados

Instalao do Cassandra
Para instalao do Cassandra apache no Windows, seguimos alguns tutorias que utilizam um pacote originalmente desenvolvido para LINUX, mas com algumas modificaes torna-se possvel tal instalao.

Verso apache-cassandra-0.6.8-bin.tar.gz do site http://cassandra.apache.org/download Instalamos o JAVA 6. Configuramos a variveis de sistema existe JAVA_HOME definindo seu caminho: Configuramos o arquivo cassandra.yaml com o caminho do Windows na qual o pacote de instalao foi configurado.. Na prtica substitumos o caminho /var/lib/cassandra pelo C:\Cassandra Executamos o arquivo cassandra.bat da pasta bin do caminho C:\Cassandra

Instalao do Cassandra

Para configurao, rodamos o arquivo cassandra-cli.bat, tendo acesso ao prompt para de acesso .

Instalao do Cassandra
Visualizao do KeySpace, Columns, Key e Value utilizando a ferramenta DataSax

Benchmarking

Banco Relacional Mysql X Banco NoSQL Cassandra

Criando no Mysql
Modelo SQL, seguindo nosso modelo de testes

Criando no Mysql
Comandos utilizados
Para criar o schema: CREATE DATABASE `consultatexto` /*!40100 DEFAULT CHARACTER SET latin1 */$$ Para criar as tabelas: CREATE TABLE `capitulo` ( `cod_livro` int(11) NOT NULL, `cod_capitulo` int(11) NOT NULL, `nm_capitulo` varchar(100) NOT NULL, `nm_texto` longtext, PRIMARY KEY (`cod_livro`,`cod_capitulo`), KEY `cod_livro` (`cod_livro`), CONSTRAINT `cod_livro` FOREIGN KEY (`cod_livro`) REFERENCES `livro` (`cod_livro`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$ CREATE TABLE `livro` ( `cod_livro` int(11) NOT NULL AUTO_INCREMENT, `nm_livro` varchar(45) NOT NULL, `nm_autor` varchar(100) DEFAULT NULL, `nm_editora` varchar(45) DEFAULT NULL, `nr_edicao` varchar(45) DEFAULT NULL, PRIMARY KEY (`cod_livro`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1$$

Criando no Mysql
Comandos utilizados
Inserindo informaes nas tabelas: INSERT INTO LIVRO VALUES (1,'Pai rico pai pobre','Robert T. Kiyosaki Sharon L. Lechter','Campus',66); INSERT INTO capitulo VALUES (1,1,'Pai rico, pai pobre','Pai rico, Pai pobre por Robert Kiyosaki Tive dois pais, um rico e outro pobre. Um era muito instrudo e inteligente;);

Criando no Cassandra
Data Sample no Cassandra, seguindo nosso modelo de testes

Criando no Cassandra
Comandos utilizados
Para criar o Keyspace create keyspace consultatexto; use consultatexto;

Criando no Cassandra
Comandos utilizados
Para criando os Collum Family
create column family livro with comparator = UTF8Type; update column family livro with column_metadata = [ {column_name: cod_livro, validation_class: UTF8Type, index_type: KEYS}, {column_name: nm_livro, validation_class: UTF8Type, index_type: KEYS}, {column_name: nm_autor, validation_class: UTF8Type, index_type: KEYS}, {column_name: nm_editora, validation_class: UTF8Type, index_type: KEYS}, {column_name: nr_edicao, validation_class: UTF8Type, index_type: KEYS}, {column_name: cod_capitulo, validation_class: UTF8Type, index_type: KEYS}, {column_name: nm_capitulo, validation_class: UTF8Type, index_type: KEYS}, {column_name: nm_texto, validation_class: UTF8Type, index_type: KEYS} ]; assume livro keys as utf8;

Criando no Cassandra
Comandos utilizados
Setando Valores (value) para cada Coluna (Column)
set livro['PaiRico']['cod_livro'] = '1'; set livro['PaiRico']['nm_livro'] = 'Pai rico pai pobre'; set livro['PaiRico']['nm_autor'] = 'Robert T. Kiyosaki Sharon L. Lechter'; set livro['PaiRico']['nm_editora'] = 'Campus'; set livro['PaiRico']['nr_edicao'] = '66'; set livro['PaiRico']['cod_capitulo,'] = '1'; set livro['PaiRico']['nm_capitulo'] = 'Pai rico, pai pobre'; set livro['PaiRico']['nm_texto, '] = 'Pai rico, Pai pobre por Robert Kiyosaki Tive dois pais, um rico e outro pobre. Um era muito instrudo e inteligente;

Criando no Cassandra
Comandos utilizados
Setando Valores (value) para cada Coluna (Column)

Criando no Cassandra
Exemplo de Consulta
Consultando no Cassandra

get livro where cod_livro = ''1';

Concluso
Aps vrias leituras, revises e alguns testes com um modelo mais simplificado, como a consulta de Captulos de Livros, constatamos que no possvel simplesmente apontar qual modelo o melhor ou qual o pior, pois depende do que o desenvolvedor ou programador necessita para sua aplicao.
Como vimos em nosso caso e em histrico de estudo de caso prticos e reais, pode ocorrer at que se utilizem os dois modelos em uma nica Aplicao.

Concluso
Ambos possuem seus pontos fortes e fracos, basta analisar os pontos fortes e fracos de cada um e escolher o que se adapta melhor com o que se deseja.

Deste modo, para um aplicao de consulta a Captulos de Livros, o modelo relacional pareceu o mais propcio.

Concluso
Lembramos que, por exemplo, o LIKE, JOIN no existem no Cassandra. Temos que utilizar alguns truques, como criar Index adicionais ou criar consultas quebradas ou ferramentas de terceiros como Elasticsearch.
Cassandra sempre armazena dados de um modo em que as colunas so classificados com base em seus nomes. Isso torna mais fcil a busca de dados atravs de uma coluna usando Slice Query, mas mais difcil de procurar dados atravs de uma linha , a no ser que se utilize outros mtodos.

Concluso
Outra diferena crucial que os nomes de colunas em BD Relacional representam metadados sobre dados, mas nunca de dados. No Cassandra, no entanto, os nomes das colunas podem incluir dados. Consequentemente, as linhas de Cassandra pode ter milhes de colunas, enquanto um modelo relacional tem geralmente dezenas de colunas.

Concluso
O Cassandra no suporta todos os mtodos de pesquisa do projeto mais bsicos. Embora ele suporta ndices secundrios, eles so suportados usando ndices que so construdos mais tarde, e os ndices secundrios tm vrias limitaes, incluindo a falta de suporte para consultas mais abrangentes
Consequentemente, os melhores resultados no Cassandra necessitam que sejam implementadas pesquisas atravs da construo de ndices personalizados e utilizando ordens de classificao de colunas e linhas.

Concluso
Embora no nosso exemplo deste trabalho , a pesquisa dos Captulos de Livros podem at suportar as consultas exigidas, estas s podem ser alcanadas desde que se pense isso j no projeto. Por exemplo, o Cassandra no pode fazer as seguintes consultas SQL sem a construo de novos ndices.
Select * from Livro where cod_livro > 1; Select * from Livro where nm_editora=Campus Teriamos que criar um Column Family que contenha o Cod_livro_index ou Nm_editora_index relacionado a cada livro.

Referncias

http://www.nosqlbr.com.br/ http://cadmintool.blogspot.com.br/ http://javafree.uol.com.br/wiki/ACID http://www.onucleo.com/portal/index.php/banco-dedados/nosql/328-diferencas-modelorelacional-mongodb.html http://tiaguins.blogspot.com.br/2012/03/instalando-o-apachecassandra-no.html http://support.qualityunit.com/knowledgebase/developers/cas sandra/cassandra-installation-on-windows-7.html http://doanduyhai.wordpress.com/2012/07/05/apachecassandra-tricks-and-traps/ http://www.ibm.com/developerworks/library/os-apachecassandra/index.html

Muito Obrigado!