Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Caso de Estudio:
Apache Cassandra
Abstract - Apache Cassandra es una base de datos simúltaneas. En julio del 2008 fue lanzada como un proyecto
NoSQL de código abierto, distribuida y de tipo hı́brida de código abierto de Google Code. En marzo del 2009 se
(clave-valor y orientada a columnas), descentralizada transformó en un proyecto de Apache Incubator y en Febrero
y multiplataforma que permite almacenar y gestionar del 2010 se graduó como un proyecto de alto nivel. [2]
grandes volúmenes de datos de forma distribuida, siendo
su objetivo principal la escalabilidad lineal y la disponi-
bilidad. 2.1. Publicaciones después de la graduación
4. Arquitectura
La arquitectura de Cassandra permite que sea un sistema
Figura 1. (a) Nodo, (b) Data Center y (c) Cluster escalable, con alto rendimiento y que ofrezca un alto tiempo
de actividad. Cassandra no utiliza la estructura maestro-
Ahora, teniendo claros los conceptos básicos, se esclavo caracterı́stica de algunos sistemas de bases de datos;
presentan las principales caracterı́sticas de Cassandra: en cambio, tiene una estructura en anillo elegante, fácil de
configurar y de mantener.
1) Descentralizado: Cassandra posee una estructura En Cassandra, todos los nodos juegan el mismo papel;
descentralizada, esto significa que no existe la no existe el concepto de nodo maestro, ya que todos los
estructura maestro-esclavo como en otras bases de nodos se comunican entre sı́ mediante un protocolo dis-
datos como HBase, por lo que todos los nodos tribuido y escalable denominado protocolo ”gossip”. La
del clúster tienen el mismo rol y cada nodo puede arquitectura escalable de Cassandra permite que sea capaz
dar servicio a cualquier solicitud. Gracias a esta de manejar grandes volúmenes de datos y miles de usuarios
caracterı́stica no hay un punto único de fallo, lo concurrentes u operaciones por segundo, aún a través de
múltiples repositorios de datos. Para agregar más capacidad,
simplemente se deben agregar nuevos nodos a un clúster
existente sin tener que desactivarlo primero.
La arquitectura de Cassandra también permite que, a difer-
encia de los sistemas con estructura maestro-esclavo o con
fragmentación por sharding, no exista un punto único de
fallo por lo que es capaz de ofrecer disponibilidad y tiempo
de actividad de manera continua. [8]
4.1. Componentes
3) Cuando el amigo recibe el mensaje, responde con Como se menciona anteriormente, la estructura que en-
un GossipDigestAckMessage. globa todo en Cassandra es el clúster. Cuando nos referimos
al modelo de datos en Cassandra, la estructura equivalente
4) Cuando el iniciador recibe el mensaje ack del a una base de datos de datos relacional es el keyspace,
amigo, le envı́a un GossipDigestAck2Message el cual es esencialmente un contenedor lógico donde se
para finalizar la ronda de gossip define el resto del modelo y algunas propiedades de con-
figuración. Dentro del clúster de Cassandra pueden existir
5) Cuando el Gossiper descubre que otro punto final varios keyspaces. Como se puede apreciar en la figura 5,
murió, condena ese punto final marcándolo como el keyspace puede contener una o más familias de colum-
muerto en su lista local y almacenando esto en el nas, las cuales a su vez contienen filas, que son las que
log. [8] contienen las distintas columnas y/o súper columnas donde
estarán definidos los datos, estos conceptos se explicarán
más adelante en esta sección.
5.1. Columna
4.8. Hinted Handoff
Consideremos el siguiente escenario: se hace una solici- Una columna es la unidad más básica de estructura de
tud de escritura a Cassandra pero el nodo no está disponible datos en el modelo de datos Cassandra. Una columna es
ya sea por una partición de la red, fallas de hardware, o una tripleta de un nombre, un valor y un reloj, que se
alguna otra razón. Para asegurar disponibilidad general en puede considerar como un ”timestamp”, o marca de tiempo.
el anillo en una situación como esta, Cassandra implementa Aunque estamos familiarizados con el término ”columnas”
el ”Hinted Handoff”. Se puede ver una ”hint”, o pista, del mundo relacional, es confuso pensar en ellas de la misma
como una notica o post-it que contiene la información de manera en Cassandra. En primer lugar, cuando se diseña
la solicitud de escritura. Si el nodo B al que pertenece la una base de datos relacional, se especifica la estructura de
escritura falla, el nodo A que recibe la solicitud de escritura, las tablas desde el principio mediante la asignación de un
crea una pista la cual es un pequeño recordatorio que dice nombre para todas las columnas de la tabla; luego, cuando
”Tengo la información de escritura para el nodo B, me voy se escriben los datos simplemente se suministran los valores
a quedar con esta escritura y cuando el nodo B vuelva a para la estructura predefinida.
estar online (mediante el protocolo Gossip), le voy a enviar Pero en Cassandra, no se definen las columnas por ade-
la solicitud”. Es decir, el nodo A le va a ”hand off”, o lantado; solo se definen las familias de columnas cuando
entregar, al nodo B la pista correspondiente a la escritura. se quiera en el keyspace, y luego se puede comenzar la
Esto le permite a Cassandra tener siempre disponibilidad escritura de datos, sin definir las columnas aún. Esto es
para las escrituras, y reduce el tiempo en el que un nodo porque en Cassandra, todos los nombres de las columnas
fallido esté inconsistente antes de volver a estar online. Un son suministrados por el cliente.
Hinted Handoff no cuenta como reconocimiento suficiente Esto añade una gran flexibilidad a la forma en que una
para una operación de escritura si el nivel de consistencia es aplicación trabaja con los datos.
ONE, QUORUM o ALL. La pista sı́ cuenta como escritura Como se ve en la figura 6, los campos nombre y valor
si el nivel de consistencia es ANY. En pocas palabras, las son arreglos de bytes, aunque pueden pasar como simples
escrituras con pistas no pueden ser leı́das por ellas mismas. strings. Como estos campos son de tipo binario, pueden
En este nivel de consistencia, ası́ una sola pista haya podido ser de cualquier longitud. El tipo de dato del timestamp
ser grabada, la escritura se cuenta como exitosa. [8] es org.apache.cassandra.db.IClock. [9]
Figura 6. Estructura de una columna en Cassandra [9]
4. Se realiza la consulta para ver los correos del usuario DELETE eras[3]
FROM usuarios
”Luke Skywalker”
WHERE usuario_id = b2e58918-fc2d-11e5-86aa-5
SELECT nombre, apellido, correos FROM e5517507c55;
usuarios WHERE usuario_id = b2e58918-fc2d-11
e5-86aa-5e5517507c55; 10. Ahora se agrega una nueva columna para realizar algunas
operaciones con map
nombre |apellido |correos
--------------------------------------------- ALTER TABLE usuarios ADD afiliaciones map<
Luke |Skywalker | timestamp, text>;
{’episode7_luke@tatooine.com’,
’jedi_luke_skywalker@starwars.com’, 11. Se realiza la actualización insertando valores a la
’lukeskywalker@episode7.com’} columna ”afiliaciones”
5. Ahora se agrega una nueva columna para realizar algunas UPDATE usuarios
operaciones con list SET afiliaciones =
{ ’5812-9-24 12:00’ : ’Alianza para Restaurar
ALTER TABLE usuarios ADD eras list<text>; la Republica’,
’5820-10-2 12:00’ : ’Orden Jedi’ }
UPDATE usuarios WHERE usuario_id = b2e58918-fc2d-11e5-86aa-5
SET eras = [ ’La Nueva Orden Jedi’, e5517507c55;
’Alzamiento del Imperio’]
WHERE usuario_id = b2e58918-fc2d-11e5-86aa-5 12. Si se quiere borrar un campo en especı́fico se puede
e5517507c55; hacer de la siguiente manera
7. Realizando una consulta para ver las ”eras” insertadas nombre |apellido |afiliaciones
---------------------------------------------
SELECT usuario_id, nombre, apellido, eras Luke |Skywalker | {’5812-9-24 12:00’ :
FROM usuarios ’Alianza para Restaurar la Republica’}
6.2.5. Varios. calle text,
ciudad text,
• boolean: Verdadero o Falso codigo_postal int,
• blob: Bytes expresados en hexadecimal definidos telefono text
como (0[xX](hex)+) )
• timestamp: Fecha y hora, codificados en 8 bytes
2. Luego se crea la tabla usuario, declarando el tipo de dato
6.3. Índices definido direccion
CREATE TABLE usuario (
En Cassandra solo se crean los ı́ndices secundarios ya usuario_id uuid PRIMARY KEY,
que por defecto se definen los ı́ndices primarios a través de nombre text,
la(s) claves de partición y las claves primarias. [19] usuario_direccion frozen <address>
);
Ejemplo de ı́ndices haciendo uso de la tabla usuarios
de la sección 6.2.4: Se nota que para declarar el tipo de dato definido se hace
uso de la palabra frozen, ésta se usaba con el fin de que
CREATE TABLE usuarios (
usuario_id uuid,
si se querı́a insertar o actualizar algún campo se tenı́an
nombre text, que actualizar todos los campos. Esta función ya no esta
apellido text, disponible en la versión 3.0 de Cassandra pero se mantiene
correos set<text>, la palabra frozen para declarar el tipo de dato definido. [22]
nacionalidad text,
PRIMARY KEY (nacionalidad, usuario_id) 3. Se hace la inserción en la tabla usuario
);
INSERT INTO usuario (usuario_id, name,
Si se quiere realizar operaciones con alguna columna que no usuario_direccion)
forme parte de la PRIMARY KEY se puede hacer creando VALUES (000599fe-fdff-11e5-86aa-5e5517507c66,
’Mercy Ospina’, {calle: ’191 Rue St. Charles
un ı́ndice secundario de la siguiente manera (en este caso
’, ciudad: ’Paris’, codigo_postal: 75015,
se seleccionó la columna apellido) telefono: ’33 6 78 90 12 34’});
CREATE INDEX usuario_apellido ON usuarios (
apellido); 4. Por ultimo se realiza la consulta para obtener la dirección
del usuario
Ahora se pueden realizar operaciones con la columna apel-
SELECT nombre, usuario_direccion FROM usuario
lido WHERE usuario_id=000599fe-fdff-11e5-86aa-5
e5517507c66;
SELECT nombre, nacionalidad FROM usuarios
WHERE apellido=’Skywalker’;
nombre |usuario_direccion
---------------------------------------------
nombre |nacionalidad
Mercy Ospina |{calle: ’191 Rue St. Charles’,
---------------------------------------------
ciudad: ’Paris’, codigo_postal: 75015,
Luke |Tatooine
telefono: ’33 6 78 90 12 34’}