Cassandra
Cassandra
Cassandra
La base de datos Apache Cassandra es la mejor opcin cuando se necesita escalabilidad y alta
disponibilidad sin comprometer el rendimiento. Escalabilidad lineal y comprobada de tolerancia a
fallos en el hardware de los productos bsicos o de infraestructura en la nube lo convierten en la
plataforma perfecta para datos de misin crtica. Cassandra compatibilidad para la replicacin a
travs de mltiples centros de datos es el mejor en su clase, ofreciendo una latencia ms baja para
los usuarios y la tranquilidad de saber que se puede sobrevivir a cortes regionales.
Cassandra modelo de datos ColumnFamily ofrece la oportunidad de ndices de columna con el
rendimiento de inicio de sesin estructurados actualizaciones, un fuerte apoyo para las vistas
materializadas y potente capacidad de almacenamiento en cach.
Hace mucho que no escribo, ya que estoy con bastantes cosas, pero ahora que estamos llegando a
fin de ao vamos a escribir una ultima nota!
Historia:
Cassandra es una base de datos NoSQL, hoy en da es un proyecto de Apache. Cassandra fue
desarrollado por Facebook (la versin original fue escrita por un ex empleado de Amazon y otro de
Microsoft), en el 2008 fue liberado como un proyecto open source en Google code, en el 2009 se
convirti en un proyecto Apache Incubator, y finalmente en el 2010 se convirti en un proyecto
TOP-LEVEL.
Informacin:
Las la informacin en las bases de datos relacionales, se almacenan en forma de filas, pero en
Cassandra la informacin se almacena en columnas con pares key-value, key-map para mltiples
valores, que se agrupan en column families (familia de columnas). Las column families son fijas
cunado una base de datos Cassandra es creado, pero las columns se pueden agregar a la column
families en cualquier momento. Por otra parte, las columns se agregan solo a las keys especificas,
por lo tanto diferentes keys pueden tener diferentes nmeros de columns en cualquier columns
family.
Cassandra puede manejar varios terabytes de datos si lo necesita y puede, fcilmente, manejar
millones de files, incluso en un cluster pequeo. Cassandra puede hacer alrededor de 20k de insert
por segundos.
La rendimiento de Cassandra es muy alta, y mantener ese rendimiento alto mayormente depende
del hardward, la configuracin y el numero de nodos en nuestro cluster.
Terminologia de Cassandra:
Column: Es la unidad mas bsica de la representacin en el modelo de datos Cassandra. Una
column es un triplete de un key (un nombre) un value (un valor) y un timestamp. Los valores son
todos suministrados por el cliente. El tipo de dato del key y el value son Matrices de bytes de Java,
el tipo de dato del timestamp es un long primitive. Las column son inmutables para evitar problemas
de multithreading. Las columns se organizan dentro de las columns families. Las columns se
ordenan por un tipo, que pueden ser uno de los siguientes:
AsciiType
BytesType
LexicalUUIDType
LongType
TimeUUIDType
UTF8Type
Modelo de datos:
1.
2.
3.
4.
Super Column: Es una column cuyos values no son strings, sino una o mas columns, que en este
contexto se llamaran subcolumns. Las subcolumns estn ordenadas, y el numero de columnas que se
puede definir es ilimitada. las Super columns, a diferencias de las columns, no tienen un timestamp
definido. No son recursivas, es decir, solamente tienen un nivel de profanidad.
Modelo de datos:
1.
2.
3.
4.
5.
Column Family: Es mas o menos anlogo a una tabla en un modelo relacional. Se trata de un
contenedor para una coleccin ordenada de columns. Debido a que cada column family se almacena
en un archivo separado, asegrese de definir las columns que sea probable que acceda juntas en la
misma column family. Tenemos que definir las column family de la aplicacin en el archivo de
configuracin.
Keyspace: Es el contenedor para un column family. Es mas o menos anlogo a una base de datos en
un modelo relacional, usado en Cassandra para separar aplicaciones. Cuando una base de datos
relacional es una coleccin de tablas, un keyspace es una coleccin ordenada de columns family.
Tenemos que definir los keyspace de la aplicacin en el archivo de configuracin o usando mtodos
definidos en la API.
Caracteristicas de Cassandra:
Fault Tolerant (Tolerancia a los fallos): Los datos se replican automticamente a varios nodos.
Perder un nodo no causa la baja del cluster.
Flexible Schema (Flexible esquema): Estamos hablando en trminos de las columns, super
columns y column families en lugar de filas y tablas. Modelo de datos BigTable.
Symmetric (Simtrica): No hay nico punto de fallo, todos los nodos en el cluster son idntica y no
hay cuellos de botella.
Scalable (Escalable): Lineal con la adicin de nuevas mquinas, sin tiempo de inactividad o
interrupcin de las aplicaciones. Leer y escribir aumentar el rendimiento de forma lineal a medida
que las maquinas se van agregando.
Support for Large Data (Apoyo a grandes de datos): La capacidad para escalar a cientos de
gigabytes de datos.
APACHE CASSANDRA
Es un sistema de almacenamiento distribuido escrito en Java de cdigo abierto, descentralizado,
escalable, altamente disponible, tolerante a fallos, eventualmente consistente, y orientado a
columnas basado en la estructura de Dynamo de Amazon y en el modelo de datos de Bigtable de
Google. Naci en Facebook y ahora es usado en muchos de los sitios ms populares de Internet.
CARACTERSTICAS:
Distribuido y Descentralizado:
Cassandra es un sistema distribuido, lo cual significa que est en la capacidad de ejecutarse sobre
mltiples mquinas mientras se presenta a los usuarios como un todo. De hecho, No es
provechoso Ejecutar Cassandra en una nica mquina, aunque si puedes hacerlo. Por supuesto,
aprovechars todos sus beneficios si lo corres en mltiples servidores.
En Almacenes de datos creados con bases de datos relacionales como MySQL, cuando es necesario
escalar, algunas mquinas (tambin llamadas nodos) deben ser validadas como administradores
para coordinar las dems mquinas (llamadas esclavos). Sin embargo, Cassandra es
descentralizado, esto significa que todos los nodos que forman parte del sistema son idnticos,
Ningn nodo desempea funciones distintas a las de los otros nodos, en vez de eso, Cassandra
implementa un protocolo P2P y mantiene una lista de todas las mquinas disponibles e inactivas.
El hecho de que Cassandra sea descentralizado quiere decir que no tiene un punto de fallo, todos
los nodos en un clster (grupo de mquinas) funcionan del mismo modo. A lo cual se le denomina
servidor simtrico, porque todas las mquinas hacen lo mismo, por definicin no existe un
administrador que coordine tareas entre los nodos.
En muchas soluciones de almacenamiento distribuido, se deben hacer mltiples copias de datos
en un proceso llamado replicacin, de esta forma todas las mquinas pueden trabajar peticiones
simultneas y mejorar el desempeo del sistema. Este proceso no es descentralizado como en
Cassandra, pero para llevarlo a cabo se requiere de la definicin de una relacin
Administrador/Esclavos, lo que quiere decir que todos los nodos no funcionan de la misma forma,
el administrador es el que autoriza la distribucin de los datos, y opera bajo una relacin
unidireccional con los nodos esclavos; si el administrador deja de funcionar, la base de datos
completa est en peligro. El diseo descentralizado, por lo tanto, es una de las claves de la alta
disponibilidad de Cassandra. Algunas bases de datos No SQL como MongoDB usan la relacin
Administrador/Esclavos.
La descentralizacin tiene dos ventajas clave: Es ms fcil de usar que un Administrador/Esclavo,
puede ser ms fcil de operar y mantener un almacn de datos descentralizado que un
Administrador/Esclavo ya que todos los nodos son iguales, y no se requieren conocimientos
adicionales para escalar; configurar 50 mquinas no es diferente a configurar una sola. Un
administrador puede ser un simple punto de fallo. Como en Cassandra todos los nodos son
idnticos, la inutilizacin de uno no interrumpe su funcionamiento. En pocas palabras, como
Cassandra es distribuido y descentralizado, no hay un punto de fallo lo que genera una alta
disponibilidad.
Escalabilidad Flexible:
La escalabilidad de un sistema es una caracterstica de un sistema que puede continuar
se necesitarn para los registros, esto es til cuando la estructura de datos est sujeta a cambios
frecuentes. Cassandra permite agregar campos para los registros aun cuando est en servicio.
Libre Esquema:
Cassandra requiere que definas un contenedor, llamado espacio clave que contiene familias de
columnas. El espacio clave es esencialmente un nombre para mantener columnas familiares y
propiedades de configuracin. Las familias de columnas o columnas comunes son nombres para
informacin asociada. Las tablas de datos son dinmicas, as que puedes agregar informacin
usando las columnas que quieras, no necesitas definir las columnas que requieres por adelantado.
Alto Desempeo:
Cassandra fue diseado especficamente para aprovechar al mximo las mquinas con
procesadores multincleo, y para ejecutarse sobre muchas docenas de estas mquinas alojadas en
mltiples almacenes de datos. Cassandra ha demostrado desempearse bien en la carga pesada
de datos. Posee un alto rendimiento en escrituras por segundo. Cuantos ms servidores sean
agregados, se sacar mayor provecho de las propiedades de Cassandra sin sacrificar desempeo.
DE DNDE VIENE CASSANDRA?
Cassandra es un sistema de cdigo abierto mantenido por la fundacin Apache. Cassandra se
origin en Facebook en el 2007 para solventar los problemas de bsqueda interna de datos que
tena la compaa, la cual tiene que tratar con grandes volmenes de datos. El cdigo fuente fue
publicado en Julio del 2008, en ese entonces el cdigo era actualizado por ingenieros de Facebook.
En marzo del 2009 fue acogido por la fundacin Apache y en febrero de 2010 es escogido como
uno de los mejores proyectos de la fundacin.
DE DONDE OBTIENE CASSANDRA SU NOMBRE?
En la mitologa griega, Cassandra era la hija del rey Priam y la reina Hecuba de Troya. Cassandra
era tan bonita que el dios Apolo le dio la habilidad de ver el futuro. Pero cuando este quiso tener
algo con ella, lo rechazo, y aun podra pronosticar todo que ocurrira con exactitud, pero nadie le
creera. La base de datos de Cassandra es nombrada por ella.
USOS PARA CASSANDRA:
A pesar de su sofisticado diseo y deseables caractersticas, no supone la herramienta correcta
para cada trabajo.
Grandes Instalaciones:
Ninguna de las cualidades de Cassandra son bien aprovechadas si esta se ejecuta en un solo nodo.
Existen, sin embargo, una gran cantidad de situaciones en donde una base de datos relacional sea
todo lo que necesitemos. Por lo tanto, hay que analizar el trfico del sistema y las necesidades de
rendimiento para determinar cul paradigma adoptar.
Grandes Escrituras de Datos, Estadsticas y Anlisis:
Cassandra est optimizado para un excelente rendimiento en escritura de datos. Muchas de las
instalaciones de produccin que contienen Cassandra involucran el almacenamiento de
En bases de datos relacionales, cada base de datos contiene tablas, cada tabla tiene su propio
nombre y columnas, cada una con su nombre. Agregamos datos a las tablas, asignamos un valor
para cada columna definida, a las que no se les asigna valores, se les agrega NULL. Las filas de las
tablas corresponden a los registros y cada registro posee una llave primaria la cual permite el
acceso a la informacin. Podemos actualizar todos los registros o algunos de ellos si lo deseamos.
Normalmente este modelo se rige bajo un estndar llamado SQL.
Una simple introduccin:
Supongamos que tenemos una lista con varios valores incrustados en ella:
Si la lista tiene valores, podremos consultarlos ms adelante pero tendramos que examinar valor
por valor si queremos saber qu es lo que guarda exactamente en cada casilla. Para solucionar
esto, podemos agregar otra dimensin a esta lista, la cual me representa una descripcin a los
datos, formando un mapa estructurado:
Ahora, si decidimos que nuestro mapa deba almacenar informacin de usuarios, podramos tener
nombres de columnas como nombre, apellido, email, CC. Pero la estructura que hemos creado
solo permite adicionar un registro, as pues, para almacenar mltiples registros, necesitaramos
varias de estas estructuras, y eso no ayuda mucho. Adems, no tenemos nada que unifique los
datos de cada columna y diferencie un registro de otro, necesitamos una llave que referencie a un
grupo de columnas relacionadas.
Cassandra define una familia de columnas para asociar datos similares. Por ejemplo, podemos
tener una familia de columnas llamada Usuario, otra llamada Hotel, otra llamada Libro de
direcciones y muchas ms. De este modo, una familia de columnas es anloga a una tabla en el
modelo relacional.
Ya tenemos dos estructuras bsicas de Cassandra: las columnas, las cuales son pares
nombre/valor, y la familia de columnas, la cual es un contenedor de registros que contienen
columnas similares.
En las bases de datos relacionales, los nombres de columnas eran los que podan almacenarse
como cadenas nicamente, en Cassandra ya no existe esta limitacin, tanto llaves de registro
como columnas pueden ser cadenas, o enteros, o algn otro tipo.
No necesitamos almacenar un valor para cada columna al momento de crear un nuevo registro
porque quizs no conozcamos los valores cada columna. Por ejemplo, algunas personas tienen un
segundo nmero de telfono y otras no. En vez de colocar NULL para los valores que no
conocemos, lo cual gasta espacio, simplemente no se tiene en cuenta la columna para ese registro.
Con esto tenemos una estructura de arreglos multidimensional como esta:
Cada columna en Cassandra posee una marca horaria, la cual graba la ltima fecha en que la
columna fue actualizada, la marca es de las columnas y no de los registros. Este dato no puede
consultarse, se usa nicamente para resolucin de conflictos en el servidor.
Clster:
Los tipos de dato para los nombres y valores de una columna son arreglos de bytes de java,
frecuentemente proporcionados como cadenas. Como el nombre y el valor son de tipo binario,
pueden tener cualquier longitud. El tipo de dato definido para el reloj es un IClock, propio de
Cassandra.
Una familia de columnas puede tener las mismas o diferentes columnas en cada registro.
Registros Amplios, Registros Compactos:
Cuando diseamos una tabla en una base de datos relacional, tpicamente tratas con entidades, o
el grupo de atributos que describen un sustantivo particular (hotel, usuario), el tamao de los
registros no es negociable una vez hayas definido la tabla. Sin embargo, cuando trabajas con
Cassandra, puedes tomar una decisin respecto al tamao de tus registros: pueden ser amplios o
compactos, dependiendo del nmero de columnas que el registro contenga.
Un registro amplio es el que tiene muchas columnas (ciento de miles o incluso millones). Los
registros compactos generalmente contienen nombres generados automticamente (como una
marca horaria). Una diferencia entre amplios y compactos, es que solo los amplios tienen en
cuenta el orden de clasificacin de los nombres de las columnas.
Clasificacin de Columnas:
En Cassandra, especifica cuantas columnas sern comparadas por orden clasificado cuando los
resultados se retornan al cliente. Las columnas se clasifican por el tipo definido Compare With
en la familia de columnas, los tipos son: AsciiType, BytesType, LexicalUUIDType, Integer Type,
LongType, TimeUUIDType, or UTF8Type.
Sper Columnas:
Es un tipo especial de Columna. Una columna regular puede almacenar un arreglo de bytes, y el
valor de una sper columna es un conjunto de subcolumnas (columnas regulares). No es posible
definir una sper columna dentro de otra sper columna. La estructura bsica de una sper
columna est compuesta por un nombre (un arreglo de bytes) y las columnas que almacena.
Cada familia de columnas es almacenada en un archivo separado en disco. Para usar una sper
columna, defines la familia de columnas como un tipo sper, de esta manera, la sper familia de
columnas puede tener a su vez sper columnas, las cuales contienen columnas regulares.
DIFERENCIAS ENTRE RDBMS Y CASSANDRA:
Sin Lenguaje de Consultas:
SQL es el lenguaje estndar de consultas usado en las bases de datos relacionales. Cassandra no
posee un lenguaje para consultas, posee un API a travs de la cual puedes acceder.
Sin Integridad Referencial:
Cassandra no tiene integridad referencial, y por lo tanto, tampoco el concepto de asociaciones. En
una base de datos relacional, podras especificar llaves forneas en una tabla para referenciar la
llave primaria de un registro en otra tabla.
Existen ms diferencias, pero estas son las que por ahora entiendo.
EJEMPLO DE APLICACIN:
Modelado de Datos:
Cuando empiezas a modelar una base de datos relacional, debes empezar desde el dominio
conceptual y entonces representar los sustantivos presentes en el dominio a tablas. Utilizas llaves
primarias y forneas para modelar relaciones. Cuando tienes relaciones muchos a muchos, creas
tablas de asociacin que contengan sus llaves. La asociacin de tablas no existe en el mundo real
pero se necesita para trabajar en el modelo relacional. Una vez definidas las tablas, puedes
empezar a implementar instrucciones para la obtencin y escritura de datos. En cassandra no
tienes que empezar con un modelo de datos, puedes empezar diseando las consultas.
Para este ejemplo, usaremos un dominio que es fcil de entender: Un hotel que desea agregar
huspedes en un libro de reservacin. Nuestro dominio conceptual contiene hoteles, huspedes
que se alojan en los hoteles, un conjunto de habitaciones para cada hotel, y un registro de las
reservaciones. Los hoteles tambin mantienen una coleccin de puntos de inters los cuales son
museos, parques, almacenes de compras, monumentos u otros lugares cercanos al hotel que los
huspedes quieran visitar durante su estada. Tanto hoteles como puntos de inters necesitan
mantener datos de localizacin geogrfica para ser localizados en mapas y para calcular distancias.
Primero, determinemos las consultas:
1.. Encontrar hoteles en un rea dada.
2.. Encontrar informacin acerca de un hotel especifico como nombre y localizacin.
3.. Encontrar puntos de inters cercanos al hotel especifico.
4.. Encontrar una habitacin disponible en una fecha dada.
5.. Encontrar precios y caractersticas de las habitaciones.
6.. Reservar la habitacin seleccionada agregando los datos del husped.
Modelo en RDBMS:
Modelo en Cassandra:
Hay varias formas de hacerlo, una de ellas es representarlo en un modelo fsico similar al
relacional.
Cdigo de la Aplicacin:
Ahora trabajaremos con el cdigo y mostrando como representar el modelo, la aplicacin que
desarrollaremos tendr lo siguiente:
1Crear la estructura de la base de datos.
2Llenar la base de datos con informacin de hoteles y puntos de inters.
3Buscar un hotel en una ciudad especifica.
4Seleccionar uno de los hoteles de la bsqueda y buscar puntos de inters cercanos a ese hotel.
5Seleccionar el hotel e insertar los datos para la reservacin.