Está en la página 1de 85

1

Bases de Datos No Relacionales (NoSQL)


4 de Julio de 2012
Red de Innovacin y Transferencia en Gestin de Datos
Fundacin Universidad Rey Juan Carlos, Plaza Manuel Becerra,14, Madrid

Dr. Diego Lz. de Ipia Glz. de Artaza
DeustoTech-INTERNET2, DeustoTech Deusto Institute of Technology, Universidad de Deusto
dipina@deusto.es
http://paginaspersonales.deusto.es/dipina
http://www.morelab.deusto.es
2
Infraestructura Virtualizada:
Cloud Computing
Un paradigma de computacin emergente donde los datos y servicios
residen en centros de datos muy escalables que pueden ser accedidos
ubicuamente desde cualquier dispositivo conectado a Internet
1

Merrill Lynch:
Cloud computing market
opportunity by 2011 =
$95bn in business and
productivity apps +
$65bn in online advertising =
$160bn
(1) Source: IBM
3
Cloud Computing es
capacidad computacional y
almacenamiento virtualizada expuesta
mediante infraestructura agnstica a la
plataforma y accedida por Internet
Recursos IT compartidos en demanda, creados y
eliminados eficientemente y de modo escalable a
travs de una variedad de interfaces programticos
facturados en base a su uso

4
Evolucin de Tecnologas de Cloud
Computing
Maduracin de tecnologa de virtualizacin
La virtualizacin permite nubes de computacin
Las nubes de computacin demandan nubes de
almacenamiento
Las nubes de almacenamiento y computacin crean
infraestructura cloud
La infraestructura cloud da lugar a plataformas y aplicaciones
cloud
Diferentes tipos de cloud dan lugar a Cloud Aggregators
Nichos de requisitos dan lugar a Cloud Extenders

5
Arquitectura Cloud Computing
6
Introduccin a NoSQL
NoSQL es un trmino utilizado para describir un
subconjunto de bases de datos que difiere en varios
modos de bases de datos tradicionales (RDBMS).
No tienen schemas, no permiten JOINs, no intentan
garantizar ACID y escalan horizontalmente
El trmino fue acuado en 1998 por Carlo Strozzi y
resucitado en 2009 por Eric Evans
El propio Evans sugiere mejor referirse a esta familia de
BBDD de nueva generacin como Big Data
7
Introduccin a NoSQL
NoSQL "not only SQL es una categora general
de sistemas de gestin de bases de datos que difiere
de modelo relacionales clsicos (RDBMS) en
diferente modos:
Estos datastores no requieren esquemas de informacin
fijas
Evitan las operaciones JOIN y escalan horizontalmente
De hecho, tanto las bases de datos NoSQL como las
relacionales son tipos de Almacenamiento
Estructurado
8
Introduccin a NoSQL
La principal diferencia radica en cmo guardan los datos (por
ejemplo, almacenamiento de un recibo):
En una RDBMS tendramos que partir la informacin en
diferentes tablas y luego usar un lenguaje de programacin en la
parte servidora para transformar estos datos en objetos de la
vida real.
En NoSQL, simplemente guardas el recibo:
NoSQL es libre de schemas, t no diseas tus tablas y
su estructura por adelantado
NoSQL no es la panacea!!!
Si tus datos son relacionales, quedarte con tu RDBMS sera la opcin
correcta
9
El teorema CAP
Teorema de Brewer: es imposible para un sistema computacional
distribuido ofrecer simultneamente las siguientes tres garantas:
Consistencia todos los nodos ven los mismos datos al mismo tiempo
Disponibilidad (Availability) garantiza que cada peticin recibe una
respuesta acerca de si tuvo xito o no
Tolerancia a la particin (Partition) el sistema continua funcionando a pesar
de la prdida de mensajes
Equivalente a:
You can have it good, you can have it fast, you can have it cheap: pick two.
10
Transacciones BASE
Acrnimo anlogo a ACID para NoSQL que prima disponibilidad
frente a consistencia:
Basically Available,
Soft state,
Eventually Consistent
Caractersticas:
Consistencia dbil stale data OK
Prima la disponibilidad
Best effort
Respuestas aproximadas OK
Agresivo (optimista)
Ms sencillo y ms rpido
Comparativa en: http://queue.acm.org/detail.cfm?id=1394128
11
Por qu NoSQL?
Tendencia 1: Tamao
Hemos creado ms datos en los ltimos dos aos que en todos los
aos anteriores Exabytes (10
18
) por ao
Tendencia 2: Conectividad
Los datos estn cada vez ms entrelazados y conectados
De documentos de texto a Wikis a RDF a grafos gigantes conectados
Tendencia 3: Datos semi-estructurados
Los datos son cada vez ms desestructurados
Tendencia 4: Arquitectura
El software orientado a servicios actual donde cada servicio tiene su
back-end
12
RDBMS vs. NoSQL
Las bases de datos relacionales tradicionales nos permiten definir la estructura de
un esquema que demanda reglas rgidas y garantizan ACID:
Atomicity
Consistency
Isolation
Durability
Las aplicaciones web modernas presentan desafos muy distintos a las que
presentan los sistemas empresariales tradicionales (e.j. sistemas bancarios):
Datos a escala web
Alta frecuencia de lecturas y escrituras
Cambios de esquema de datos frecuentes
Las aplicaciones sociales (no bancarias) no necesitan el mismo nivel de ACID
Algunas de las opciones de NoSQL actualmente disponibles son: Cassandra,
MongoDB, Jackrabbit , CouchDB, BigTable y Dynamo


13
Arquitectura de las BBDD NoSQL
A menudo ofrecen slo garantas de consistencia
dbiles, como por ejemplo eventual consistency, o
transacciones restringidas a elementos de datos
simples
Emplean una arquitectura distribuida, donde los
datos se guardan de modo redundante en distintos
servidores, a menudo usando tablas hash
distribuidas
Suelen ofrecer estructuras de datos sencillas como
arrays asociativos o almacenes de pares clave-valor
14
Taxonoma de soluciones NoSQL
Los principales tipos de BBDD de acuerdo con
su implementacin son los siguientes:
Almacenes de Clave-Valor
Almacenes de Familia de Columnas
Almacenes de documentos
Almacenes de Grafos

15
Caractersticas BBDD
orientadas a Clave-Valor
Su precursor fue Amazon Dynamo
Basadas en DHT (Distributed Hash Tables)
Modelo de datos: coleccin de pares
clave/valor
Ejemplos: Dynamite, Voldemort, Tokyo


16
Caractersticas BBDD
orientadas a Columnas
Su precursor es Google BigTable
Modelo de datos: familia de columnas, esto es, un modelo
tabular donde cada fila puede tener una configuracin
diferente de columnas
Cada clave est asociada con varios atributos (columnas)
Ejemplos: HBase, Hypertable, Cassandra, Riak
Buenas en:
Gestin de tamao
Cargas de escrituras masivas orientas al stream
Alta disponibilidad
MapReduce

17
Caractersticas BBDD
orientadas a Documentos
La precursora fue Lotus Notes
Modelo de datos: colecciones de documentos que
contienen colecciones de claves-valor
Guardan datos semi-estructurados: JSON
Ejemplos: CouchDB, MongoDB
Buenas en:
Modelado de datos natural
Amigables al programador
Desarrollo rpido
Orientas a la web: CRUD

18
Caractersticas Bases de
Datos Basadas en Grafos
Inspiradas por Euler y la teora de grafos
Modelo de datos: nodos, relaciones con pares
clave valor en ambos
No son exactamente NoSQL
Problemas para cumplir las propiedades CAE de
NoSQL (Cost-efficiency, High Availability y
Elasticity)
Ejemplos: AllegroGraph, VertexBD, Neo4j
19
Apache Cassandra
Es un almacn altamente escalable, eventualmente
consistente y distribuido de estructuras clave-valor.
Iniciado por Facebook
Cdigo abierto
Proyecto apache
Licencia: Apache License 2.0
Escrito en Java
Multiplataforma
Versin actual: 1.0.9
Web: http://cassandra.apache.org/
Documentacin: http://www.datastax.com/docs/1.0/index

20
Quin usa Apache Cassandra?
Algunos usuarios famosos de Cassandra son:
Digg
Facebook
Twitter
Rackspace
SimpleGEO

21
Ventajas de Cassandra para
desarrolladores Web
Cassandra est desarrollada para ser un servidor distribuido, pero puede tambin
ejecutarse como un nodo simple:
Escalabilidad horizontal (aade nuevo hardware cuando sea preciso)
Rpidas respuestas aunque la demanda crezca
Elevadas velocidades de escritura para gestionar volmenes de datos incrementales
Almacenamiento distribuido
Capacidad de cambiar la estructura de datos cuando los usuarios demandan ms
funcionalidad
Una API sencilla y limpia para tu lenguaje de programacin favorito
Deteccin automtica de fallos
No hay un punto de fallo nico (cada nodo conoce de los otros)
Descentralizada
Tolerante a fallos
Permite el uso de Hadoop para implementar Map Reduce
Hinted hand off

22
Desventajas de Cassandra
Hay algunas desventajas que un sistema de
almacenamiento tan escalable ofrece en
contrapartida:
No hay joins (a cambio de ms velocidad)
No permite ordenar resultados en tiempo de
consulta
No tiene SQL
Pero desde la versin 0.8 tenemos CQL

23
Instalacin de Cassandra
Requisitos:
Java 1.6 en adelante
Las ltimas versiones estables disponibles en:
http://cassandra.apache.org/download/
Documentacin en:
Cassandra Wiki: GettingStarted,
http://wiki.apache.org/cassandra/GettingStarted

24
Modelo de Datos en Cassandra
Est basado en un modelo orientado a columnas
Extiende el modelo clave-valor con dos niveles de
anidamiento
Su modelo de datos representa un mapa de 4 o 5
dimensiones.
El modo de referirse a un registro de datos es:
Un keyspace, una column family, una key, una super column
opcional, y una column.
Al final siempre tenemos un valor nico que es la columna.


25
Modelo de Datos en Cassandra
Diseado para datos distribuidos de modo escalable sacrifica ACID por ventajas
en rendimiento, disponibilidad y gestin operacional
Los modelos que se crean son desnormalizados:
Se suele crear una column family por cada consulta (query) a realizar
Varias filas en un column family suelen dar respuesta a una consulta
Los conceptos bsicos son:
Clster: son las mquinas que componen una instancia de Cassandra
Pueden contener varios Keyspaces
Keyspace: espacio de nombres para un conjunto de ColumFamily, asociado a una
aplicacin
Suele vincularse con una BBDD en el modelo relacional
ColumFamily: contienen varias columnas
Suelen vincularse con una tabla en el modelo relacional
SuperColumn: columnas que ellas mismas tienen sub-columnas
Column: compuestas de un nombre, valor y timestamp


26
KeySpaces
Un espacio de claves o KeySpace es un esquema de
alto nivel que contiene familias de columnas.
Supercolumn Family Estado de Usuario



Column Family Entradas en Twitter: tweets:
27
Resumen Modelo de Datos
28
Clster
Los datos en Cassandra se guardan en un
Clster o Ring donde se asignan datos a los
nodos dentro de un ring
Un nodo tiene rplicas para diferentes rangos de
datos
Si un nodo se cae su rplica puede responder
Un protocolo P2P hace que los datos se repliquen
entre nodos acorde con un
replication_factor
29
Ring, clster y el protocolo
Gossip
Cassandra usa un protocolo Gossip para permitir
comunicacin dentro de un ring, de tal modo que cada nodo
sabe de otros nodos
Permite soportar descentralizacin y tolerancia a la particin
Cassandra est diseada para ser distribuida en varias
mquinas que aparecen como una simple mquina a los ojos
de los clientes
La estructura ms externa de Cassandra es el cluster o ring
Un nodo tiene una rplica para diferentes rangos de datos, si algo va mal
una rplica puede responder
El parmetro replication_factor en la creacin de un KeySpace indica
cuntas mquinas en el clster recibirn copias de los mismos datos.
30
Configuracin de un Keyspace
Los atributos bsicos que puedes asociar a un
keyspace son:
Replication factor: cunto quieres pagar en rendimiento a
favor de consistencia
Replica placement strategy: indica cmo se colocan las
rplicas en el anillo: SimpleStrategy,
OldNetworkTopologyStrategy y NetworkTopologyStrategy
Revisar: http://answers.oreilly.com/topic/2408-replica-placement-
strategies-when-using-cassandra/
Column families: al menos una por Keyspace, es un
contenedor de filas, que contienen columnas

31
Configuracin de un Keyspace
Cassandra ofrece soporte para particionado distribuido de
datos
RandomPartitioner te da buen balanceo de carga
OrderPreservingPartitionioner te permite ejecutar consultas de
rangos, pero exige ms trabajo eligiendo node tokens
Ms info en: http://abel-perez.com/cassandra-partitioner-order-
preserving-partit
Cassandra tiene consistencia reconfigurable
http://www.datastax.com/docs/0.8/dml/data_consistency
Con Cassandra tienes que pensar en las consultas que quieres
ejecutar y luego realizar el modelo en torno a ellas
32
Diferencias entre un RDBMS y
Cassandra
No hay lenguaje de consulta, tiene una API accesible a travs de Thrift
Verdad a medias: si existe desde la versin 0.8 CQL
No hay integridad referencial, no hay joins, se puede emular almacenando claves a otras filas
en un column family
ndices secundarios en una tabla dan lugar a nuevos column families que mapean un campo a
la clave de la primera column family
Verdad a medias: desde Cassandra 0.7 se pueden crear ndices secundarios:
http://www.datastax.com/dev/blog/whats-new-cassandra-07-secondary-indexes
Ordenar es una decisin de diseo, las definiciones de familias de columnas incluyen un
elemento CompareWith
BytesType, UTF8Type, AsciiType, LongType, LexicalUUIDType, TimeUUIDType
Las filas son agrupadas y ordenadas (distribuidas en el cluster) por el Partitioner
RandomPartitioner, OrderPreservingPartitioner,
CollatingOrderPreservingPartitioner
Cassandra tiene mejor rendimiento con datos desnormalizados
Modelas las consultas y luego defines la estructura de datos a su alrededor
33
RDBS vs. KeySpace
34
Comandos CLI Bsicos
Para crear un KeySpace con el cliente cassandra-cli:
Una familia de columnas es algo as como una tabla
drop keyspace MyKeySpace;
create keyspace MyKeySpace;
use MyKeySpace;
create column family User;
describe MyKeySpace;
assume User keys as Ascii;
assume User comparator as Ascii;
set User['dipina']['lname']='Lopez-de-Ipina';
set User['dipina']['fname']='Diego';
set User['dipina']['email']='dipina@deusto.es';
count User['dipina'];
get User['dipina'];
del User['dipina']['email'];
del User['dipina'];
get User['dipina'];
35
Soporte Multi-lenguaje de
Cassandra
Cassandra utiliza la librera Thrift (http://thrift.apache.org/)
para proveer una API independiente del lenguaje de
programacin
Thrift API 1.0: http://wiki.apache.org/cassandra/API
Ejemplo en: http://wiki.apache.org/cassandra/ClientExamples
Thrift soporta un gran nmero de lenguajes incluyendo: C++,
Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,
JavaScript, Node.js, Smalltalk, y Ocaml
Hay muchas libreras clientes disponibles:
Pycassa para Python: http://pycassa.github.com/pycassa/index.html
Hector para Java: https://github.com/rantav/hector
36
Cassandra Query Language (CQL)
Cassandra ha sido accedido principalmente mediante Thrift una API RPC
que proporciona un denominador comn a clientes para lenguajes
especficos
Pero:
Thrift es de demasiado bajo nivel para ser usado de modo productivo o dar
soporte a nuevas funcionalidades como los ndices secundarios en 0.7 o los
contadores distribuidos en 0.8
CQL da respuesta a esto pasando todos los detalles de implementacin
complejos al servidor
Los clientes slo tienen que saber cmo interpretar objetos en un resultset
Documentacin:
http://www.datastax.com/dev/blog/what%E2%80%99s-new-in-cassandra-0-8-
part-1-cql-the-cassandra-query-language
http://www.datastax.com/docs/0.8/dml/using_cql#use-cql


37
Un poco de CQL
Ejemplos tomados de: http://www.datastax.com/dev/blog/what%E2%80%99s-new-in-cassandra-0-8-part-1-cql-the-
cassandra-query-language
cqlsh> CREATE KEYSPACE test with strategy_class = 'SimpleStrategy' and
strategy_options:replication_factor=1;
cqlsh> USE test;

cqlsh> CREATE COLUMNFAMILY users (
... key varchar PRIMARY KEY,
... full_name varchar,
... birth_date int,
... state varchar
... );

cqlsh> CREATE INDEX ON users (birth_date);
cqlsh> CREATE INDEX ON users (state);

cqlsh> INSERT INTO users (key, full_name, birth_date, state) VALUES ('bsanderson', 'Brandon
Sanderson', 1975, 'UT');
cqlsh> INSERT INTO users (key, full_name, birth_date, state) VALUES ('prothfuss', 'Patrick
Rothfuss', 1973, 'WI');
cqlsh> INSERT INTO users (key, full_name, birth_date, state) VALUES ('htayler', 'Howard Tayler',
1968, 'UT');

cqlsh> SELECT key, state FROM users;
key | state |
bsanderson | UT |
prothfuss | WI |
htayler | UT |

cqlsh> SELECT * FROM users WHERE state='UT' AND birth_date > 1970;
KEY | birth_date | full_name | state |
bsanderson | 1975 | Brandon Sanderson | UT |



38
Base de Datos orientada a
Documentos
Una base de datos orientada a documentos es un programa
diseado para almacenar, recuperar y gestionar informacin
semi-estructurada orientada a documentos:
Un documento encapsula informacin en un formato estndar (XML,
YAML, JSON o BSON):
Los documentos en una BBDD orientada a documentos son similares a
registros pero no requieren un esquema estndar con la mismas
secciones, huecos, partes, claves y similar
Los documentos suelen ser direccionables por una clave que los
representa unvocamente
Adems de la bsqueda por clave de documento, estas BBDD suelen
ofrecer una API o lenguaje de consultas que permite recuperar
documentos en base a sus contenidos
39
CouchDB
CouchDB es una base de datos open source
orientada a documentos, accesible mediante una API
RESTful que hace uso extensivo de JavaScript Object
Notation (JSON)
"Couch" es el acrnimo de"Cluster Of Unreliable
Commodity Hardware"
Su misin es ser muy escalable, con alta disponibilidad y robustez,
incluso cuando se ejecuta en hardware convencional
Creada como database of the Web
Django may be built for the Web, but CouchDB is built of the Web. Ive never
seen software that so completely embraces the philosophies behind HTTP.
CouchDB makes Django look old-school in the same way that Django makes
ASP look outdated.
Jacob Kaplan-Moss, Django developer
40
Caractersticas de CouchDB
CouchDB es una base de datos orientada a documentos JSON escrita en
Erlang.
Parte de la generacin de bases de datos NoSQL
Es un proyecto open source de la fundacin Apache
Motor de almacenamiento basado en B-tree
Es altamente concurrente, diseada para ser replicada horizontalmente, a
travs de varios dispositivos y tolerante a fallos.
Permite a las aplicaciones guardar documentos JSON a travs de una
interfaz RESTful
Utiliza map/reduce para indexar y consultar la base de datos
Permite escribir una aplicacin cliente que habla directamente va HTTP
con CouchDB sin necesidad de una capa servidora intermedia
Guarda datos en local en la propia mquina cliente para reducir latencia
Gestiona la replicacin a la nube por ti
41
CouchDB: BBDD orientada a documentos
Una BBDD document-oriented est compuesta de una serie de
documentos
Son libres de esquema; no existe un esquema definido a priori, antes de usar
la BBDD
Si un documento necesita un nuevo campo, puedes incluirlo, sin afectar a otros
documentos en la BBDD
CouchDB no tiene una funcionalidad de auto-increment o secuencia
Asigna un Universally Unique Identifier (UUID) a cada documento, haciendo
casi imposible que otra base de datos seleccione el mismo identificador
No soporta JOINs como las bases de datos relacionales
Una caracterstica denominada vista permite crear relaciones arbitrarias entre
documentos que no son definidas en las propias bases de datos.
CouchDB ofrece una alternativa a todos aquellos proyectos donde un
modelo orientado a documentos encaja mejor que una base de datos
relacional: wikis, blogs y sistemas de gestin documental
42
Ventajas de CouchDB
Documentos JSON todo lo que se guarda en CouchDB son simplemente
documentos JSON.
Interfaz RESTful desde la creacin a la replicacin a la insercin de
datos, toda la gestin de datos en CouchDB puede ser realizada va HTTP.
Replicacin N-Master puedes hacer uso de un nmero ilimitado de
masters, dando lugar a topologas de replicacin muy interesantes.
Escrita para ejecutarse offline CouchDB puede replicarse en dispositivos
(e.j. telfonos Android) que pueden quedarse sin conexin y gestionar
sincronizacin de datos cuando el dispositivo est online de nuevo
Filtros de replicado puedes filtrar de modo preciso los datos que quieres
replicar a distintos nodos.
http://wiki.apache.org/couchdb/Replication#Filtered_Replication

43
Conceptos clave en CouchDB:
Documentos
Las BBDD CouchDB guardan documentos nombrados de modo unvoco y
proporcionan una API RESTful JSON que permite a las aplicaciones leer y modificar
estos documentos
Cada documento puede tener campos no definidos en otros documentos:
Los documentos no estn asociados a un esquema de bases de datos estricto
Cada documento contiene metadatos (datos sobre datos) como el identificador
unvoco del documento (id) y su nmero de revisin (rev)
Los campos de un documento pueden ser de varios tipos como strings, nmeros,
booleanos, colecciones, etc.
Cuando se hacen cambios sobre un documento CouchDB se crea una nueva
versin del documento, denominado revisin
Se mantiene un historial de modificaciones gestionado automticamente por la BBDD
CouchDB no dispone de mecanismos de bloqueo (locking) ante escrituras

44
Conceptos clave en CouchDB:
Vistas
Son el mecanismo para aadir estructura a datos semi-
estructurados
El modelo de vistas en CouchDB usa JavaScript para
describirlas
Las vistas son el mtodo para agregar y realizar informes
sobre los documentos de un repositorio, siendo creados en
demanda para agregar y agregar documentos.
Las vistas se construyen dinmicamente y no afectan el
documento subyacente, puedes tener tantas
representaciones de vistas de los mismos datos como gustes.
45
Conceptos clave en CouchDB:
Vistas
CouchDB es desestructurado en naturaleza, adolece de un esquema estricto pero
provee beneficios en trminos de flexibilidad y escalabilidad, explotar sus datos en
aplicaciones reales a veces puede hacerse complicado
Los datos se guardan en un espacio de almacenamiento plano, algo as como un
repositorio de datos desnormalizados.
Proporciona un modelo de vistas para aadir estructura a los datos de modo que pueda
agregarse para aadir significado til
Las vistas se crean en demanda y son utilizadas para agregar, enlazar y reportar
sobre documentos en la base de datos
Se definen en documentos de diseo y pueden ser replicadas a travs de varias
instancias
Estos documentos de diseo contienen funciones JavaScript que pueden ejecutar
consultas mediante el concepto de MapReduce.
La funcin Map de la vista recibe un documento como argumento y realiza una
serie de clculos para determinar qu datos deberan ser disponibles en la vista
Si la vista tiene una funcin Reduce, es usada para agregar los resultados. A partir
de un conjunto de pares clave/valor devuelve un slo valor.

46
Ejemplo de Vista en CouchDB
map: function(doc) {
if (doc._attachments) {
emit("with attachment", 1);
}
else {
emit("without attachment", 1);
}
}

reduce: function(keys, values) {
return sum(values);
}
47
Conceptos clave en CouchDB:
Sin esquema
CouchDB est diseado para almacenar y reportar sobre
grandes volmenes de datos orientados a documentos semi-
estructurados.
Con CouchDB, no se impone ningn esquema, nuevos tipos
de documentos con distintos campos y significados se pueden
unir a los existentes.
El motor de vistas, apoyado en JavaScript, est diseado para
facilitar la gestin de nuevos tipos de documentos y variados
pero similares documentos.
48
Conceptos clave: Distribuida
CouchDB es un sistema distribuido de base de datos basado
en nodos
Un nmero variable de nodos CouchDB (servidores y clientes offline)
pueden tener copias de rplicas independientes de la misma BBDD,
donde las aplicaciones pueden tener interactividad completa con la
BBDD (consultar, aadir, editar y borrar)
Cuando vuelven a estar online o de modo planificado, los cambios de las
bases de datos son replicados bidireccionalmente.
CouchDB tiene gestin de conflictos incorporada de serie,
haciendo que el proceso de replicacin sea incremental y
rpido, copiando slo documentos y campos individuales
modificados desde la ltima replicacin.
Utiliza Multi-Version Concurrency Control (MVCC)
49
Gestin de Conflictos MVCC
Los documentos en CouchDB son versionados, de modo
similar a como se realiza en sistemas de control de versiones
como Subversion.
Si cambias un valor de un documento, realmente creas una
nueva versin del mismo que coexiste con la versin antigua
Las peticiones se ejecutan en paralelo haciendo que los
servidores permitan una alta concurrencia
Una peticin de lectura ver siempre la versin ms reciente de la
BBDD
50
Detalles tcnicos
Un servidor CouchDB gestiona bases de datos bajo un
nombre, que almacenan documentos:
Cada documento tiene un nombre nico en la BBDD y CouchDB
proporciona una API HTTP RESTful para leer y modificar (aadir, editar
y borrar) documentos de la BBDD.
Los documentos son la unidad de datos primaria en CouchDB y
consisten de un nmero variable de campos y adjuntos
Las modificaciones sobre documentos (aadir, editar, borrar) son del
todo o de nada, o se modifican completamente o fallan
completamente.
El modelo de modificacin de documentos de CouchDB es optimista y
no hace uso de locks.
Ms detalles genricos en:
http://CouchDB.apache.org/docs/overview.html
51
La API RESTful JSON
CouchDB ofrece una API como mecanismo para recuperar datos de una BBDD.
Donde siguiendo la convencin REST: (si no aparece la sabes para crear POST y sino PUT)
POST crea un nuevo registro
GET lee registros
PUT actualiza un registro
DELETE borra un registro
Esta API es accesible va HTTP GET y POST y retorna datos en el formato de objetos
JavaScript mediante JSON.
Una ventaja de este enfoque es que puede usarse una framework AJAX como Prototype
o jQuery para crear una aplicacin web, sin necesidad de hacer uso de un lenguaje de
parte servidora
La herramienta de lnea de comando CURL pueden ser usada como cliente de lnea de
comandos HTTP:
Descargable de: http://curl.haxx.se/
Permite realizar peticiones GET, POST, PUT, y DELETE, mostrando la respuesta HTTP recibida del
servidor web
52
Probando la API RESTful de
CouchDB con curl
Podemos borrar una base de datos con el siguiente comando:
$ curl -uadmin:enpresadigitala -X DELETE
http://127.0.0.1:5984/vegetables
Respuesta: {"ok":true}
Para crear un documento:
$ curl -uadmin:enpresadigitala -X PUT
http://127.0.0.1:5984/fruit/apple -H "Content-Type:
application/json" -d {}
Respuesta: {"ok":true,"id":"apple","rev":"1-
967a00dff5e02add41819138abb3284d"}
Para recuperarlo:
$ curl -X GET http://127.0.0.1:5984/fruit/apple
Respuesta: {"_id":"apple","_rev":"1-967a00dff5e02add41819138abb3284d"}
Para recuperar informacin de la BBDD:
$ curl -X GET http://127.0.0.1:5984/fruit
Respuesta:
{"db_name":"fruit","doc_count":1,"doc_del_count":0,"update_seq":1,"p
urge_seq":0,
"compact_running":false,"disk_size":4179,"instance_start_time":"1321
991208171560","disk_format_version":5,"committed_update_seq":1}
53
Programando CouchDB
Gracias a la API RESTful, los desarrolladores pueden
conectarse a CouchDB usando cualquier software
que soporte HTTP
La mayora de los lenguajes modernos ofrecen algn
tipo de interfaz HTTP, implicando que CouchDB
puede ser usada en cualquier proyecto de desarrollo.
Revisar la siguiente pgina para diferentes clientes
programticos a CouchDB:
http://wiki.apache.org/CouchDB/Related_Projects
54
Vista de un documento en Futon
55
Documentos de Diseo en
CloudDB
Los documentos de diseo son un tipo especial de documento
en CouchDB que contiene cdigo de aplicacin:
Vistas MapReduce, validaciones, funciones show, list y update
Se suele crear un documento de diseo por cada aplicacin
El documento de diseo es un documento CouchDB con un ID
que comienza con _design/:
Se replica como otros documentos en la BBDD y soporta gestin de
conflictos a travs del parmetro rev
CouchDB mira las vistas y otras funciones de aplicacin en l
Los contenidos estticos de la aplicacin aparecen como
_attachments en el documento de diseo

56
Estructura interna de un
Documento de Diseo
Estn compuestos de:
Funciones de validacin
Definicin de vistas
Funciones show, list y update
Attachments
Una BBDD CouchDB puede tener varios
documentos de diseo.
_design/calendar
_design/contacts
Para recuperar un documento de
diseo haz un GET con el siguiente
patrn de URL:
http://localhost:5984/mydb/
_design/calendar
http://127.0.0.1:5984/mydb/
_design/contacts
57
Replicacin en CouchDB
La replicacin sincroniza dos copias de la misma
BBDD, permitiendo que los usuarios tengan baja
latencia de acceso a datos independientemente de
su localizacin
La replicacin consiste en enviar una peticin HTTP a un
servidor CouchDB incluyendo una BBDD de origen y otra
de destino, haciendo que CouchDB enve los cambios del
origen al destino:
POST /_replicate HTTP/1.1
{"source":"database","target":http://example.
org/database}
58
Gestin de Conflictos
Cuando replicas dos BBDD en CouchDB y se identifican
conflictos, CouchDB los seala en los documentos afectados
con el atributo "_conflicts":true
La versin que es seleccionada como ltima es la versin ganadora.
La revision perdedora es almacenada como versin anterior.
CouchDB no hace un merge de las revisiones conflictivas.
Tu aplicacin es la que resuelve programticamente los conflictos
La replicacin garantiza que los conflictos se detecten y que cada
instancia de CouchDB haga la misma seleccin respecto a ganadores y
perdedores, independientemente de las instancias que existan.
59
CouchApp
A CouchApp es una framework para la creacin de
aplicaciones JavaScript con CouchDB
Como son aplicaciones JavaScript y HTML5 son servidas
directamente desde CouchDB
Como efecto lateral consigues la flexibilidad y escalabilidad de
CouchDB
http://couchapp.org/
Para crear una CouchApp, necesitas un modo para meter
JavaScript, HTML y otros recursos en CouchDB
La herramienta CouchApp escrita en Python es la recomendada para
generar plantillas de cdigo en tu aplicacin y volcarlos a una instancia
de CouchDB:
http://couchapp.org/page/couchapp-python

60
CouchApp
CouchApp te simplifica la labor de crear aplicaciones web a
partir de CouchDB:
Fragmenta un documento de diseo en un conjunto de directorios y
ficheros del sistema local, representando views, shows, validations,
attachments, etc. que sern enviados al servidor CouchDB
Una aplicacin de Couch, CouchApp, sigue ms o menos el
patrn de diseo Modelo/Vista/Controlador:
CouchDB es el Modelo
El rbol DOM representando el HTML mostrado al usuario sera la vista
El JavaScript sera el Controller
61
MongoDB
Similar a CouchDB
Pretende combinar lo mejor de los almacenes
clave/valor, bases de datos de documentos y RDBMS
Hace uso de JSON y tiene su propio lenguaje de
consultas
Implementada en C++
Usada por SourceForge, Bit.ly, Foursquare o GitHub
URL: http://www.mongodb.org/
62
MongoDB
MongoDB (de la palabra en ingles humongous que
significa enorme) es un sistema de base de datos
NoSQL orientado a documentos
MongoDB guarda estructuras de datos en
documentos tipo BSON (Binary JSON (JSON Binario)
con un esquema dinmico , haciendo que la
integracin de los datos en ciertas aplicaciones sea
mas fcil y rpida.
63
Caractersticas Principales
Consultas Ad hoc
MongoDB soporta la bsqueda por campos, consultas de rangos y expresiones regulares. Las consultas pueden devolver un campo
especfico del documento pero tambin puede ser una funcin JavaScript definida por el usuario.
Indexacin
Cualquier campo en un documento de MongoDB puede ser indexado, al igual que es posible hacer ndices secundarios. El concepto de
ndices en MongoDB es similar a los encontrados en base de datos relacionales.
Replicacin
MongoDB soporta el tipo de replicacin maestro-esclavo. El maestro puede ejecutar comandos de lectura y escritura. El esclavo puede copiar
los datos del maestro y slo se puede usar para lectura o para copia de seguridad, pero no se pueden realizar escrituras. El esclavo tiene la
habilidad de poder elegir un nuevo maestro en caso del que se caiga el servicio con el maestro actual.
Balanceo de carga
MongoDB se puede escalar de forma horizontal usando el concepto de shard.

El desarrollador elije una llave shard, la cual determina como sern distribuidos los datos en una coleccin. los datos son divididos en rangos
(basado en la llave shard) y distribuidos a travs de mltiples shard.
Un shard es un maestro con uno o ms esclavos.
MongoDB tiene la capacidad de ejecutarse en mltiple servidores, balanceando la carga y/o duplicando los datos para poder mantener el
sistema funcionando en caso que exista un fallo de hardware.
Almacenamiento de archivos
MongoDB puede ser utilizado con un sistema de archivos, tomando la ventaja de la capacidad que tiene MongoDB para el balanceo de carga
y la replicacin de datos utilizando mltiples servidores para el almacenamiento de archivos.
Esta funcin (que es llamada GridFS ) est incluida en los drivers de MongoDB y disponible para los lenguajes de programacin que soporta
MongoDB.
Agregacin
La funcin MapReduce puede ser utilizada para el procesamiento por lotes de datos y operaciones de agregacin. Esta funcin permite que
los usuarios puedan obtener el tipo de resultado que se obtiene cuando se utiliza el comando SQL group-by.
Ejecucin de JavaScript del lado del servidor
MongoDB tiene la capacidad de realizar consultas utilizando JavaScript, haciendo que estas sean enviadas directamente a la base de datos
para ser ejecutadas.

64
Manipulacin de Datos:
colecciones y documentos
MongoDB guarda la estructura de los datos en documentos tipo JSON con
un esquema dinmico llamado BSON, lo que implica que no existe un
esquema predefinido.
Los elementos de los datos son llamados documentos y se guardan en
colecciones
Una coleccin puede tener un nmero indeterminado de documentos
Las colecciones son como tablas y los documentos como filas
Cada documento en una coleccin puede tener diferentes campos.
La estructura de un documento es simple y compuesta por key-value
pairs parecido a las matrices asociativas en un lenguaje de programacin
Como valor se pueden usar nmeros, cadenas o datos binarios como
imgenes o cualquier otro key-value pairs.

65
Ejemplo de documento
en MongoDB
{
"_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
"Last Name": "PELLERIN",
"First Name": "Franck",
"Age": 29,
"Address": {
"Street": "1 chemin des Loges",
"City": "VERSAILLES"
}
}
66
Documentacin e instalacin
La documentacin completa de MongoDB puede encontrarse en:
http://docs.mongodb.org/manual/
Instrucciones para instalar MongoDB en Windows:
Descargar de: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-
windows/
Crear directorio de datos: mkdir data/db
Ejecutar el comando: mongod.exe --dbpath ..\data\db
Ejecutar el cliente de mongo y los siguientes comandos en JavaScript:
C:\Programming\utilities\mongodb-win32-x86_64-2.0.6\bin>mongo
MongoDB shell version: 2.0.6
connecting to: test
> db.test.save( {a:1} )
> db.test.find()
{ "_id" : ObjectId("4fe6e41b184d3a26629be9b6"), "a" : 1 }
>
67
Usando MongoDB
mongo es un shell JavaScript completo, cualquier funcin JavaScript, sintxis o clase puede
usarse en el shell
mydb
j = { name : "mongo" };
t = { x : 3 };
db.things.save(j);
db.things.save(t);
db.things.find();
for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i});
db.things.find();
// Iterate through the remaining items
it
// Store the cursor of the DB in a variable
var cursor = db.things.find();
while (cursor.hasNext()) printjson(cursor.next());
// Use functional features of JavaScript
db.things.find().forEach(printjson);
// cursos like an array
var cursor = db.things.find();
printjson(cursor[4]);
68
Documentos de consulta
Documentos que indican el patrn de claves y valores que deben ser
localizados
Ejemplos:
SELECT * FROM things WHERE name="mongo
db.things.find({name:"mongo"}).forEach(printjson);
SELECT * FROM things WHERE x=4
db.things.find({x:4}).forEach(printjson);
SELECT j FROM things WHERE x=4
db.things.find({x:4}, {j:true}).forEach(printjson);
Recuperar el primer elemento que cumple alguna restriccin:
printjson(db.things.findOne({name:"mongo"}));
Limitar el nmero de resultados:
db.things.find().limit(3);
69
Neo4j
A graph database uses nodes, relationships between nodes and key-value
properties instead of tables to represent information. This model is
typically substantially faster for associative data sets and uses a schema-
less, bottoms-up model that is ideal for capturing ad-hoc and rapidly
changing data [Emil Eifrem founder of the Neo4j]
Open source
AGPLv3
Licencia comercial dual disponible
70
Neo4j: Bases de Datos de Grafos
Una coleccin de nodos (cosas) y aristas (relaciones) que
conectan pares de nodos
Se asocian propiedades (key-value pairs) sobre nodos y
propiedades
Las relaciones conectan dos nodos y tanto nodos como
relaciones pueden alojar un nmero arbitrario de pares
clave/valor.
Puede ser considerado como un key-value store, con soporte
completo para relaciones:
http://neo4j.org/
Sin esquemas, diseo de modelo de datos de abajo a arriba


71
Caractersticas de Neo4j
Licencia dual: abierta y comercial
Apropiada para casos de uso de la web como etiquetado, anotaciones de
metadatos, redes sociales, wikis y otros conjuntos de datos jerrquicos o
en forma de red
Modelo de datos flexible consistente de nodos, relaciones y propiedades
Tiene un rendimiento de 1000x que RDBMS
Almacenamiento en disco nativo optimizado para guardar estructuras de
grafos para mximo rendimiento y escalabilidad
Recorre grafos de profundidad 1000 a velocidad de milisegundos.
Mxima escalabilidad, puede gestionar billones de grafos de
nodos/relaciones/propiedades en una sola mquina y puede ser
distribuido
Completamente transaccional
72
Modelo de datos
Un Grafoguarda datos en Nodos que tienen Propiedades
El grafo ms sencillo es un nodo con una coleccin de pares clave-valor o
propiedades
Una propiedad consta de una clave de tipo string que apunta a un valor
primitivo o en forma de coleccin.
Los Nodos se organizan en Relaciones que tambin tienen
Propiedades
Las relaciones hacen que los Nodos se conviertan en estructuras arbitrarias
Un Traversal navega un Grafo; identifica Caminos que ordenan
Nodos
Permite encontrar respuestas a preguntas como qu msica tienen mis
amigos que yo no tengo
Un ndice mapea de Propiedadesbien a Nodos o a Relaciones
Permite encontrar un nodo o relacin en funcin de una propiedad
73
Modelo de datos
Neo4j es una base de datos de grafos diseada y construida
para ser robusta y optimizada para grafos en vez de tablas
Aporta la expresividad del grafo con la robustez de una BBDD
A Graph Database manages a Graph and also manages
related Indexes
74
Arquitectura lgica de Neo4j
Core API
REST API
JVM Language Bindings
Traversal Framework
Caches
Memory-Mapped (N)IO
Filesystem
Java Ruby Clojure
Graph Matching
75
Cypher: lenguaje de consultas
Es el SQL for graphs y devuelve resultados en forma tabular
Cypher permite la consulta expresiva y eficiente de un almacn de grafos sin necesidad de
escribir cdigo para recorridos (traverse)
De momento es slo un lenguaje de consultas
Permite agregar, ordenar y establecer lmites en los resultados
Hace uso de palabras clave como WHERE y ORDER BY, inspirado por SQL
Tambin adopta las capacidades de aplicar expresiones regulares en las consultas como SPARQL.
Documentacin: http://docs.neo4j.org/chunked/1.4/cypher-query-lang.html
76
Programacin de Neo4j
Neo4j tiene una librera java que te permite
empotrarla en tu aplicacin Java
Documentacin.
http://docs.neo4j.org/chunked/milestone/tut
orials-java-embedded-hello-world.html
77
Persistencia Polglota
78
NoSQL or not NoSQL?
En NoSQL, generalmente los datos son recuperados de manera mucho ms rpida
que en un RDBMS, sin embargo las consultas que se pueden hacer son ms
limitadas y requieren trasladar complejidad a la aplicacin
RDBMS para escribir usan locks y redos para garantizar ACID, pero NoSQL no
soporta a menudo Atomicy, Consistency o Durability
Si quieres soporte transaccional integral debes seguir usando RDBMS
Aplicaciones que generan informes emplean consultas complejas para las que
NoSQL no es muy adecuado
Aplicando MapReduce, las bases de datos NoSQL pueden paralelizar operaciones
complejas como agregaciones estadsticas, filtros, agrupaciones o ordenacin.
Desde un punto de vista de sistemas deberamos considerar la combinacin de
SQL y NoSQL:
LinkedIn comenz slo con un RDBMS, pero desarroll su propia BBDD NoSQL
(Voldemort)
Facebook tienen una arquitectura hbrida con Memcached y MySQL junto a un OLTP
(envo de mensajes al Wall), y Cassandra para la bsqueda en la bandeja de entrada
79
NoSQL or not NoSQL?
Los principales problemas de NoSQL son:
Su complejidad:
Instalacin
Consultas (comprender bien MapReduce)
Los modelos de datos usados
Su falta de madurez
Dnde usarlas?
Datos sociales
Procesado de datos (Hadoop)
Bsqueda (Lucene)
Caching (Memcache)
Data Warehousing
Qu problema quieres resolver?
Transacciones
Grandes volmenes de datos (Exabytes)
Estructura de los datos
80
Conclusin
Las BBDD NoSQL son una clara alternativa a los RDBMS
Sobre todo para algunas aplicaciones sociales y web que requieren
elevada escalabilidad
No son idneas para todo, de hecho en la mayora de los
casos las RDBMS deberan seguir siendo la primera opcin:
La capacidad de hacer JOIN y las garantas ACID son muy importantes
para muchas aplicaciones
Es muy posible que los RDBMS actuales evolucionen
para incorporar capacidades de NoSQL
81
Referencias
Cassandra
NoSQL Not only SQL (Introduction to Apache
Cassandra)
http://www.scriptandscroll.com/3508/technology/nosql-not-only-
sql-introduction-to-apache-cassandra/#.TtonPmMk6nA
DataSax company:
http://www.datastax.com/about-us/about-datastax
Getting started with CQL:
http://www.datastax.com/docs/0.8/dml/using_cql
http://cassandra.apache.org/
82
Referencias
CouchDB
Exploring CouchDB, Joe Lennon,
http://www.ibm.com/developerworks/opensource/library/os-CouchDB/index.html
CouchDB tutorial
http://net.tutsplus.com/tutorials/getting-started-with-couchdb/
CouchDB for geeks:
http://www.slideshare.net/svdgraaf/CouchDB-for-geeks?from=share_email
CouchDB site:
http://CouchDB.apache.org/
CouchApp.org: The Do It Yourself Evently Tutorial
http://couchapp.org/page/evently-do-it-yourself
CouchApp.org: What the HTTP is CouchApp?
http://wiki.couchapp.org/page/what-is-couchapp
Tutorial: Using JQuery and CouchDB to build a simple AJAX web application
http://blog.edparcell.com/using-jquery-and-CouchDB-to-build-a-simple-we
CouchApp site:
http://couchapp.org/page/getting-started

83
Referencias
Neo4j
Pgina web de Neo4j: http://neo4j.org/
Neo4j: a NOSQL overview and the benefits of graph
databases:
http://www.slideshare.net/emileifrem/nosql-east-a-nosql-
overview-and-the-benefits-of-graph-databases
Neo4j - A Graph Database That Kicks Buttox
http://highscalability.com/neo4j-graph-database-kicks-buttox/
Graph databases and Neo4j
http://www.slideshare.net/thobe/nosqleu-graph-
databases-and-neo4j

84
Referencias
NoSQL vs. RDBMS
The future is: Polyglot Persistence
http://martinfowler.com/articles/nosql-intro.pdf
NoSQL databases
http://www.slideshare.net/marin_dimitrov/nosql-databases-3584443
Riyaz -- Thanks for the question regarding "NOSQL vs. RDBMS databases",
version 10r2
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2664632
900346253817
NoSQL or not NoSQL?
http://www.slideshare.net/ruflin/nosql-or-not-nosql/download
Comparativa de diferentes soluciones NoSQL:
http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
SQL vs. NoSQL
http://www.linuxjournal.com/article/10770

85
Bases de Datos No Relacionales (NoSQL)
4 de Julio de 2012
Red de Innovacin y Transferencia en Gestin de Datos
Fundacin Universidad Rey Juan Carlos, Plaza Manuel Becerra,14, Madrid

Dr. Diego Lz. de Ipia Glz. de Artaza
DeustoTech-INTERNET2, DeustoTech Deusto Institute of Technology, Universidad de Deusto
dipina@deusto.es
http://paginaspersonales.deusto.es/dipina
http://www.morelab.deusto.es

También podría gustarte