Apache Cassandra NoSQL, uma tecnologia emergente

Neste documento veremos, sem mistério, um pouco da tecnologia emergente NoSQL (Apache Cassandra), que tomou o lugar do banco MySQL no projeto Twitter, segundo as notícias publicadas em toda internet, como também colocou em evidência o assunto.

[ Hits: 46.600 ]

Por: Alessandro de Oliveira Faria (A.K.A. CABELO) em 17/03/2010 | Blog: http://assuntonerd.com.br


Jogo rápido, download e instalação



Em primeiro lugar efetue o download em:
# wget http://linorg.usp.br/apache/cassandra/0.5.1/apache-cassandra-0.5.1-bin.tar.gz

Descompacte o pacote com o tradicional comando "tar -zxvf" e configure a variável ambiental CASSANDRA_HOME:

# cd /opt
# tar -zxvf apache-cassandra-0.5.1-bin.tar.gz
# export CASSANDRA_HOME=/opt/apache-cassandra-0.5.1


Modifique o arquivo storage-conf.xml conforme as suas necessidades e crie as pastas:

# cd /opt/apache-cassandra-0.5.1/conf/
# vi storage-conf.xml


Crie os diretórios especificados no arquivo storage-conf.xml mencionado anteriormente.

# mkdir -p /var/lib/cassandra/commitlog
# mkdir /var/lib/cassandra/data
# mkdir /var/lib/cassandra/callouts
# mkdir /var/lib/cassandra/staging
# mkdir -p /var/log/cassandra
# mkdir -p /var/lib/cassandra


ATENÇÃO:

Se você optou baixar o código fonte, basta utilizar o comando abaixo para compilar o pacote:

# ant ivy-retrieve

Pronto, inicie o serviço Cassandra executando o script "cassandra" na pasta bin seguido do parâmetro -f:

# bin/cassandra -f

Para executar o cliente, entre na pasta /opt/apache-cassandra-0.5.1/bin/ e execute o comando "cassandra-cli" seguido no IP do servidor e a porta. No nosso caso, utilizaremos o valores default (localhost e porta 9160).

# cd /opt/apache-cassandra-0.5.1/bin/
# ./cassandra-cli --host localhost --port 9160

Connected to localhost/9160
Welcome to cassandra CLI.

Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
Cassandra>

Agora no console cliente do Cassandra, utilize os comandos do exemplo abaixo para inserir uma chave:

cassandra> set Keyspace1.Standard1['cabelo']['first'] = 'Alessandro'
Value inserted.
cassandra> set Keyspace1.Standard1['cabelo']['last'] = 'Faria'
Value inserted.
cassandra> set Keyspace1.Standard1['cabelo']['age'] = '38'
Value inserted.

Consultando a chave inclusa anteriormente:

cassandra> get Keyspace1.Standard1['cabelo']
=> (column=6c617374, value=Faria, timestamp=1267416876445)
=> (column=6669727374, value=Alessandro, timestamp=1267416865908)
=> (column=616765, value=38, timestamp=1267416894415)
Returned 3 results.

Excluindo a chave adicionada anteriormente:

cassandra> del Keyspace1.Standard1['cabelo']
row removed.

E o desenvolvimento? Para os desenvolvedores, sugiro o projeto Cassandra Java Client. A seguir uma receita de bolo (da página oficial) de como efetuar o download e testá-lo:

svn checkout https://cassandra-java-client.googlecode.com/svn/trunk/ cassandra-java-client
$ cd cassandra-java-client
$ mvn install


Abaixo um código exemplo extraível da própria página do projeto:

CassandraClient cl = pool.getClient() ;
KeySpace ks = cl.getKeySpace("Keyspace1") ;

// insert value
ColumnPath cp = new ColumnPath("Standard1" , null, "testInsertAndGetAndRemove".getBytes("utf-8"));

for(int i = 0 ; i < 100 ; i++){
   ks.insert("testInsertAndGetAndRemove_"+i, cp , ("testInsertAndGetAndRemove_value_"+i).getBytes("utf-8"));
}

//get value
for(int i = 0 ; i < 100 ; i++){
   Column col = ks.getColumn("testInsertAndGetAndRemove_"+i, cp);
   String value = new String(col.getValue(),"utf-8") ;
   assertTrue( value.equals("testInsertAndGetAndRemove_value_"+i) ) ;
}


//remove value
for(int i = 0 ; i < 100 ; i++){
   ks.remove("testInsertAndGetAndRemove_"+i, cp);
}


try{
   ks.remove("testInsertAndGetAndRemove_not_exist", cp);
}catch(Exception e){
   fail("remove not exist row should not throw exceptions");
}

//get already removed value
for(int i = 0 ; i < 100 ; i++){
   try{
      Column col = ks.getColumn("testInsertAndGetAndRemove_"+i, cp);
      fail("the value should already being deleted");
   }catch(NotFoundException e){

   }catch(Exception e){
      fail("throw out other exception, should be NotFoundException." + e.toString() );
   }
}

pool.releaseClient(cl) ;
pool.close() ;

Acredito que este documento permita alavancar o interesse para outros projetos com a tecnologia NoSQL. Como sempre menciono: Colaborar atrai amigos, competir atrai inimigos...
Sobre o autor: http://www.netitec.com.br/alessandro

Página anterior    

Páginas do artigo
   1. Introdução
   2. Jogo rápido, download e instalação
Outros artigos deste autor

Biometria: Reconhecimento Facial OpenSource!

Criando aplicativos para o Mac OS X no GNU/Linux

Conheçam a linguagem D (saiu do forno)!

Transforme o seu celular Android em webcam sem fio na plataforma Linux

Como fazer um viciante e cativante servidor de Quake2 CTF

Leitura recomendada

Instalando Interbase 2007 Developer em Linux OpenSuSE 10.2

Iniciando com o SQLite

Instalando o tora (toolkit for oracle) no Slackware 10.2

Desenvolvimento de uma interface WEB com PHP para gerenciamento de banco de dados CouchDB

Consultas SQL pelo Terminal no Postgres, Mysql, SQL Server, etc

  
Comentários
[1] Comentário enviado por jborda em 18/03/2010 - 08:49h

"Boa Cabelo!", tenho "ouvido" falar muito no Cassandra(NoSQL) ultimamente(essa semana), e agora com "ela" bombando no Twitter vai chamar muito a atenção! Pretendo testa-lo logo-logo.

[2] Comentário enviado por newwave em 19/03/2010 - 18:28h

Ainda não entendi uma coisa: NoSQL, significa que ele não usa o padrão SQL e sim um padrão próprio?
Outra coisa: não serve pra ser usado em C/C++?

[3] Comentário enviado por baza em 20/03/2010 - 13:11h

A gente que era acostumada a instalar o metapacote LAMP teria grandes dificuldades em substituir o Mysql pelo NoSQL?

[4] Comentário enviado por junior em 09/01/2013 - 00:11h

Trabalho com Cassandra em um ambiente com cerca de 2 bilhões de requisições por mês e tem sido simplesmente fenomenal a performance do Cassandra. O casamento com o MEMCACHE deixa tudo mais melhor de bom da conta.
-
@newwave: "Esqueça" o padrão SQL. Não foreign key e etc. O conceito é muito semelhante ao hash que o Ruby implementa, é básicamente chave, coluna, valor. Exemplo

Carros { //chave
cor //coluna => "branco" // valor
}

(Usei a estrutura do hash do Ruby pra exemplificar)

Sendo assim é muito performático para big data e operações com map reduce.

Um abraço.

Parabéns Cabelo, ótima documentação.

[5] Comentário enviado por gibroh@hotmail.c em 07/05/2013 - 15:52h

Desde 2008 eu havia iniciado a criar um SGBD em csv chamado CSV Comp.
Esse Banco de dados tem caracteristicas como este tal cassandra,porem tem controle de concorrencia e relacional (inclusive).
Desde o inicio de 2008,havia uma linguagem no meu banco que eu chamei de CQL (Comma Query Language).
Em 2011 o Cassandra adotou o nome CQL como sendo o nome da linguagem de manipulação de dados. (4 anos depois).
Fico pensando.Como ficará minha aplicação ?Devo mudar meus códigos?
Veja meu BANCO COM CQL desde 2008
http://www.youtube.com/results?search_query=csv+comp

veja sintaxe:
{
Tabela;
@tabela;
0;0;0;
query=0;
destino=0
}

Veja o Cassandra que usa desde 2011:
http://cassandra.apache.org/download/

Observação:Não vou mudar meu nome.Meu funciona em CGI e desktop.

Nós Brasileiros temos mania de engrandecer tudo que é estrangeiro e desprezar os nossos "Tabajaras".

[6] Comentário enviado por gibroh@hotmail.c em 07/05/2013 - 16:03h

vou mostrar exemplo com cgi

<html>
<form action='http://servidor/cgi-bin/executa.exe/default'>
Digite nome:<br>
<input type='text' name='id_nome'></a><p>

Digite nome:<br>
<input type='submit' name='script_cql_original.cql' value='CQL original'></a><p>

</form>
</html>

//script que cadastra um item na tabela csv usando script cql (Comma Query Language)

{
Sua_tabela;
@adicionar;
(id_nome);
0;0;0;
query=0;
destino=0
}

//Salva script no cgi-bin

//Agora exemplo com aplicações usando pascal

var meu_cql:tstringlist;
begin
meu_cql:=tstringlist.create;
//adiciona comando CQL
meu_cql.add('{Sua_tabela;@adicionar;('+ edit1.text +');0;0;0;query=0;destino=0}');

//Salva para entrada do banco
meu_cql.savetofile(c:\caminho\inpout_comp.exe)
shellexec(bla,bla,bla);//executa o parser

meu_cql.free;
end;


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts