Download - 76613613 Apache Cassandra

Transcript
Page 1: 76613613 Apache Cassandra

APACHE CASSANDRA

Es un sistema de almacenamiento distribuido escrito en Java de código 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 más populares de Internet.

CARACTERÍSTICAS:

Distribuido y Descentralizado:

Cassandra es un sistema distribuido, lo cual significa que está en la capacidad de ejecutarse sobre

múltiples máquinas mientras se presenta a los usuarios como un todo. De hecho, No es

provechoso Ejecutar Cassandra en una única máquina, aunque si puedes hacerlo. Por supuesto,

aprovecharás todos sus beneficios si lo corres en múltiples servidores.

En Almacenes de datos creados con bases de datos relacionales como MySQL, cuando es necesario

escalar, algunas máquinas (también llamadas nodos) deben ser validadas como administradores

para coordinar las demás máquinas (llamadas esclavos). Sin embargo, Cassandra es

descentralizado, esto significa que todos los nodos que forman parte del sistema son idénticos,

Ningún nodo desempeña funciones distintas a las de los otros nodos, en vez de eso, Cassandra

implementa un protocolo P2P y mantiene una lista de todas las máquinas disponibles e inactivas.

El hecho de que Cassandra sea descentralizado quiere decir que no tiene un punto de fallo, todos

los nodos en un clúster (grupo de máquinas) funcionan del mismo modo. A lo cual se le denomina

servidor simétrico, porque todas las máquinas hacen lo mismo, por definición no existe un

administrador que coordine tareas entre los nodos.

En muchas soluciones de almacenamiento distribuido, se deben hacer múltiples copias de datos

en un proceso llamado replicación, de esta forma todas las máquinas pueden trabajar peticiones

simultáneas y mejorar el desempeño del sistema. Este proceso no es descentralizado como en

Cassandra, pero para llevarlo a cabo se requiere de la definición de una relación

Administrador/Esclavos, lo que quiere decir que todos los nodos no funcionan de la misma forma,

el administrador es el que autoriza la distribución de los datos, y opera bajo una relación

unidireccional con los nodos esclavos; si el administrador deja de funcionar, la base de datos

completa está en peligro. El diseño 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 relación

Administrador/Esclavos.

La descentralización tiene dos ventajas clave: Es más fácil de usar que un Administrador/Esclavo,

puede ser más fácil de operar y mantener un almacén de datos descentralizado que un

Administrador/Esclavo ya que todos los nodos son iguales, y no se requieren conocimientos

adicionales para escalar; configurar 50 máquinas no es diferente a configurar una sola. Un

Page 2: 76613613 Apache Cassandra

administrador puede ser un simple punto de fallo. Como en Cassandra todos los nodos son

idénticos, la inutilización 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 característica de un sistema que puede continuar

soportando un creciente gran número de peticiones sin afectar mucho su desempeño, La

escalabilidad vertical (adicionar más capacidad hardware y memoria a las máquinas existentes) es

la forma más fácil de lograr esto. La escalabilidad horizontal consiste en agregar más maquinas

que ayuden con el almacenamiento de información y recibir peticiones, para esto el sistema debe

tener la capacidad de sincronizar sus datos con los otros nodos en el clúster.

La escalabilidad flexible se refiere a una propiedad especial de la escalabilidad horizontal. Esto

significa que el clúster puede escalar y des escalar uniformemente. Para hacer esto el clúster debe

estar en la capacidad de aceptar nuevos nodos que empiecen recibiendo parte o toda la

información de los demás nodos y aceptando peticiones de usuarios sin configuraciones sobre el

clúster. No es necesario parar el sistema ni realizar cambios en la aplicación, 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 máquinas del clúster, 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 términos 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 conexión y comunicación. Existen

computadores sofisticados (y costosos) que pueden tratar con este tipo de circunstancias. Para

que un sistema sea altamente disponible, debe incluir múltiples computadores conectados, y el

software que se ejecuta sobre ellos debe tener la capacidad de correr sobre un clúster e identificar

posibles nodos defectuosos.

Cassandra es altamente disponible, tú puedes reemplazar nodos defectuosos en un clúster sin

tener que detener el sistema, y puedes también replicar la información a otros almacenes de

datos para mejorar el desempeño 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 más

recientemente escrito, consistencia casual, la cual es una variación de la estricta, y la eventual, en

la cual los datos deben pasar por las máquinas de un sistema distribuido, esto lleva tiempo, por

eso decimos que “eventualmente” los datos son consistentes.

Page 3: 76613613 Apache Cassandra

Orientación a Columnas:

Cassandra no es relacional, representa las estructuras de datos como tablas de hash

multidimensionales, en donde cada registro puede tener una o más columnas, aunque no todos

los registros de un mismo tipo deben el mismo número 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 representación de los datos que se va a usar y cuantos campos

se necesitarán 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 configuración. Las familias de columnas o columnas comunes son nombres para

información asociada. Las tablas de datos son dinámicas, así que puedes agregar información

usando las columnas que quieras, no necesitas definir las columnas que requieres por adelantado.

Alto Desempeño:

Cassandra fue diseñado específicamente para aprovechar al máximo las máquinas con

procesadores multinúcleo, y para ejecutarse sobre muchas docenas de estas máquinas alojadas en

múltiples almacenes de datos. Cassandra ha demostrado desempeñarse bien en la carga pesada

de datos. Posee un alto rendimiento en escrituras por segundo. Cuantos más servidores sean

agregados, se sacará mayor provecho de las propiedades de Cassandra sin sacrificar desempeño.

¿DE DÓNDE VIENE CASSANDRA?

Cassandra es un sistema de código abierto mantenido por la fundación Apache. Cassandra se

originó en Facebook en el 2007 para solventar los problemas de búsqueda interna de datos que

tenía la compañía, la cual tiene que tratar con grandes volúmenes de datos. El código fuente fue

publicado en Julio del 2008, en ese entonces el código era actualizado por ingenieros de Facebook.

En marzo del 2009 fue acogido por la fundación Apache y en febrero de 2010 es escogido como

uno de los mejores proyectos de la fundación.

¿DE DONDE OBTIENE CASSANDRA SU NOMBRE?

En la mitología 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 podría pronosticar todo que ocurriría con exactitud, pero nadie le

creería. La base de datos de Cassandra es nombrada por ella.

Page 4: 76613613 Apache Cassandra

USOS PARA CASSANDRA:

A pesar de su sofisticado diseño y deseables características, 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 tráfico del sistema y las necesidades de

rendimiento para determinar cuál paradigma adoptar.

Grandes Escrituras de Datos, Estadísticas y Análisis:

Cassandra está optimizado para un excelente rendimiento en escritura de datos. Muchas de las

instalaciones de producción que contienen Cassandra involucran el almacenamiento de

actualizaciones de actividades de los usuarios, uso de redes sociales, comentarios /

recomendaciones, y aplicaciones estadísticas, 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 desempeño en grandes volúmenes de escritura con

mucha concurrencia de clientes es una de las características principales de Cassandra.

Distribución Geográfica:

Cassandra tiene soporte para la distribución geográfica de datos. Puedes configurar Cassandra

para la replicación de datos a múltiples almacenes de datos repartidos globalmente.

Aplicaciones Evolutivas:

Si tu aplicación evoluciona rápidamente, Cassandra es una buena opción debido a su modelo de

esquema libre.

INSTALACIÓN EN WINDOWS:

Cassandra está disponible para descargar en la página http://cassandra.apache.org. El archivo

pesa alrededor de unos 10 MB. La forma más simple de empezar es descargando el binario, si

descargas el código fuente tendrás que compilarlo, así que mejor el binario.

Como el archivo está comprimido, lo descomprimimos usando winrar u otro software compresor.

Descomprímelo en la carpeta raíz del disco C.

¿Qué contiene el Paquete?

Una vez lo descomprimes, verás que Cassandra contiene varios directorios, observemos cada uno

de ellos:

Page 5: 76613613 Apache Cassandra

.. bin: este directorio contiene todos los ejecutables necesarios para correr Cassandra bajo el

cliente de línea 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 documentación.

.. lib: contiene todas las librerías externas que Cassandra necesita para correr.

EJECUTAR CASSANDRA:

Antes de ejecutar Cassandra, necesitamos un software llamado JDK, se puede descargar desde la

página 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, después clic en “Configuración avanzada del sistema” y por

último clic en el botón 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 números escritos en la ruta pueden

ser distintos, esto depende de tu versión de JDK. Damos en Aceptar.

En la misma ventana seleccionamos la variable de entorno Patch:

Page 6: 76613613 Apache Cassandra

Damos clic en “Editar…” y aparecerá lo siguiente:

En el campo “valor de la variable” colocamos al final un “;” y seguido la dirección de Cassandra, si

has seguido los pasos de este manual, la dirección sería: C:\apache-cassandra-0.8.6\bin

Clic en aceptar y cerramos las ventanas.

Listo, ahora ya podemos ejecutar Cassandra, para ello abrimos una línea de comandos, la forma

más fácil 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 ejecución, presiona CTRL + C. No termines

la ejecución todavía.

EJECUTAR EL CLIENTE DE LINEA DE COMANDOS:

Page 7: 76613613 Apache Cassandra

Una vez instalado y ejecutado, ya podemos usar el cliente de línea de comandos de Cassandra,

para ello ejecutamos otra línea de comando sin cerrar la que está abierta, hazlo de la misma forma

que explique más 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 ejecución de cassandra, lo explique más arriba.

MODELO DE DATOS DE CASSANDRA

Page 8: 76613613 Apache Cassandra

Para desarrolladores y administradores provenientes del mundo relacional, el modelo de datos de

cassandra puede ser muy difícil de entender, algunos términos, 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 información. Podemos actualizar todos los registros o algunos de ellos si lo deseamos.

Normalmente este modelo se rige bajo un estándar llamado SQL.

Una simple introducción:

Supongamos que tenemos una lista con varios valores incrustados en ella:

Si la lista tiene valores, podremos consultarlos más adelante pero tendríamos que examinar valor

por valor si queremos saber qué es lo que guarda exactamente en cada casilla. Para solucionar

esto, podemos agregar otra dimensión a esta lista, la cual me representa una descripción a los

datos, formando un mapa estructurado:

Ahora, si decidimos que nuestro mapa deba almacenar información de usuarios, podríamos tener

nombres de columnas como nombre, apellido, email, CC. Pero la estructura que hemos creado

solo permite adicionar un registro, así pues, para almacenar múltiples registros, necesitaríamos

varias de estas estructuras, y eso no ayuda mucho. Además, 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 más. De este modo, una familia de columnas es análoga a una tabla en el

modelo relacional.

Page 9: 76613613 Apache Cassandra

Ya tenemos dos estructuras básicas 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 podían almacenarse

como cadenas únicamente, en Cassandra ya no existe esta limitación, tanto llaves de registro

como columnas pueden ser cadenas, o enteros, o algún otro tipo.

No necesitamos almacenar un valor para cada columna al momento de crear un nuevo registro

porque quizás no conozcamos los valores cada columna. Por ejemplo, algunas personas tienen un

segundo número de teléfono 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 resolución de conflictos en el servidor.

Clúster:

Cassandra probablemente no sea la mejor opción si necesitas únicamente ejecutar un simple

nodo. Cassandra está diseñado para distribuirse en múltiples máquinas operando juntas y

presentándose como una única entidad al usuario final. Así, la estructura más externa de

Cassandra es el clúster.

Espacio Clave:

Un clúster es un contenedor para espacios clave (generalmente un único espacio clave). Un

espacio clave es el contenedor de datos más 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 aplicación lo necesite, aunque se considera como una práctica

aceptable crear un solo espacio clave por aplicación.

Page 10: 76613613 Apache Cassandra

Familia de Columnas:

Una familia de columnas es un contenedor para una ordenada colección de registros, los cuales

cada uno es una ordenada colección 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 irán 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 cómo se presentarán 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

súper columnas comunes.

Cuando escribes datos a una familia de columnas, especificas valores para una o más columnas,

esa colección 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 más básica 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 término “columna” desde el mundo relacional,

no funciona igual en Cassandra. Primero que todo, cuando diseñamos una base de datos

relacional, primero especificas la estructura de las tablas y el nombre de sus columnas, más

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 después escribir los datos sin tener definidas las

Page 11: 76613613 Apache Cassandra

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 diseñamos una tabla en una base de datos relacional, típicamente tratas con entidades, o

el grupo de atributos que describen un sustantivo particular (hotel, usuario), el tamaño de los

registros no es negociable una vez hayas definido la tabla. Sin embargo, cuando trabajas con

Cassandra, puedes tomar una decisión respecto al tamaño de tus registros: pueden ser amplios o

compactos, dependiendo del número 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 automáticamente (como una

marca horaria). Una diferencia entre amplios y compactos, es que solo los amplios tienen en

cuenta el orden de clasificación de los nombres de las columnas.

Clasificación de Columnas:

En Cassandra, especifica cuantas columnas serán 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. Súper Columnas: Es un tipo especial de Columna. Una columna regular puede almacenar un arreglo de bytes, y el valor de una súper columna es un conjunto de subcolumnas (columnas regulares). No es posible definir una súper columna dentro de otra súper columna. La estructura básica de una súper columna está compuesta por un nombre (un arreglo de bytes) y las columnas que almacena.

Page 12: 76613613 Apache Cassandra

Cada familia de columnas es almacenada en un archivo separado en disco. Para usar una súper columna, defines la familia de columnas como un tipo súper, de esta manera, la súper familia de columnas puede tener a su vez súper columnas, las cuales contienen columnas regulares. DIFERENCIAS ENTRE RDBMS Y CASSANDRA: Sin Lenguaje de Consultas: SQL es el lenguaje estándar de consultas usado en las bases de datos relacionales. Cassandra no posee un lenguaje para consultas, posee un API a través 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, podrías especificar llaves foráneas en una tabla para referenciar la llave primaria de un registro en otra tabla. Existen más diferencias, pero estas son las que por ahora entiendo. EJEMPLO DE APLICACIÓN: 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 foráneas para modelar relaciones. Cuando tienes relaciones muchos a muchos, creas tablas de asociación que contengan sus llaves. La asociación 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 obtención y escritura de datos. En cassandra no tienes que empezar con un modelo de datos, puedes empezar diseñando las consultas. Para este ejemplo, usaremos un dominio que es fácil de entender: Un hotel que desea agregar huéspedes en un libro de reservación. Nuestro dominio conceptual contiene hoteles, huéspedes que se alojan en los hoteles, un conjunto de habitaciones para cada hotel, y un registro de las reservaciones. Los hoteles también mantienen una colección de puntos de interés los cuales son museos, parques, almacenes de compras, monumentos u otros lugares cercanos al hotel que los huéspedes quieran visitar durante su estadía. Tanto hoteles como puntos de interés necesitan mantener datos de localización geográfica para ser localizados en mapas y para calcular distancias. Primero, determinemos las consultas: 1.. Encontrar hoteles en un área dada. 2.. Encontrar información acerca de un hotel especifico como nombre y localización. 3.. Encontrar puntos de interés cercanos al hotel especifico. 4.. Encontrar una habitación disponible en una fecha dada. 5.. Encontrar precios y características de las habitaciones. 6.. Reservar la habitación seleccionada agregando los datos del huésped. Modelo en RDBMS:

Page 13: 76613613 Apache Cassandra

Modelo en Cassandra: Hay varias formas de hacerlo, una de ellas es representarlo en un modelo físico similar al relacional.

Page 14: 76613613 Apache Cassandra

Código de la Aplicación: Ahora trabajaremos con el código y mostrando como representar el modelo, la aplicación que desarrollaremos tendrá lo siguiente: 1—Crear la estructura de la base de datos. 2—Llenar la base de datos con información de hoteles y puntos de interés. 3—Buscar un hotel en una ciudad especifica. 4—Seleccionar uno de los hoteles de la búsqueda y buscar puntos de interés cercanos a ese hotel. 5—Seleccionar el hotel e insertar los datos para la reservación.

CONTIUARÁ…