Professional Documents
Culture Documents
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
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.
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.
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.
Exemplo de setagem uso com Network Topology Strategy, padro para o pacote do Apache, visualizado no DataSax .
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.
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.
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
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
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
Muito Obrigado!