Вы находитесь на странице: 1из 63

Bases de Datos Avanzadas

Bases de datos NoSQL


Parte II: Apache Cassandra

20 de abril de 2012
Roberto Amor Marcos

Contenidos
Objetivos Por qu Cassandra? Visin general Modelo de Datos Arquitectura Caractersticas CQL Conexin y acceso desde lenguajes de alto nivel Aplicacin de ejemplo sobre Cassandra

Objetivos
Conocer en profundidad Apache Cassandra. Conocer y entender la terminologa propia de Cassandra. Conocer las distintas formas de acceder al contenido de la Base de Datos. Conocer el lenguaje de consulta CQL. Conocer cules son las formas de estructurar la informacin en Cassandra.

Por qu Cassandra?
Es un sistema fcil de entender pues es del tipo de Base de Datos NoSQL ms cercano al modelo relacional. Es de los pocos que ha superado la fase de versiones desarrollo 0.x y es actualizado, corregido y mejorado cada poco tiempo. ltima versin 1.0.9 del 6 de abril de 2012. Dispone de un lenguaje de consultas muy similar a SQL: CQL (Cassandra Query Language). Est escrito en Java. La Fundacin Apache est detrs de su desarrollo y mantenimiento.

Por qu Cassandra?
Es utilizado en aplicaciones comerciales muy importantes. Twitter, Netix, Digg, Cisco Webex, Spotify. Se us en Facebook. Su popularidad est en aumento y cada vez es ms utilizado. Existen distribuciones compiladas para todos los sistemas operativos, ofreciendo adems, paneles de administracin amigables. Dispone de partners que dan soporte comercial de calidad. Gran comunidad.

Visin general

Sistema key-value store que almacena column families. Creado por Avanash Lakshaman y Prashany Malik para ser integrado en el motor de bsqueda de Facebook. Concretamente para buscar mensajes en la bandeja de entrada. Inuido por Google BigTable (modelo de datos) y Amazon Dynamo (estructura). Proceso de liberacin: Julio 2008: publicado como proyecto open source en Google Code. Marzo 2009: pasa a formar parte de los proyectos Apache Incubator. Febrero 2010: se convierte en proyecto top-level de la Apache Software Foundation.

Visin general

Es actualmente el modelo de ms xito y el ms utilizado. Actualmente sigue creciendo en nmero de usuarios. En el momento de su presentacin era capaz de ofrecer servicio concurrente a 100 millones de usuarios. Especialmente diseado para ejecutarse sobre grandes clusters, siendo muy sencilla su instalacin multimquina. http://www.screenr.com/5G6 : how to set up a 4 node Cassandra cluster in under 2 minutes.

Modelo de Datos
Conceptos bsicos: Cluster: las mquinas (nodos) de una instancia de Cassandra. Los clusters pueden contener mltiples keyspaces. Keyspace: es la agrupacin de ColumnFamilies. Normalmente hay un keyspace por aplicacin. ColumnFamilies: contenedor de mltiples columns. Es equivalente a la tabla en el modelo relacional. Cada entrada (row) se identica y accede a ella mediante un row-KEY. Column: unidad bsica de almacenamiento. Consistente en una estructura de tres valores: name, value y timestamp. SuperColumns: se consideran columns que almacenan subcolumnas. Son opcionales y no son muy utilizadas.

Modelo de Datos
De la columna al cluster Columns

Unidad bsica de almacenamiento. Es una tripla.


struct Column { 1: binary 2: binary 3: i64 } { name, value, timestamp

name: Username, value: john23, timestamp: 123456789

Modelo de Datos
De la columna al cluster Columns
Los tres valores anteriores son proporcionados por el cliente de alto nivel, incluido el timestamp. Por ello, es necesario tener sincronizado el reloj del sistema con el reloj del cluster. El timestamp es utilizado para la resolucin de conictos (Eventual Consistency). El timestamp puede ser cualquier cosa pero la convencin marca que sea el valor en microsegundos desde 1970. El tamao mximo que puede albergar una columna es 2GB.

Modelo de Datos
De la columna al cluster Rows
Agregacio!n de columnas con un nombre para referenciarlo (rowKEY). El row sera el equivalente a la la del modelo relacional y el row KEY el equivalente a la clave primaria del modelo relacional. Es usado para ordenar los cheros de forma fsica. Se pueden almacenar hasta 2 mil millones de columnas en cada row.

Modelo de Datos
De la columna al cluster Column Family
Agregacio!n rows. Cada ColumnFamily es guardado en un chero separado y es ordenado por la KEY. La forma de ordenar tanto de los rows como de las columnas se puede editar desde los cheros de conguracin. ASCII UTF-8 Long UUID (lxico o de tiempo) Fecha Combinaciones de ellos mediante el patrn CompositeType

Modelo de Datos
De la columna al cluster Column Family

Modelo de Datos
De la columna al cluster Keyspace Es equiparable al schema del modelo relacional. Cluster Abarca desde el modelo fsico al modelo lgico. Incluso existe la posibilidad de interconectar clusters separados fsica y lgicamente. Toda la informacin de un row debe encontrarse en una misma mquina o nodo del cluster. Las IPs de los nodos se aaden en un chero de conguracin alojado en cada nodo. Todo lo dems es transparente para el usuario.

Modelo de Datos

El modelo estructural de un solo vistazo

Arquitectura
Cassandra rene la tecnologa de sistemas distribuidos de Dynamo y el modelo de datos de BigTable. De Dynamo: Eventualmente Consistente. Sistema de nodos en anillo. De BigTable: modelo de datos basado en Familias de Columnas. Cassandra implementa la parte AP del modelo CAP (i.e. Availability y Partitioning tolerance).

Arquitectura
Capas de la arquitectura de Cassandra:
Core Layer Middle Layer Top Layer Tombstones HintedHandoff Read repair Bootstrap Monitoring Admin tools

Messaging service Gossip Failure dectection Cluster state Partitioner Replication

Commit log Memtable SSTable Indexes Compaction

Arquitectura
Escritura 2 modos de escritura: Quorum write: bloqueo hasta que la escritura tenga efecto. Async write: se enva la peticin a cualquier nodo. El nodo se encarga de hacer llegar los datos hasta el nodo apropiado. Si un nodo est cado, otro nodo lo sustituir hasta que el nodo original vuelva a estar disponible, escribiendo despus en l. Por defecto cada 15 minutos se mueven datos entre nodos.

Arquitectura
Escritura Camino de datos
write
Disk Commit Log

memtables

nodes
when: out of space too many keys

t
on disk: {dataFile (SSTable), indexFile (SSTable Index)}

Arquitectura
Escritura Propiedades de la escritura: No hay lecturas. No hay bsquedas. Rpida. Atmica respecto a las ColumnFamilies. Siempre se puede escribir (disponibilidad de nodos).

Arquitectura
Lectura Camino de datos: 1. Cualquier nodo puede responder (resolucin de conictos si fuera necesario con consistencia eventual). 2. El Partitioner acta sobre cmo devolver los datos. 3. Espera de los datos desde memtable o desde SSTable.

Arquitectura
Lectura Propiedades de la lectura: Posibilidad de lecturas en paralelo de mltiples SSTable. Mucho ms lento que la escritura. El retardo en las bsquedas se puede mitigar con ms RAM. Lecturas escalables hasta miles de millones de rows."

Arquitectura
Borrado Se hace mediante una marca de borrado (tombstone) en el memtable. Durante la fase de escritura del memtable al disco se descartan las entradas marcadas con el tombstone.

Arquitectura
VS MySQL con 50GB de datos MySQL ~300ms write ~350ms read

Cassandra ~0.12ms write ~15ms read

Arquitectura
Bsquedas sobre +50TB de datos en cluster de 150 nodos. Keyspace consistente en dos ColumnFamilies. Query A: buscar mensajes por trmino de bsqueda. Min: 7.78ms Median: 18.27ms Max: 44.41ms

Arquitectura
Bsquedas sobre +50TB de datos en cluster de 150 nodos. Keyspace consistente en dos ColumnFamilies. Query B: interaccin de mensajera privada. Dado el nombre de un usuario, devolver todos los mensajes mantenidos con ese usuario. Min: 7.69ms Median: 15.69ms Max: 26.13ms

Caractersticas
Tolerante a fallos: Datos replicados automticamente entre nodos. Replicacin a travs de mltiples centros de datos. Nodos automticamente reemplazados. Descentralizado: cada nodo es idntico a los dems en estructura. No hay cuellos de botella. Eventualmente consistente Alta disponibilidad Altamente escalable Con soporte profesional Probado

CQL
Desde la versin 0.8, Cassandra proporciona un lenguaje de consulta y manipulacin de los datos similar a SQL. Actualmente (marzo 2012) se encuentra en su versin 2.0. Se puede actuar con l tanto desde prompt como desde clientes de alto nivel.
SELECT * FROM MyColumnFamily; UPDATE MyColumnFamily SET 'SomeColumn' = 'SomeValue' WHERE KEY = B70DE1D0-9908-4AE3-BE34-5573E5B09F14;

CQL
Tipos de datos en CQL
Tipo de dato
ascii bigint blob boolean counter decimal double oat int text timestamp uuid varchar variant

Descripcin
string de caracteres en US-ASCII long de 64-bits con signo tipo LOB hexadecimal frue o false contador distribuido de 64-bits nmero decimal de precisin variable nmero en punto otante de 64-bits. sigue la norma IEEE-754 nmero en punto otante de 32-bits. sigue la norma IEEE-754 entero con signo de 32-bits string en UTF-8 marca de tiempo de 8 bytes UUID del tipo 1 o tipo 4 string en UTF-8 entero de precisin arbitraria

CQL
El tipo de dato UUID
Identicador Universalmente nico (Universally Unique Identier). Identicador estndar universal usado en computacin distribuida. Denido en el RFC-4122 Consiste en nmero hexadecimal de 16bytes (128-bits) dividido en grupos de la forma 8-4-4-4-12 550e8400-e29b-41d4-a716-446655440000 Hay 3 x 1038 identicadores posibles: 340,282,366,920,938,463,463,374,607,431,768,211,456

CQL
El tipo de dato UUID
Existen 5 tipos o versiones: Version 1 MAC address Version 2 DCE Security Version 3 MD5 hash Version 4 Random Version 5 SHA-1 hash

CQL
El tipo de dato UUID
Probabilidad de repeticin?

Con n = 2122 (122 random bits)


n 68,719,476,736 = 236 2,199,023,255,552 = 241 70,368,744,177,664 = 246 probabilidad 0.0000000000000004 (4 1016) 0.0000000000004 (4 1013) 0.0000000004 (4 1010)

CQL
Instrucciones soportadas (en orden alfabtico)
ALTER COLUMNFAMILY BATCH CREATE COLUMNFAMILY CREATE INDEX CREATE KEYSPACE DELETE DROP COLUMNFAMILY DROP INDEX DROP KEYSPACE INSERT SELECT TRUNCATE UPDATE USE

CQL
ALTER COLUMNFAMILY
Manipular la metainformacin de columna en una familia de columnas.
ALTER COLUMNFAMILY <name> ALTER <column_name> TYPE <data_type> | ADD <column_name> <data_type> | DROP <column_name> ;

ALTER COLUMNFAMILY users ALTER email TYPE varchar; ALTER COLUMNFAMILY users ADD gender varchar; ALTER COLUMNFAMILY users DROP gender;

CQL
BATCH
Crea un bloque en el que las instrucciones contenidas en l se insertan el la BD con el mismo valor de timestamp.
BEGIN BATCH [ USING <write_option> [ AND <write_option> [...] ] ]; <dml_statement> <dml_statement> [...] APPLY BATCH; where <write_option> is: USING CONSISTENCY <consistency_level> TTL <seconds> TIMESTAMP <integer>

CQL
BATCH
Crea un bloque en el que las instrucciones contenidas en l se insertan el la BD con el mismo valor de timestamp.

BEGIN BATCH USING CONSISTENCY QUORUM AND TTL 8640000 INSERT INTO users (KEY, password, name) VALUES ('user2', 'ch@ngem3b', 'second user') UPDATE users SET password = 'ps22dhds' WHERE KEY = 'user2' INSERT INTO users (KEY, password) VALUES ('user3', 'ch@ngem3c') DELETE name FROM users WHERE key = 'user2' INSERT INTO users (KEY, password, name) VALUES ('user4', 'ch@ngem3c', 'Andrew') APPLY BATCH;

CQL
CREATE COLUMNFAMILY
Crea una nueva Familia de Columnas
CREATE COLUMNFAMILY <cf_name> ( <key_column_name> <data_type> PRIMARY KEY [, <column_name> <data_type> [, ...] ] ) [ WITH <storage_parameter> = <value> [AND <storage_parameter> = <value> [...] ] ];

CREATE COLUMNFAMILY user_events (user text PRIMARY KEY) WITH comparator=timestamp AND default_validation=int; CREATE COLUMNFAMILY users ( KEY uuid PRIMARY KEY, username text, email text ) WITH comment='user information' AND read_repair_chance = 1.0;

CQL
CREATE INDEX
Crea un nuevo ndice secundario
CREATE INDEX [<index_name>] ON <cf_name> (<column_name>);

CREATE COLUMNFAMILY users ( KEY uuid PRIMARY KEY, firstname text, lastname text, email text, address text, zip int, state text); CREATE INDEX user_state ON users (state); CREATE INDEX ON users (zip);

CQL
CREATE KEYSPACE
Crea un nuevo Keyspace
CREATE KEYSPACE <ks_name> WITH strategy_class = <value> [ AND strategy_options:<option> = <value> [...] ];

CREATE KEYSPACE MyKeyspace WITH strategy_class = 'SimpleStrategy' AND strategy_options:replication_factor = 1;

CQL
DELETE
Borra una o varias columnas de un row o rows
DELETE [<column_name> [, ...]] FROM <column_family> [USING CONSISTENCY <consistency_level> [AND TIMESTAMP <integer>]] WHERE <row_specification>; where <row_specification> is: KEY | <key_alias> = <key_value> KEY | <key_alias> IN (<key_value> [,...])

DELETE email, phone FROM users USING CONSISTENCY QUORUM AND TIMESTAMP 1318452291034 WHERE user_name = 'jsmith'; DELETE FROM users WHERE KEY IN ('dhutchinson', 'jsmith');

CQL
DROP COLUMNFAMILY
Elimina una Familia de Columnas
DROP COLUMNFAMILY <name>;

DROP COLUMNFAMILY users;

CQL
DROP INDEX
Elimina un ndice secundario
DROP INDEX <index_name>;

DROP INDEX users; DROP INDEX users_zip_idx;

Si el ndice se cre sin nombre, sigue el siguiente patrn:


<column_family_name><column_name>_idx

CQL
DROP KEYSPACE
Elimina un Keyspace
DROP KEYSPACE <name>;

DROP KEYSPACE demo;

CQL
INSERT
Inserta o actualiza una o varias columnas identicadas por su KEY y su Familia de Columnas
INSERT INTO <column_family> (<key_name>, <column_name> [, ...]) VALUES (<key_value>, <column_value> [, ...]) [USING <write_option> [AND <write_option> [...] ] ]; where <write_option> is: USING CONSISTENCY <consistency_level> TTL <seconds> TIMESTAMP <integer>

INSERT INTO users (KEY, user_name) VALUES ('cfd66ccc-d857-4e90-b1e5-df98a3d40cd6', 'jbellis') USING CONSISTENCY LOCAL_QUORUM AND TTL 86400;

CQL
SELECT
Devuelve las rows y columnas de la Familia de Columnas solicitada
SELECT <column_specification> FROM [<keyspace>.]<column_family> [USING CONSISTENCY <consistency_level>] [WHERE <row_specification> [AND <row_specification> [...]] [LIMIT <integer>] where <column_specification> is: <column_name> [, ...] | [FIRST <integer>] [REVERSED] { <start_of_range> .. <end_of_range> | * } | COUNT(*) and where <row_specification> is: KEY | <key_alias> { = | < | > | <= | >= } <key_value> KEY | <key_alias> IN (<key_value> [,...])

CQL
SELECT
Devuelve las rows y columnas de la Familia de Columnas solicitada
SELECT name, title FROM employees WHERE KEY IN (199, 200, 207); SELECT FIRST 3 REVERSED 'time199'..'time100' FROM events; SELECT COUNT(*) FROM users;

A diferencia que en el SELECT de SQL, en CQL no se garantiza que las columnas solicitadas existan y no dar error si esto ocurre. Simplemente se devolver el conjunto vaco de resultados.

CQL
TRUNCATE
Elimina todos los datos de una Familia de Columnas

TRUNCATE <column_family>;

TRUNCATE user_emails;

CQL
UPDATE
Actualiza una o varias columnas del row y la Familia de Columnas especicados
UPDATE <column_family> [ USING <write_option> [ AND <write_option> [...] ] ]; SET <column_name> = <column_value> [, ...] | <counter_column_name> = <counter_column_name> {+ | -} <integer> WHERE <row_specification>; where <write_option> is: USING CONSISTENCY <consistency_level> TTL <seconds> TIMESTAMP <integer> and where <row_specification> is: KEY | <key_alias> = <key_value> KEY | <key_alias> IN (<key_value> [,...])

CQL
UPDATE
Actualiza una o varias columnas del row y la Familia de Columnas especicados
UPDATE users USING CONSISTENCY QUORUM SET 'state' = 'TX' WHERE KEY IN (88b8fd18-b1ed-4e96-bf79-4280797cba80, 06a8913c-c0d6-477c-937d-6c1b69a95d43, bc108776-7cb5-477f-917d-869c12dfffa8); UPDATE users USING CONSISTENCY QUORUM SET 'name' = 'John Smith', 'email' = 'foo@bar.com' WHERE user_uuid = 88b8fd18-b1ed-4e96-bf79-4280797cba80; UPDATE page_views USING CONSISTENCY QUORUM AND TIMESTAMP=1318452291034 SET 'index.html' = 'index.html' + 1 WHERE KEY = 'www.cosasquecontar.com';

CQL
USE
Conecta la sesin actual con el Keyspace especicado

USE <keyspace_name>;

USE demo;

Conexin y acceso desde lenguajes de alto nivel

Se ofrecen dos formas de acceder al cluster de Cassandra. Mediante el terminal usando la lnea de comandos prompt. Mediante lenguajes de alto nivel mediante libreras CLI.

Conexin y acceso desde lenguajes de alto nivel


Acceso desde el prompt cassandra-cli. >./bin/cassandra-cli

cqlsh. >./bin/cassandra-cli Intrprete de CQL. Precisa de Python para funcionar.

Conexin y acceso desde lenguajes de alto nivel

Lenguajes de alto nivel soportados:


Python Java (Incluido Driver) Scala Node.js (Incluido Driver) Clojure .NET Ruby (Incluido Driver) PHP (Incluido PDO Driver) Perl C++ Haskel

La mayor parte son Frameworks de terceros.

Aplicacin de ejemplo sobre Cassandra


Modelo a desarrollar

Aplicacin de ejemplo sobre Cassandra


Estructura de BD Cassandra
Se crea el Keyspace que contendr la aplicacin

KEYSPACE ejemplo;

Aplicacin de ejemplo sobre Cassandra


Estructura de BD Cassandra
Por cada clase del modelo UML se crea una Familia de Columas ColumnFamily Usuario; ColumnFamily Tweet; Por norma general, cada relacin que genere una lista de objetos (i.e. relaciones 0..n, 1..n, n..m) se crea una Familia de Columnas donde se alojarn referencias a cada objeto de la lista. Ser indexado por la KEY del objeto principal. ColumnFamily Following; ColumnFamily Followers; ColumnFamily UserTweets;

Aplicacin de ejemplo sobre Cassandra


Estructura de BD Cassandra
Por cada clase del modelo UML se crea una Familia de Columas ColumnFamily Usuario; ColumnFamily Tweet; Cuando una clase UML tiene como destino claro realizar bsquedas (por ejemplo, una clase PalabrasClave donde no hay ms de un atributo) no hace falta crear una segunda familia de columnas. ColumnFamily Following; ColumnFamily Followers; ColumnFamily UserTweets;

Aplicacin de ejemplo sobre Cassandra


Estructura de BD Cassandra

La creacin de ndices secundarios no es recomendable salvo que sea estrictamente necesario para realizar bsquedas. Las KEY no hay que denirlas.

Aplicacin de ejemplo sobre Cassandra


Estructura de BD Cassandra
ColumnFamily Usuario;
Usuario = { 'roviyo': { 'password': '12345', 'email': 'roviyo@hotmail.com' }, 'pleys : { 'password': 'abc123', 'email': 'pleys@gmail.com' }, ... }

Aplicacin de ejemplo sobre Cassandra


Estructura de BD Cassandra
ColumnFamily Tweet;

Tweet = { '7561a442-24e2-11df-8924-001ff3591711': { 'owner': 'roviyo', 'body': 'hola mundo, esto es un tweet', }, }

Aplicacin de ejemplo sobre Cassandra


Following = { 'roviyo': { # follow KEY: timestamp en que fue aadida a la lista 'pleys': '1267413962580791', 'joan': '1267413990076949', 'bob23' : '1267414008133277', ... }, ... } Followers = { 'roviyo': { # follow KEY: timestamp en que fue aadida a la lista 'larry': '1267413962580791', 'curly': '1267413990076949' }, ... } UserTweets = { 'roviyo': { # tweet KEY: timestamp en que fue aadido a la lista '7561a442-24e2-11df-8924-001ff3591711': '1267413962580791', '7561a442-24e2-11df-8924-001ff3110091': '1267413990076949' }, ... }

Estructura de BD Cassandra

Bibliografa y Referencias
http://www.datastax.com/cassandrausers Cassandra Users, Datastax http://www.nosqldatabases.com/main/tag/ avinash-lakshman - The Origins of Cassandra http://www.datastax.com/docs/1.0/references/ cql/index - CQL Language Reference http://www.ietf.org/rfc/rfc4122.txt - RFC-4122: A Universally Unique IDentier (UUID)

Ejercicio
Realizar el diagrama UML y el diseo del schema Cassandra en JSON del siguiente problema. Se precisa de un pequeo blog de noticias. El blog puede contener a varios autores. Cada autor tiene un nombre, un nombre de usuario, una cuenta de twitter y una descripcin. Las noticias tienen un ttulo, un cuerpo y una fecha de publicacin. Son publicadas por un autor. Pueden contener o no, una lista de tags. Los visitantes del blog pueden comentar las noticias. Cada comentario contiene un nombre (escrito por el visitante al enviar el comentario) y un cuerpo.