Apache Cassandra

Embed Size (px)

Citation preview

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 soportando un creciente gran nmero de peticiones sin afectar mucho su desempeo, La escalabilidad vertical (adicionar ms capacidad hardware y memoria a las mquinas existentes) es la forma ms fcil de lograr esto. La escalabilidad horizontal consiste en agregar ms maquinas que ayuden con el almacenamiento de informacin y recibir peticiones, para esto el sistema debe tener la capacidad de sincronizar sus datos con los otros nodos en el clster. La escalabilidad flexible se refiere a una propiedad especial de la escalabilidad horizontal. Esto significa que el clster puede escalar y des escalar uniformemente. Para hacer esto el clster debe estar en la capacidad de aceptar nuevos nodos que empiecen recibiendo parte o toda la informacin de los dems nodos y aceptando peticiones de usuarios sin configuraciones sobre el clster. No es necesario parar el sistema ni realizar cambios en la aplicacin, solo se agrega el nodo, y en el caso de Cassandra, la encontrar y la configurar para que forme parte del sistema. Des escalar, desde luego, significa remover mquinas del clster, lo cual se necesita si las peticiones al sistema disminuyen y no se requiere hardware adicional para soportarlas. Alta Disponibilidad y Tolerancia a Fallos: En trminos generales, la disponibilidad de un sistema est ligada a su habilidad de cumplir peticiones. Pero los computadores pueden experimentar muchas formas de fallo, desde componentes hardware descompuestos hasta problemas de conexin y comunicacin. Existen computadores sofisticados (y costosos) que pueden tratar con este tipo de circunstancias. Para que un sistema sea altamente disponible, debe incluir mltiples computadores conectados, y el software que se ejecuta sobre ellos debe tener la capacidad de correr sobre un clster e identificar posibles nodos defectuosos. Cassandra es altamente disponible, t puedes reemplazar nodos defectuosos en un clster sin tener que detener el sistema, y puedes tambin replicar la informacin a otros almacenes de datos para mejorar el desempeo local. Consistencia Personalizable: Significa que t decides el nivel de consistencia que necesitas en balance al nivel de disponibilidad. Existen tres modelos de consistencia: estricta, en la cual un lector recibe el valor ms recientemente escrito, consistencia casual, la cual es una variacin de la estricta, y la eventual, en la cual los datos deben pasar por las mquinas de un sistema distribuido, esto lleva tiempo, por eso decimos que eventualmente los datos son consistentes.

Orientacin a Columnas: Cassandra no es relacional, representa las estructuras de datos como tablas de hash multidimensionales, en donde cada registro puede tener una o ms columnas, aunque no todos los registros de un mismo tipo deben el mismo nmero de columnas, como si sucede en el modelo relacional. Cada registro contiene una llave nica la cual permite el acceso a los datos. Cassandra almacena los datos en tablas de hash multidimensionales, lo que significa que no es necesario tener por adelantado la representacin de los datos que se va a usar y cuantos campos 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 actualizaciones de actividades de los usuarios, uso de redes sociales, comentarios / recomendaciones, y aplicaciones estadsticas, Estos son usos fuertes de Cassandra debido a que requieren una gran capacidad de escritura con menos operaciones de lectura y porque las actualizaciones pueden ocurrir repentinamente en cualquier momento. La habilidad de llevar grandes cargos de trabajo que requieren alto desempeo en grandes volmenes de escritura con mucha concurrencia de clientes es una de las caractersticas principales de Cassandra. Distribucin Geogrfica: Cassandra tiene soporte para la distribucin geogrfica de datos. Puedes configurar Cassandra para la replicacin de datos a mltiples almacenes de datos repartidos globalmente. Aplicaciones Evolutivas: Si tu aplicacin evoluciona rpidamente, Cassandra es una buena opcin debido a su modelo de esquema libre. INSTALACIN EN WINDOWS: Cassandra est disponible para descargar en la pgina http://cassandra.apache.org. El archivo pesa alrededor de unos 10 MB. La forma ms simple de empezar es descargando el binario, si descargas el cdigo fuente tendrs que compilarlo, as que mejor el binario. Como el archivo est comprimido, lo descomprimimos usando winrar u otro software compresor. Descomprmelo en la carpeta raz del disco C. Qu contiene el Paquete? Una vez lo descomprimes, vers que Cassandra contiene varios directorios, observemos cada uno de ellos:

.. bin: este directorio contiene todos los ejecutables necesarios para correr Cassandra bajo el cliente de lnea de comandos. .. conf: este directorio contiene los archivos que permiten configurar Cassandra. .. interface: contiene un nico archivo que representa el cliente de llamadas a procedimiento remoto. .. javadoc: contiene documentacin. .. lib: contiene todas las libreras externas que Cassandra necesita para correr. EJECUTAR CASSANDRA: Antes de ejecutar Cassandra, necesitamos un software llamado JDK, se puede descargar desde la pgina oficial de Java. Una vez instalado el JDK, procedemos a crear una variable de entorno, esto lo podemos hacer de la siguiente forma: en Windows 7, clic derecho en el icono equipo (en XP se llama MIPC). Clic en propiedades, despus clic en Configuracin avanzada del sistema y por ltimo clic en el botn de Variables de entorno. Una vez all, clic en Nueva, aparecer este cuadro:

En el primer campo escribe: JAVA_HOME, en el segundo la ruta donde est instalado el JDK, generalmente es esta: C:\Program Files\Java\jdk1.6.0_23. Los nmeros escritos en la ruta pueden ser distintos, esto depende de tu versin de JDK. Damos en Aceptar. En la misma ventana seleccionamos la variable de entorno Patch:

Damos clic en Editar y aparecer lo siguiente:

En el campo valor de la variable colocamos al final un ; y seguido la direccin de Cassandra, si has seguido los pasos de este manual, la direccin sera: C:\apache-cassandra-0.8.6\bin Clic en aceptar y cerramos las ventanas. Listo, ahora ya podemos ejecutar Cassandra, para ello abrimos una lnea de comandos, la forma ms fcil de hacerlo es pulsar las teclas WINDOWS + R y escribir en la ventana que aparece: cmd y luego teclea ENTER. Para iniciar Cassandra escribimos el comando: cassandra start Esto ejecutar cassandra en el equipo. Para terminar la ejecucin, presiona CTRL + C. No termines la ejecucin todava. EJECUTAR EL CLIENTE DE LINEA DE COMANDOS:

Una vez instalado y ejecutado, ya podemos usar el cliente de lnea de comandos de Cassandra, para ello ejecutamos otra lnea de comando sin cerrar la que est abierta, hazlo de la misma forma que explique ms arriba. Ahora ejecutamos el siguiente comando: cassandra-cli Aparecer lo siguiente:

COMMANDOS BASICOS DEL CLIENTE: En el cliente puedes ejecutar los siguientes comandos: Para ayuda escribe: help; Conectar al Equipo: Ya has iniciado el cliente y a Cassandra, pero hace falta conectar al cliente con Cassandra, eso se hace con el siguiente comando: connect localhost/9160; Crear Espacios clave y familias de columnas: Para crear un espacio clave ejecutas: create keyspace nombre; Para usarlo ejecuta: use nombre; Para crear una familia de columnas ejecuta: create column family nombre; Salir del Cliente: Para salir del cliente ejecutamos: quit; Para terminar la ejecucin de cassandra, lo explique ms arriba. MODELO DE DATOS DE CASSANDRA

Para desarrolladores y administradores provenientes del mundo relacional, el modelo de datos de cassandra puede ser muy difcil de entender, algunos trminos, como el espacio clave son completamente nuevos, y las columnas son comunes al mundo relacional pero con diferente significado. El modelo Relacional: 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: Cassandra probablemente no sea la mejor opcin si necesitas nicamente ejecutar un simple nodo. Cassandra est diseado para distribuirse en mltiples mquinas operando juntas y presentndose como una nica entidad al usuario final. As, la estructura ms externa de Cassandra es el clster. Espacio Clave: Un clster es un contenedor para espacios clave (generalmente un nico espacio clave). Un espacio clave es el contenedor de datos ms externo en Cassandra, similar a un contenedor de tablas en el modelo relacional. Cada espacio contiene un nombre y propiedades. Puedes crear tanto espacios clave como tu aplicacin lo necesite, aunque se considera como una prctica aceptable crear un solo espacio clave por aplicacin.

Familia de Columnas: Una familia de columnas es un contenedor para una ordenada coleccin de registros, los cuales cada uno es una ordenada coleccin de columnas. En el mundo relacional, cuando creas una base de datos a partir de un modelo, especificas el nombre de la base de datos (un espacio clave en Cassandra), los nombres de las tablas (remotamente similares a una familia de columnas).y entonces defines los nombres de las columnas que irn en cada tabla. Existen dos razones por las cuales las familias de columnas no son iguales a las tablas. La primera, aunque las familias de columnas son definidas, las columnas no, eres libre de agregar columnas en cualquier momento. La segunda, una familia de columnas tiene dos atributos: nombre y comparador, este ltimo es la forma en cmo se presentarn los datos en una consulta. Otra diferencia es que en el modelo relacional, las tablas contienen nicamente columnas y registros, mientras que en una familia de columnas puede haber columnas relacionadas como sper columnas comunes.

Cuando escribes datos a una familia de columnas, especificas valores para una o ms columnas, esa coleccin de valores juntos con una nica llave primaria se conoce como registro, de este modo, un registro puede entenderse como un contenedor para columnas. Columna: Una columna es la estructura de datos ms bsica en el modelo de datos de Cassandra. Una columna contiene un nombre, un valor y un reloj, el cual puedes tomarlo como una marca horaria por ahora. Aunque estemos familiarizados con el trmino columna desde el mundo relacional, no funciona igual en Cassandra. Primero que todo, cuando diseamos una base de datos relacional, primero especificas la estructura de las tablas y el nombre de sus columnas, ms adelante escribes los datos sobre la estructura ya definida. En Cassandra, no tienes que definir las columnas que necesitas. Solamente define las familias de columnas que deseas en el espacio clave, y despus escribir los datos sin tener definidas las

columnas. Esto es posible porque en Cassandra, todas las columnas son proporcionadas por el cliente. 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. CONTIUAR