El Everest es pan comido: Escala fácilmente con Apache Cassandra

Muy buenas a todos, y gracias por venir a leer este post, que pretendo os resulte tan divertido como instructivo.

Comentaros que este post pretende por un lado servir de guía simple para crear un clúster Cassandra, pero también se presenta en formato de pequeño taller para que podáis trastear en vuestras casas. Los que decidáis optar por el formato taller, debéis descargaros la VM que hemos habilitado para tal fin a través de este link.

Para poder usar la VM, debéis disponer de VMWare o VirtualBox, y podéis ingresar con el usuario “everis” y contraseña “cassandra".

Prerrequisitos:

Vale, aquellos que os hayáis bajado la VM no tenéis que hacer nada en este punto, pero los que tengáis intención de tirar con vuestra propia distribución o (dios no lo quiera) usar Cassandra directamente sobre Windows, debéis preparar vuestro sistema para poder realizar la instalación.

  1. Instalar Java 8 o superior. Vale perfectamente OpenJDK
  2. (Opcional) Instalar una distribución de Python 3.6
  3. (Para entornos productivos) Activar algún protocolo de sincronización de relojes, como NTP.
  4. Aseguraros que tenéis un servidor DNS en vuestra red, o bien que habéis dado de alta vuestro $HOSTNAME en /etc/hosts (y que esté está apuntando a la tarjeta de red correcta)

¿Qué es Cassandra?

Cassandra es una base de datos, pero no una base de datos cualquiera, en primer lugar es un sistema Big Data, que permite un escalado prácticamente lineal y ofrece una disponibilidad magnífica. Cassandra es hija de Facebook, que se encargó de unir la arquitectura distribuida de Amazon Dynamo y la persistencia de Google Big Table.

En realidad, hay mucho más, pero no quiero desvelarlo todavía, que es mejor descubrirlo durante nuestro viaje.

Vamos a instalar Cassandra

Bueno, lo primero es descargar Cassandra, podéis descargarlo aquí, nosotros lo hemos guardado en $HOME/Downloads

Perfecto, ahora vamos a descomprimir y mover Cassandra (Ojo, vamos a moverlo a $HOME, espero que no haga falta deciros que en producción deberíamos llevarlo a /usr/local o /opt, ¿cierto?). Ojo, vamos a suponer que os habéis descargado la versión 3.11.4 (aunque la de la VM es la 3.10)

cd $HOME/Downloads
gunzip apache-cassandra-3.11.4-bin.tar.gz
tar xvf apache-cassandra-3.11.4-bin.tar
mv apache-cassandra-3.11.4 $HOME/cassandra_1

Habéis visto que hemos puesto “cassandra_1” como directorio de destino, no os alarméis, tiene un motivo… que os contaré más adelante.

Toca configurar Cassandra, y para eso vamos a tocar dos ficheros:

Lo editamos y configuramos el tamaño inicial y máximo del heap de la JVM (vamos a poner uno bajo, 1G de máximo y 100M de inicial)

1. El fichero de entorno, $HOME/Cassandra_1/conf/cassandra-env.sh:

Para ello, buscamos la línea que pone:

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

Y la sustituimos por:

MAX_HEAP_SIZE="1G"
HEAP_NEWSIZE="100M"

2. El fichero de configuración de nodo, $HOME/Cassandra_1/conf/cassandra.yaml:

En este fichero vamos a cambiar el nombre de nuestro clúster “cluster_name”, las ips a las que nos vamos a vincular para recibir peticiones de clientes “listen_address” y las de administración “rpc_address”. Existe un cuarto dato que no vamos a modificar, pero del que hablaremos más adelante, “seeds".

Para ello, buscamos cada uno de estos datos y sustituimos sus valores por:

cluster_name: 'EverisCluster'
listen_address: 127.0.0.1
rpc_address: 127.0.0.1

Recordad que aquí nos vinculamos a la ip de bucle local por simplicidad, pero en producción no os vinculéis a la ip de bucle local, hacedlo a la ip por la cual vayáis a recibir conexiones.

Y, toca arrancarlo. Si todo ha ido bien, no deberíamos tener problema.

Para ello, nos vamos al directorio de $HOME/cassandra_1/bin y ejecutamos cassandra:

cd $HOME/cassandra_1/bin
./cassandra

Aunque veáis mensajes por la pantalla, está arrancando en segundo plano. Dadle un poco de tiempo, y para confirmar que tira, ejecutad (desde la misma ruta) la siguiente instrucción:

./nodetool status

Debería apareceros algo como esto:

Pongámonos manos a la obra:

Llegados a este punto ya deberíamos tener una instancia de Apache Cassandra ejecutándose en nuestro sistema, así que lo mejor es que probemos nosotros mismos a interactuar con nuestro sistema. Para ello vamos a usar el lenguaje CQL, una lenguaje propio de Cassandra que se inspira en el SQL, si tienes unas bases de SQL, no te va a costar prácticamente nada adaptarte al CQL.

Lo primero que vamos a hacer, es conectarnos a Cassandra usando el cliente proporcionado, la Shell de cql, o cqlsh:

cd $HOME/cassandra_1/bin
./cqlsh

Vale, una vez dentro vamos a crear un “Keyspace”, el espacio sobre el que vamos a trabajar. Un consejo, cqlsh es una Shell inteligente. Usa el tabulador todo lo que puedas.

CREATE KEYSPACE westeros WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1 };

Vale, ahora nos vamos a dicho keyspace

use  westeros;

Y creamos nuestra primera tabla, tal como hacemos en SQL (bueno, los nombres de los tipos pueden ser algo distintos, pero nos entendemos, ¿verdad?

create table personajes ( nombre Text, casa Text, muerte int, primary key(casa,nombre));

Insertamos un dato, mediante “insert”, análogo al SQL nuevamente

insert into personajes (nombre,casa,muerte) values('Yo','la mía',null);

Y consultamos mediante un select los datos existentes:

Select * from personajes;

Vale, un spoiler, esta no es la forma de consultar. En la próxima entrega hablaremos de cómo funciona la distribución de datos y la importancia de las “primary keys”, pero de momento nos vale para ver que nuestro “insert” ha dado sus frutos.

Por úlitmo, vamos a poblar con datos nuestro modelo. Para ello vamos a descaergarnos el fichero del repositorio git existente en Github. Podéis clonaros el repositorio, bajarlo como zip y luego descomprimir el fichero, lo que os apetezca. Si estáis usando la máquina virtual que hemos habilitado para tal fin, el fichero estará disponible en la siguiente ruta '/home/everis/data/got.csv'. Para cargarlo, usaremos “COPY”.

COPY personajes (nombre, casa, muerte) FROM '/home/everis/data/got.csv' 
WITH HEADER = true;

Fácil, ¿verdad? Lanzad ahora el select y confirmar que los datos están disponibles.

Bueno, Hasta aquí la primera entrega para conquistar el Everest escalando con Cassandra. Espero que os haya servido esta introducción. En la próxima entrega veremos cómo añadir nodos a nuestro clúster y cómo funciona la replicación y la distribución de datos.

¡¡Nos vemos en breve!!

 

Guía de Posibilidades Profesionales en el Ecosistema de Java