Primeros pasos con Cassandra

En esta entrada voy a instalar en mi entorno osx (Yosemite) una de las base de datos NoSQL mas famosa, Apache Cassandra. Después de trastear un poco, creo que la version community que Datastax provee es la manera mas fácil de instalar esta base de datos. Existe otra manera de instalarla usando homebrew, pero a día de hoy, esa manera yo no la recomiendo porque presenta problemas a la hora de conectarte con la base de datos, igual cuando se actualicen los paquetes, pero a día de hoy no.

Ve y descarga la version Community de Datastax desde este enlace. La version actual estable es 2.1.9, después de descargar el fichero tar.gz, lo descomprimes a una carpeta de tu eleccion, yo lo he hecho en

MacBook-Pro-Retina-de-Alonso:dsc-cassandra-2.1.9 aironman$ pwd

/Users/aironman/dsc-cassandra-2.1.9

Estoy asumiendo que tienes instalado Java y su JDK en tu osx. Si no es así, por favor ve a este enlace y sigue las instrucciones para tu sistema.

Ahora, para empezar a usar Cassandra en tu maquina, ve al directorio donde has instalado Cassandra y lanza el siguiente comando:

MacBook-Pro-Retina-de-Alonso:dsc-cassandra-2.1.9 aironman$ cd bin/
MacBook-Pro-Retina-de-Alonso:bin aironman$ ./cassandra -f

Con -f, empiezas el proceso en primer plano, por lo que te será mas fácil matar el proceso haciendo Crtl+c, si lanzas el proceso Cassandra sin el -f, para matar el proceso tendrías que hacer un ps -xa | grep Cassandra para averiguar el pid y luego hacer un kill -9 pid-cassandra donde pid-cassandra es el pid que has averiguado antes con el comando ps.

Cuando el cluster ha empezado, deberias ver un montón de texto, algo como esto:

MacBook-Pro-Retina-de-Alonso:bin aironman$ ./cassandra -f
objc[28653]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.

Ya está, con esto tienes Cassandra funcionando en tu maquina local. Ahora voy a seguir los pasos de este enlace para crear una tabla en el equivalente a un esquema y luego vamos a crear, leer, actualizar y borrar el equivalente a las tuplas en un lenguaje pseudo SQL, bueno, la verdad es que parece ansi SQL al 100%, una de las razones por las que Cassandra esta pegando tan fuerte.

En el mismo directorio donde has copiado el fichero de Cassandra, cámbiate el directorio bin y veras esto:

MacBook-Pro-Retina-de-Alonso:bin aironman$ pwd
/Users/aironman/dsc-cassandra-2.1.9/bin
MacBook-Pro-Retina-de-Alonso:bin aironman$ ls
cassandra debug-cql sstablescrub
cassandra-cli debug-cql.bat sstablescrub.bat
cassandra-cli.bat nodetool sstableupgrade
cassandra.bat nodetool.bat sstableupgrade.bat
cassandra.in.bat source-conf.ps1 stop-server
cassandra.in.sh sstablekeys stop-server.bat
cassandra.ps1 sstablekeys.bat stop-server.ps1
cqlsh sstableloader
cqlsh.bat sstableloader.bat

Ves el fichero cqlsh? ejecutalo con este comando:

MacBook-Pro-Retina-de-Alonso:bin aironman$ ./cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.1.9 | CQL spec 3.2.0 | Native protocol v3]
Use HELP for help.
cqlsh>

Como puedes suponer, cqlsh es un cliente Cassandra que se conecta al servidor para que así puedas lanzar comandos al mismo. Vamos a jugar. Ejecuta este comando:

cqlsh> desc keyspaces

Deberias ver ésto

system_traces system 

Un keyspace es el equivalente a un esquema en un entorno SQL como el de Oracle, MariaDB, Mysql o postgres.

El keyspace incluye a elementos operacionales como el factor de replicacion, entre otros. Ahora crea un keyspace llamado “demo”. Vamos a incluir una estrategia de replicacion simple. Para ello lanza estos comandos en otra terminal cqlsh:

cqlsh> CREATE KEYSPACE demo
WITH REPLICATION = { ‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : 1 };

Ahora, para ver el keyspace que acabamos de crear, lanza este comando:

cqlsh> USE demo;

Ahora tenemos nuestro propio keyspace donde podemos crear tablas y almacenar datos en ellas. Las tablas o familias de columnas consisten en columnas y filas.

Crea una tabla llamada “users” dentro del keyspace “demo” e insertemos algunos datos:

Now we have we have a keyspace, we can create tables within that keyspace to store our data in. Tables, or column families, consist of columns and rows.

Create a “users” table within the keyspace “demo” so that we can insert some data into our database:

cqlsh> CREATE TABLE users (
firstname text,
lastname text,
age int,
email text,
city text,
PRIMARY KEY (lastname));
Con este comando, he creado una tabla llamada users que tiene una clave primaria simple llamada lastname. Ahora, para ver los atributos que tiene esta tabla puedes teclear el siguiente comando:

cqlsh:demo> desc schema;

Deberias ver algo así:
CREATE KEYSPACE demo WITH replication = {‘class’: ‘SimpleStrategy’, ‘replication_factor’: ‘1’}  AND durable_writes = true;
CREATE TABLE demo.users (

    lastname text PRIMARY KEY,

    age int,

    city text,

    email text,

    firstname text

) WITH bloom_filter_fp_chance = 0.01

    AND caching = ‘{“keys”:”ALL”, “rows_per_partition”:”NONE”}’

    AND comment = ”

    AND compaction = {‘class’: ‘org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy’}

    AND compression = {‘sstable_compression’: ‘org.apache.cassandra.io.compress.LZ4Compressor’}

    AND dclocal_read_repair_chance = 0.1

    AND default_time_to_live = 0

    AND gc_grace_seconds = 864000

    AND max_index_interval = 2048

    AND memtable_flush_period_in_ms = 0

    AND min_index_interval = 128

    AND read_repair_chance = 0.0

    AND speculative_retry = ‘99.0PERCENTILE’;

Ahora vamos a hacer unas cuantas operaciones de inserción y seleccion, luego haremos actualización y borrado de tuplas.

Si no tienes abierta el cliente de cassandra, abrelo de nuevo, ya sabes, el comando cqlsh:

MacBook-Pro-Retina-de-Alonso:bin aironman$ pwd
/Users/aironman/dsc-cassandra-2.1.9/bin
MacBook-Pro-Retina-de-Alonso:bin aironman$ ./cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.1.9 | CQL spec 3.2.0 | Native protocol v3]
Use HELP for help.
cqlsh>

Seleccionamos el keyspace que hemos creado anteriormente:

cqlsh> use demo;

Ahora hago un nuevo insert, yo antes ya habia lanzado un par de ellos:
cqlsh:demo> insert into users(firstname,lastname,age,city,email) values(‘jose’,’roman’,38,’badajoz’,’blabla@gmail.com’) ;

Ahora compruebo que se han insertado correctamente:
cqlsh:demo> select * from users;

lastname | age | city | email | firstname
———-+—–+————+———————–+———–
Isidoro | 38 | Badajoz | alonsoir@gmail.com | Alonso
roman | 38 | badajoz | blabla@gmail.com | jose
Smith | 46 | Sacramento | johnsmith@email.com | John

(3 rows)
cqlsh:demo>

Facil, verdad?

Ahora actualización y por ultimo borrado. Solo hay que tener en cuenta que las dos operaciones requieren que pongas en la parte del where su clave primaria, en este caso, creamos esta tabla con el campo lastname como clave primaria.

cqlsh:demo> select * from users;

lastname | age | city | email | firstname
———-+—–+————+———————–+———–
Isidoro | 38 | Badajoz | alonsoir@gmail.com | Alonso
roman | 38 | badajoz | blabla@gmail.com | jose
Smith | 46 | Sacramento | johnsmith@email.com | John

(3 rows)
cqlsh:demo> update users set age=37 where lastname=’Isidoro’;
cqlsh:demo> select * from users;

lastname | age | city | email | firstname
———-+—–+————+———————–+———–
Isidoro | 37 | Badajoz | alonsoir@gmail.com | Alonso
roman | 38 | badajoz | blabla@gmail.com | jose
Smith | 46 | Sacramento | johnsmith@email.com | John

(3 rows)
cqlsh:demo>

Fácil verdad?

La operación de borrado es igual, se hace tal que así:

cqlsh:demo> delete from users where lastname=’roman’;
cqlsh:demo> select * from users;

lastname | age | city | email | firstname
———-+—–+————+———————+———–
Isidoro | 37 | Badajoz | alonsoir@gmail.com | Alonso
Smith | 46 | Sacramento | johnsmith@email.com | John

(2 rows)
cqlsh:demo>

Si intentas borrar o actualizar alguna tupla y no pones en la clausura where la clave primaria, te saltará una excepción tal que así, firstname no es clave primaria en esta tabla.

cqlsh:demo> delete from users where firstname=’Alonso’;

InvalidRequest: code=2200 [Invalid query] message=”Non PRIMARY KEY firstname found in where clause”

cqlsh:demo>

Fácil verdad?🙂

Por ultimo voy a comentar en este post algo muy importante cuando tratamos con bases de datos, conocer el teorema de Brewer, también conocido como teorema CAP, el cual dice que en sistemas distribuidos es imposible garantizar a la vez estas tres caracteristicas, tienes que elegir dos de tres:

  • consistencia,
  • disponibilidad y
  • tolerancia a particiones.   Veamos qué son estas características:

Consistencia: al realizar una consulta o inserción siempre se tiene que recibir la misma información, con independencia del nodo o servidor que procese la petición.
Disponibilidad: que todos los clientes puedan leer y escribir, aunque se haya caído uno de los nodos.
Tolerancia a particiones: a veces traducido como tolerancia a fallos. Es una traducción que no me gusta, ya que se confunde con el punto anterior. Los sistemas distribuidos pueden estar divididos en particiones (generalmente de forma geográfica). Así que esta condición implica, que el sistema tiene que seguir funcionando aunque existan fallos o caídas parciales que dividan el sistema.

Cassandra es del tipo Disponibilidad y Tolerancia a particiones, también lo podéis encontrar en la web que es de tipo AP, availability-partition tolerance.

En un proximo post colgaré un proyecto con código java y otro con código scala para poder hacer las operaciones CRUD sobre una tabla.

Fuentes:

http://www.genbetadev.com/bases-de-datos/nosql-clasificacion-de-las-bases-de-datos-segun-el-teorema-cap

http://www.planetcassandra.org

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s