Francisco Javier Martínez Páez

Consultor tecnológico de desarrollo de proyectos informáticos.

 Ingeniero Técnico en Telecomunicaciones

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2010-07-29

Tutorial visitado 21.077 veces Descargar en PDF
Apache Cassandra, ¿ Qué es esto que tanto ruido hace ?

Apache Cassandra, ¿Qué es esto que tanto ruido hace ?

Los fuentes

Lo primero es el enlace a los fuentes de este tutorial

Introducción

Apache Cassandra es una Base de Datos no relacional (NO SQL), distribuida y basada en un modelo de almacenamiento de Clave-Valor, escrita en Java.
Cuando uno piensa en bases de datos, inevitablemente vienen a la cabeza palabras tales como tablas, primary keys, foreign keys, integridades referenciales, índices, relaciones y cosas así. Y cuando uno trata de pasar de un modelo entidad - relación al modelo relacional, piensa en normalización, en evitar duplicidad de datos, ACID, etc...
Pero no todas las aplicaciones tienen las mismas necesidades de consistencia de datos. Y es que existe un  teorema que explica que no podemos tener todo (Consistencia, Alta disponibilidad y Tolerancia a fallos) y que hemos de elegir dos. Y no todas las aplicaciones tienen las mismas necesidades. En algunos casos, nuestras aplicaciones necesitan almacenar gran cantidad de información que ha de ser accedida de manera casi instántanea y estar disponible 24x7. Pensad en aplicaciones tipo facebook o twitter (no creo que sea necesario poner los enlaces). Para este tipo de aplicaciones es donde entra en juego esta nueva forma de plantear los motores de bases de datos. En este caso la forma de plantearse el modelo de datos es diferente. En un modelo relacional típico, uno crea un esquema de datos normalizado que permite solicitar cualquier consulta y añade índices a las tablas que permitan acelerar dichas consultas. En este nuevo esquema de datos, uno ha de plantearse primero que consultas va a realizar y crea el esquema en base a conseguir el máximo rendimiento en los accesos a esa información y si es necesario duplica los datos para conseguir mejor rendimiento. Se podrí decir que casi crea un "mapa" de datos apropiado para cada consulta que se vaya a realizar. Os dejo una serie de enlaces interesantes acerca de Apache Cassandra que he ido encontrando y que aclaran un poco todo esto.

Preparando las herramientas

Antes de comenzar con algunos ejemplos, preparemos el entorno: Para descargaros la base de datos: Versión 0.6.3 (versión release estable en este momento)
La instalación es muy sencilla, basta con descomprimirlo en algún directorio de vuestro equipo. Es conveniente que una vez descomprimido configuréis una variable de entorno llamada CASSANDRA_HOME y que apunte a la raíz de la base de datos.

El modelo

Para el ejemplo voy a basarme en el modelo planteado en uno de los enlaces que os puse previamente, y que pretende almacenar información de un blog. El fichero de configuración principal es "storage-conf.xml" y está en el directorio "conf" de la instalación. Lo editamos y cambiamos algunas cosas para crear nuestro modelo: El modelo cuenta con:
  • Un lugar donde guardar autores: "Autores". Usaremos como clave el pseudónimo del autor (tendrá que ser único)
  • Un lugar donde guardar Blogs: "Blogs". Usaremos como clave el título del blog. Entre sus columnas guardará el pseudónimo del autor
  • Un lugar donde guardar las entradas de los blogs. Usaremos supercolumnas: La clave de la columna será el título del blog. El nombre de la supercolumna será un timestamp que permitirá tener las entradas de los blogs ordenadas cronológicamente.

Es un buen momento para arrancar la base de datos y comprobar que la cosa va fina. En "%CASSANDRA_HOME%\bin" ejecutamos "cassandra -f" y esperamos acontecimientos. Si todo va bien saldrá algo parecido a:

El ejemplo

Nos creamos un proyecto en el eclipse (Proyecto Java normal, no voy a usar Maven porque no aparecen las librerías de clientes aún en repositorios de Maven).
Configurad en las propiedades del proyecto para incluir en el classpath las librerías de la base de datos. Éstas están en: "%CASSANDRA_HOME%\lib
Además de estas librerías, he usado otra para generar UUIDs en base al tiempo que he descargado de: aquí. No olvidéis incluirla también
Os tiene que quedar algo así:

Vamos ahora a crearnos un cliente de prueba que use el API Thrift (de bajo nivel) para insertar y consultar Autores, Blogs y Entradas.
Si ejecutamos el cliente (con la base de datos levantada...)

El cluster

En modo receta:
  1. Paramos la base de datos local y editamos el fichero "storage-conf.xml" para indicarle las máquinas del cluster:
  2. Descomprimimos en otra máquina la base de datos tal y como hicimos antes y sustituimos el fichero "storage-conf.xml" por el que ya tenemos.
  3. Modificamos las IPs siguientes en el fichero "storage-conf.xml" de la nueva máquina:
  4. Arrancamos las dos bases de datos: En "%CASSANDRA_HOME%\bin" de ambas máquinas ejecutamos "cassandra -f"
  5. Al arrancar la máquina antigua dice:


    Si queréis información del cluster, en "%CASSANDRA_HOME%\bin" ejecutad "nodetool -host localhost ring"

    Ahora cambiad la IP del código del cliente y poned la nueva. Comentad también la parte de insertar. Mola ¿ no ?. Y sin pagar un duro.

    Bueno, creo que es suficiente como primera aproximación. Espero que os haya servido para enteder un poco todo este tema que con tanta fuerza está entrando en nuestro mundillo.

    A continuación puedes evaluarlo:

    Regístrate para evaluarlo

    Por favor, vota +1 o compártelo si te pareció interesante

    Share |
    Anímate y coméntanos lo que pienses sobre este TUTORIAL:

    Fecha publicación: 2010-09-02-02:30:11

    Autor: turbay

    Muy buen tutorial, tengo aproximadamente 4 meses trabajando en cassandra.
    es una herramienta poderosa la cual aun no conosco mucho...

    hoy en dia tengo un duda con cassandra, estoy utilizando una estructura simple una familia de columna
    ejemplo:
    Blog:{
    key:{
    columna: valor
    }
    }

    Quiero saber si existe alguna forma de si tengo una lista de keys, poder insertar un valor a la columna, sin tener que iterar. como en el ejemplo el key seria de blog, en mi caso tengo una lista de usuarios y quiero insertarle una columna a cada usuario.

    trabajo en java, estuve viendo sobre batch_mutate pero no lo entendi del todo o creo que no es lo que busco porque especifican un solo key, en mi caso tengo una lista de keys con la misma columna, si me ayudara seria de gran favor para mi, gracias.

    Fecha publicación: 2010-08-02-21:36:00

    Autor: Leon

    Gracias! No conocía esta herramienta...
    Saludos...

    Fecha publicación: 2010-07-31-23:29:24

    Autor: jcarmonaloeches

    ¡Yo creo que este tema es muy interesante, y que el cambio de enfoque de datos ya iba siendo hora!

    Gracias Paco y gracias a Apache.