La base de datos No-SQL Cassandra fue creada por Facebook a causa de la necesidad de disponer de una base de datos distribuida de alto rendimiento, flexible, tolerante a fallos, escalable y que fuese capaz de procesar grandes cantidades de datos. Más tarde fue liberada bajo licencia Apache y actualmente es utilizada principalmente por empresas de internet con proyectos con un alto uso de base de datos como Twitter.

En esta serie de artículos iré desgranando la instalación, funcionamiento y desarrollo de aplicaciones en PHP con Cassandra, comparando las sentencias utilizadas para insertar, actualizar, etc de SQL con los métodos a utilizar en Cassandra. Por desgracia al ser algo completamente distinto a cualquier base de datos SQL tendré que añadir algo de teoría, pero intentaré que os resulte lo más ameno posible.

Al toro.

REQUISITOS

Para la realización de esta guía se utilizará Debian 8 Jessie como sistema operativo.

Doy por hecho que ya se dispone de un servidor web Apache con PHP instalado en la máquina de testeo que se esté usando. Las aplicaciones que se van a instalar han sido probadas en una máquina virtual Debian 8 Jessie utilizando como aplicación de virtualización VirtualBox, instalado en un host Debian 8 Jessie.

En un servidor de producción recomiendo que tenga bastante RAM (por encima de 1GB, ya veremos más adelante el porqué. En la máquina virtual que uso de testeo dispone de 700 MB y funciona bien, pero en producción no es lo recomendable).

Instalaremos la base de datos Cassandra y PHP-Driver que nos dará la extensión para PHP y una abstracción de la base de datos donde tenemos los métodos básicos para trabajar con Cassandra: insertar, actualizar, borrar, crear, etc.

PREPARANDO EL SISTEMA

Antes de empezar a instalar debemos actualizar el sistema operativo de la forma habitual:

apt-get update
apt-get upgrade

Una vez actualizado el sistema empezamos a instalar.

INSTALANDO CASSANDRA

Lo primero que necesitamos hacer para instalar Cassandra es editar los repositorios de Debian:

nano /etc/apt/sources.list

Una vez que se abra el editor añadimos las siguientes lineas:

deb http://www.apache.org/dist/cassandra/debian/ 21x main
deb-src http://www.apache.org/dist/cassandra/debian/ 21x main

Como podrás observar después de la ruta del repositorio se ha añadido “21x” esto indica el número de versión a obtener, en este caso es la versión actual de cassandra al crear este post. No se indica el número de parche, es decir, actualmente se puede descargar Cassandra 2.1.

Si dentro de unos meses sale la versión “2.2” solo tendrás que cambiar el uno por el dos.
Volvemos a consola y actualizamos los repositorios.

apt-get update

Nos dará un error en las claves gpg. Procedemos a actualizarlas con las siguientes instrucciones:

gpg --keyserver pgp.mit.edu --recv-keys F758CE318D77295D
gpg --export --armor F758CE318D77295D | sudo apt-key add -

Ojo con el guión del final, hay que añadirlo, sino dará error.

Con el paquete 0.7.5 nos da otro error de clave gpg así que también instalamos esta de la misma manera:

gpg --keyserver pgp.mit.edu --recv-keys 2B5C1B00
gpg --export --armor 2B5C1B00 | sudo apt-key add -

También necesitarás añadir la siguiente clave:

gpg --keyserver pgp.mit.edu --recv-keys 0353B12C
gpg --export --armor 0353B12C | sudo apt-key add -

Verificamos que tenemos el sistema actualizado.

apt-get update
apt-get upgrade

Actualizamos todos los paquetes que aparezcan.

Procedemos a instalar el paquete de la base de datos NoSQL Cassandra:

apt-get install cassandra

Cassandra necesita Java para funcionar. Debian 8 ya dispone de OpenJDK en su versión 7, y aunque desde los desarrolladores de Cassandra no recomiendan su uso, para los ejemplos que vamos a desarrollar nos sirve.

En producción, o si vas a desarrollar un proyecto con Cassandra tendrás que instalar la última versión de Java de Oracle.

Por último, ejecutamos el siguiente comando para construir las dependencias:

dpkg-buildpackage -uc -us

Si el sistema no te reconoce el comando es porque te falta el paquete dpkg-dev. Instálalo de la forma habitual, y vuelve a intentarlo:

apt-get install dpkg-dev

INSTALANDO DATASTAX PHP-DRIVER PARA CASSANDRA

Datastax PHP driver, es el controlador y abstracción de base de datos que utilizaremos para conectar con Cassandra desde PHP. Este controlador nos da la posibilidad de trabajar tanto con CQL (Cassandra Query Language. Parecido a SQL) y/o el protocolo binario de Cassandra.

Aunque en la página del repositorio nos indican varias formas de instalar el controlador (https://github.com/datastax/php-driver/blob/master/ext/README.md), el único que me ha funcionado correctamente ha sido el de descargar las fuentes y compilarlo. Tú puedes probar los otros métodos, pero el que te voy a indicar funciona en Debian 8.

Las siguientes instrucciones deberías ejecutarlas en el ordenador de desarrollo y no en el servidor o máquina virtual donde tengas instalada la base de datos. (A no ser que la hayas instalado en el ordenador de desarrollo).

Instalamos algunos paquetes necesarios para realizar la compilación:

apt-get install g++ make cmake libuv-dev libssl-dev libgmp-dev php5 php5-dev openssl libpcre3-dev git

Primero necesitamos descargar las fuentes desde GitHub, utiliza el directorio que prefieras:

git clone https://github.com/datastax/php-driver.git
cd php-driver
git submodule update --init
cd ext
./install.sh

Estos comandos nos ha creado un archivo llamado cassandra.so en /usr/lib/php5/20131226/ (el número del directorio puede variar en tu instalación. Revísalo).
Ahora creamos un archivo .ini para la extensión de PHP:

nano /etc/php5/mods-available/cassandra.ini

Dentro de ese archivo añadimos las siguientes líneas:

; configuration for PHP driver Cassandra
extension=cassandra.so

Guardamos.

Le indicamos a PHP que nos active la extensión

php5enmod cassandra

Y reiniciamos Apache:

/etc/init.d/apache2 restart

Ahora si ejecutamos el siguiente comando para mostrar los módulos de PHP debería aparecernos Cassandra, si no es así es que algo a fallado:

php -m

INICIANDO CASSANDRA POR PRIMERA VEZ

Ahora que ya tenemos todo instalado es el momento de arrancar Cassandra. Esto es algo muy sencillo, solo tienes que ejecutar el siguiente comando:

cassandra -f

También tienes otras maneras de iniciar Cassandra. Por ejemplo como servicio:

service cassandra start

Si al iniciar Cassandra te da un error de memoria, haz lo siguiente:

Accede a /etc/cassandra y edita el archivo cassandra-env.sh:

cd /etc/cassandra
nano cassandra-env.sh

Busca las siguientes dos líneas:

#MAX_HEAP_SIZE="4G"
#HEAP_NEWSIZE="800M"

Descomenta las dos líneas, y sustituye los valores por unos más bajos. En mi caso he bajado MAX_HEAP_SIZE a 2G y HEAP_NEWSIZE lo he dejado como está.

Estas dos líneas permiten configurar la cantidad de memoria RAM que Cassandra utilizará.

Ahora vamos a utilizar el código de ejemplo que hay en el repositorio de PHP-Driver para probar que todo funciona correctamente.

Crea un archivo PHP con el siguiente contenido:

  1. <?php
  2. $cluster = Cassandra::cluster() // connects to localhost by default
  3. ->build();
  4. $keyspace = 'system';
  5. $session = $cluster->connect($keyspace); // create session, optionally scoped to a keyspace
  6. $statement = new Cassandra\SimpleStatement( // also supports prepared and batch statements
  7. 'SELECT keyspace_name, columnfamily_name FROM schema_columnfamilies'
  8. );
  9. $future = $session->executeAsync($statement); // fully asynchronous and easy parallel execution
  10. $result = $future->get(); // wait for the result, with an optional timeout
  11.  
  12. foreach ($result as $row) { // results and rows implement Iterator, Countable and ArrayAccess
  13. printf("The keyspace %s has a table called %s\n", $row['keyspace_name'], $row['columnfamily_name']);
  14. }

Este código devuelve las tablas que contiene el Keyspace “system” (Más adelante explicaré que es eso). Si te da error como este: “No hosts available for the control connection”, puede ser por dos razones, o bien no está funcionando Cassandra, con lo que tendrás que iniciarla con uno de los comandos anteriores, o bien no la tienes en localhost sino en un servidor externo o máquina virtual.

Para resolverlo tendrás que sustituir las siguientes líneas:

  1. <?php
  2. $cluster = Cassandra::cluster() // connects to localhost by default
  3. ->build();

Por estas otras:

  1. <?php
  2. $cluster = Cassandra::cluster()
  3. ->withContactPoints('127.0.0.1')
  4. ->build();

Sí, solo añadimos “->withContactPoints(‘127.0.0.1’)”, con este método le estamos indicando la ip de nuestro servidor. En tu caso es posible que tengas que sustituir “127.0.0.1” por la ip de tu servidor o máquina virtual. Más adelante explicaré cada método, pero para verificar que está funcionando todo correctamente es suficiente.

 

Con esto finalizamos la instalación de Cassandra para que pueda ser utilizada por PHP.