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.960 ]

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

SIAGES: Uma oportunidade de negócio com software livre

Instalando o poderoso banco de dados IBM DB2!

Hbasic, um forte candidato open source para brigar com o Microsoft Visual Basic

Acesso aos recursos compartilhados de sua rede Microsoft ou Samba via HTTP

Brasil apimenta a guerra do software livre

Leitura recomendada

Internet: Amiga ou inimiga?

Instalando o tora (toolkit for oracle) no Slackware 10.2

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

Instalar o MongoDB no Ubuntu

Gambas2: Inserindo dados em tabela SQLite

  
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