Bases de Datos No Relacionales (NoSQL)

186
Bases de Datos No Relacionales (NoSQL) 29, 30 y 31 de Octobre de 2012, 18:00-21:00 , Aula 104, ESIDE Máster en Desarrollo e Integración de Soluciones Software, Facultad de Ingeniería, Universidad de Deusto Dr. Diego Lz. de Ipiña Glz. de Artaza DeustoTech-INTERNET2, DeustoTech – Deusto Institute of Technology, Universidad de Deusto [email protected] http://paginaspersonales.deusto.es/dipina http://www.morelab.deusto.es

description

 

Transcript of Bases de Datos No Relacionales (NoSQL)

Page 1: Bases de Datos No Relacionales (NoSQL)

1

Bases de Datos No Relacionales (NoSQL) 29, 30 y 31 de Octobre de 2012, 18:00-21:00 , Aula 104, ESIDEMáster en Desarrollo e Integración de Soluciones Software,

Facultad de Ingeniería, Universidad de Deusto

Dr. Diego Lz. de Ipiña Glz. de ArtazaDeustoTech-INTERNET2, DeustoTech – Deusto Institute of Technology, Universidad de Deusto

[email protected] http://paginaspersonales.deusto.es/dipina

http://www.morelab.deusto.es

Page 2: Bases de Datos No Relacionales (NoSQL)

2

Agenda

• Introducción a Cloud Computing• ¿Qué es una Base de Datos No Relacional?• Las bases de datos NoSQL o de Big Data• Bases de datos distribuidas: teorema de CAP• Arquitectura de una BBDD NoSQL• Tipología de las BBDD NoSQL• Una base de datos NoSQL del tipo Key-Value Store: Apache Cassandra• Bases de datos NoSQL del tipo orientadas a Documentos: Apache CouchDB y

MongoDB• Ventajas y desventajas de las bases de datos NoSQL• Utilización en la industria de las BBDD NoSQL• Integración con las BBDD relacionales• Conclusión

Page 3: Bases de Datos No Relacionales (NoSQL)

3

Ejemplos de este Curso

• Los ejemplos asociados al curso, junto al software necesario para su ejecución, puede descargarse de:– http://dl.dropbox.com/u/2763621/CursoNoSQL/N

oSQL-cd.rar

Page 4: Bases de Datos No Relacionales (NoSQL)

4

El Futuro del Desarrollo Software

Page 5: Bases de Datos No Relacionales (NoSQL)

5

Infraestructura Virtualizada:Cloud Computing

Un paradigma de computación emergente donde los datos y servicios residen en centros de datos muy escalables que pueden ser accedidos ubicuamente desde cualquier dispositivo conectado a Internet1

Merrill Lynch: Cloud computing market opportunity by 2011 =$95bn in business and

productivity apps +$65bn in online advertising =

$160bn

(1) Source: IBM

Page 6: Bases de Datos No Relacionales (NoSQL)

6

Cloud Computing es …

• … capacidad computacional y almacenamiento virtualizada expuesta mediante infraestructura agnóstica a la plataforma y accedida por Internet – Recursos IT compartidos en demanda, creados y

eliminados eficientemente y de modo escalable a través de una variedad de interfaces programáticos facturados en base a su uso

Page 7: Bases de Datos No Relacionales (NoSQL)

7

Forrester Research

“A pool of abstracted, highly scalable, and managed compute infrastructure capable of hosting end-customer applications and billed by consumption1”

1- “Is Cloud Computing Ready for The Enterprise?” Forrester Research, Inc.

Page 8: Bases de Datos No Relacionales (NoSQL)

8

The “Cloud” = 10X Improvement• Fácil de usar: hazlo tu mismo remotamente de cualquier

lugar en cualquier momento• Escalable: controla tu infraestructura con tu aplicación• Riesgo: nada que comprar, cancela inmediatamente• Robustez: basado en gran hardware empresarial• Coste: paga sólo por lo que uses

Page 9: Bases de Datos No Relacionales (NoSQL)

9

Evolución hacia Cloud Computing• La coexistencia y limitaciones de cluster

computing y supercomputing dieron lugar a grid computing

• De grid computing progresamos hacia utility computing, i.e. Servicios computacionales empaquetados como agua, electricidad, etc.

• Esto derivó en Cloud Computing, es decir, todo como servicio (XaaS) :• Plataforma como Servicio• Software como Servicio• Infraestructura como Servicio

Page 10: Bases de Datos No Relacionales (NoSQL)

10

Múltiples Descripciones Gráficas de la “Cloud”

Page 11: Bases de Datos No Relacionales (NoSQL)

11

Múltiples Descripciones Gráficas de la “Cloud”

Page 12: Bases de Datos No Relacionales (NoSQL)

12

Arquitectura Cloud Computing

Page 13: Bases de Datos No Relacionales (NoSQL)

13

Características de Cloud

Tipos de despliegue• Cloud privada

– Propiedad de o alquilada por una empresa (centros de datos,…)

• Cloud comunitaria– Infraestructura compartida por

una comunidad específica• Cloud pública

– Vendida al público, gran escala (ec2, S3,…)

• Cloud híbrida– Composición de dos o más

clouds

Manifestaciones • Cloud Software as a Service (SaaS)

– Uso de la aplicación del proveedor sobre la red, e.j., Salesforce.com,…

• Cloud Platform as a Service (PaaS) – Despliega aplicaciones creadas por los

clientes a la nube, e.j. Google App Engine, Microsoft Azure, …

• Cloud Infrastructure as a Service (IaaS) – Alquilar procesamiento, almacenamiento,

capacidad de red y otros recursos computacionales e.j., EC2 – Elastic Compute Cloud, S3 – Simple Storage Service, Simple DB,…

Page 14: Bases de Datos No Relacionales (NoSQL)

14

Diferentes Manifestaciones

Page 15: Bases de Datos No Relacionales (NoSQL)

15

Cloud Computing vs. Centros de Datos Tradicionales

Page 16: Bases de Datos No Relacionales (NoSQL)

16

Componentes de Cloud Computing

Page 17: Bases de Datos No Relacionales (NoSQL)

17

Taxonomía de Cloud Computing

Page 18: Bases de Datos No Relacionales (NoSQL)

18

Evolución de Tecnologías de Cloud Computing

• Maduración de tecnología de virtualización• La virtualización permite nubes de computación• Las nubes de computación demandan nubes de

almacenamiento• Las nubes de almacenamiento y computación 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

Page 19: Bases de Datos No Relacionales (NoSQL)

19

Aplicaciones Cloud• Corresponden con lo que se denomina como SaaS• Manifestación de cloud más popular• Ejemplos: SalesForce, Gmail, Yahoo! Mail, rememberthemilk,

doodle, Google Docs, DropBox, picnik, Panda Cloud Antivirus, scribd, slideshare

• Ventajas: Libre, Fácil, Adopción de consumo• Desventajas: funcionalidad limitada, no hay control de acceso

a la tecnología subyacente

Page 20: Bases de Datos No Relacionales (NoSQL)

20

Plataformas Cloud• Contenedores de aplicaciones• Entornos cerrados• Ejemplos: Google App Engine, Microsoft Azure, Heroku,

Mosso, Engine Yard, Joyent o Force.com• Ventajas: buenas para desarrolladores, más control que en las

aplicaciones cloud, configuradas estrechamente• Desventajas: restringidas a lo que está disponible, otras

dependencias, dependencia tecnológica

Page 21: Bases de Datos No Relacionales (NoSQL)

21

Infraestructura Cloud

• Proveen nubes de computación y almacenamiento• Ofrecen capas de virtualización (hardware/software)• Ejemplos: Amazon EC2, GoGrid, Amazon S3, Nirvanix, Linode,

Arsys Cloud Flexible, EyeOS• Ventajas: control completo del entorno y la infraestructura• Desventajas: precio premium, competencia limitada

Page 22: Bases de Datos No Relacionales (NoSQL)

22

Extensores de la Cloud

• Proveen extensiones a infraestructura y plataformas cloud con funcionalidad básica

• Ejemplos: Amazon SimpleDB, Amazon SQS, Google BigTable• Ventajas: extienden la funcionalidad de las nubes de

computación y almacenamiento para integrar sistemas heredados u otras cloud

• Desventajas: a veces requieren el uso de plataformas o infraestructura específica

Page 23: Bases de Datos No Relacionales (NoSQL)

23

Agregadores Cloud

• Se apoyan en varias infraestructuras cloud para su gestión

• Ejemplos: RightScale, Appistry• Ventajas: proveen más opciones para entornos cloud• Desventajas: dependientes de proveedores de cloud

Page 24: Bases de Datos No Relacionales (NoSQL)

24

¿Qué framework o plataforma usar para mis aplicaciones Cloud?

Page 25: Bases de Datos No Relacionales (NoSQL)

25

Amazon Web Services (AWS)• AWS proporciona una infraestructura de servicios elástica donde alojar

computación, almacenamiento o sistemas empresariales– Amazon Elastic Cloud (EC2) – permite configurar y ejecutar un Amazon Machine

Instance (AMI) – servidores en demanda– Amazon Simple Storage Service (S3) – permite guardar y recuperar datos en la nube– Amazon SimpleDB – proporciona la funcionalidad de una base de datos sobre S3 –

basada en pares clave-valor– Amazon Simple Queue Service (SQS) – servicio de mensajería para encolar tareas y

mensajes– Amazon Relational Database Service (RDS) – servicio web para crear, operar y escalar

una base de datos en la nube– Amazon CloudFront – copias de tus objetos más populares son cacheados en una red de

nodos alrededor del mundo– …

• Documentación: http://aws.amazon.com/documentation/

Page 26: Bases de Datos No Relacionales (NoSQL)

26

Amazon Web Services (AWS)

Page 27: Bases de Datos No Relacionales (NoSQL)

27

Amazon Web Services (AWS)

Page 28: Bases de Datos No Relacionales (NoSQL)

28

Introducción a NoSQL

• NoSQL – es un término 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 término fue acuñado 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 generación como “Big Data”

Page 29: Bases de Datos No Relacionales (NoSQL)

29

Introducción a NoSQL

• NoSQL – "not only SQL” – es una categoría general de sistemas de gestión de bases de datos que difiere de modelo relacionales clásicos (RDBMS) en diferente modos:– Estos datastores no requieren esquemas de información

fijas– Evitan las operaciones JOIN y escalan horizontalmente

• De hecho, tanto las bases de datos NoSQL como las relacionales son tipos de Almacenamiento Estructurado

Page 30: Bases de Datos No Relacionales (NoSQL)

30

Introducción a NoSQL

• La principal diferencia radica en cómo guardan los datos (por ejemplo, almacenamiento de un recibo):– En una RDBMS tendríamos que partir la información en

diferentes tablas y luego usar un lenguaje de programación 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 diseñas tus tablas y

su estructura por adelantado• ¡¡¡NoSQL no es la panacea!!!

– Si tus datos son relacionales, quedarte con tu RDBMS sería la opción correcta

Page 31: Bases de Datos No Relacionales (NoSQL)

31

El teorema CAP• Teorema de Brewer: “es imposible para un sistema computacional

distribuido ofrecer simultáneamente las siguientes tres garantías”:– Consistencia – todos los nodos ven los mismos datos al mismo tiempo– Disponibilidad (Availability) – garantiza que cada petición recibe una

respuesta acerca de si tuvo éxito o no– Tolerancia a la partición (Partition) – el sistema continua funcionando a pesar

de la pérdida de mensajes• Equivalente a:

– “You can have it good, you can have it fast, you can have it cheap: pick two.”

Page 32: Bases de Datos No Relacionales (NoSQL)

32

RDBMS vs. NoSQL• Las bases de datos relacionales tradicionales nos permiten definir la estructura de

un esquema que demanda reglas rígidas y garantizan ACID:– Atomicity– Consistency– Isolation– Durability

• Las aplicaciones web modernas presentan desafíos 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

Page 33: Bases de Datos No Relacionales (NoSQL)

33

¿Por qué necesitamos NoSQL?• Las BBDD relacionales ofrecen bajo rendimiento ante ciertas aplicaciones

intensivas de datos:– Indexación de un gran número de documentos– Servir páginas en sites de mucho tráfico– Envío de datos de streaming

• Las RDBMS están optimizadas para pequeñas pero frecuentes transacciones de lectura/escritura o largas transacciones con pocos acceso de escritura.

• NoSQL puede dar servicio a grandes cargas de lectura/escritura:– Digg mantiene 3 TB de green badges (marcadores que indican las historias

votadas por otros en una red social) – Facebook que tiene que realizar búsqueda en bandejas de mensajes de más

de 50 TB

Page 34: Bases de Datos No Relacionales (NoSQL)

34

Arquitectura de las BBDD NoSQL• A menudo ofrecen sólo garantías de consistencia

débiles, 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

Page 35: Bases de Datos No Relacionales (NoSQL)

35

¿Qué tipo de BBDD elijo?

• Algunas respuestas pueden encontrarse en:– 35+ Use Cases For Choosing Your Next NoSQL Database

• http://highscalability.com/blog/2011/6/20/35-use-cases-for-choosing-your-next-nosql-database.html

– Five Reasons to Use NoSQL• http://facility9.com/2010/09/five-reasons-to-use-nosql/

• Las más populares son: Cassandra, CouchDB, MongoDB, Riak, Neo4j

Page 36: Bases de Datos No Relacionales (NoSQL)

36

¿Quién usa NoSQL?

• No lo usan para todo, sólo para algunas partes de sus sistemas empresariales:– Ubuntu DesktopCouch (CouchDB)– Adobe y Mozilla (Hbase)– Twitter (

http://www.readwriteweb.com/cloud/2011/01/how-twitter-uses-nosql.php)

Page 37: Bases de Datos No Relacionales (NoSQL)

37

Taxonomía de soluciones NoSQL• Los principales tipos de BBDD de acuerdo con

su implementación son los siguientes:– Almacenes de Clave-Valor– Almacenes de Familia de Columnas– Almacenes de documentos– Grafos

Page 38: Bases de Datos No Relacionales (NoSQL)

38

Características BBDD orientadas a Clave-Valor

• Su precursor fue Amazon Dynamo– Basadas en DHT (Distributed Hash Tables)

• Modelo de datos: colección de pares clave/valor

• Ejemplos: Dynomite, Voldemort, Tokyo

Page 39: Bases de Datos No Relacionales (NoSQL)

39

Distributed Hash Table (DHT)• Un distributed hash table (DHT) es una clase de sistema distribuido que permite

un servicio de lookup similar a un Hash Table– Almacenan pares clave valor– Cada nodo puede obtener eficientemente el valor asociado a una clave– La responsabilidad de mantener los mapeos entre claves y valores está distribuida entre

los nodos– Escalan a grandes números de nodos y gestionan la llegada continua de nodos, salidas y

fallos

Page 40: Bases de Datos No Relacionales (NoSQL)

40

Características BBDD orientadas a Familia de Columnas

• Su precursor es Google BigTable• Modelo de datos: familia de columnas, esto es, un

modelo tabular donde cada fila puede tener una configuración diferente de columnas

• Ejemplos: HBase, Hypertable, Cassandra, Riak• Buenas en:

– Gestión de tamaño– Cargas de escrituras masivas orientas al stream– Alta disponibilidad– MapReduce

Page 41: Bases de Datos No Relacionales (NoSQL)

41

Características BBDD orientadas a Documentos

• La precursora fue Lotus Notes• Modelo de datos: colecciones de documentos que

contienen colecciones de claves-valor• Ejemplos: CouchDB, MongoDB • Buenas en:

– Modelado de datos natural– Amigables al programador– Desarrollo rápido – Orientas a la web: CRUD

Page 42: Bases de Datos No Relacionales (NoSQL)

42

Base de Datos orientada a Documentos

• Una base de datos orientada a documentos es un programa diseñado para almacenar, recuperar y gestionar información semi-estructurada orientada a documentos: – Un documento encapsula información en un formato estándar (XML,

YAML, JSON o BSON):• Los documentos en una BBDD orientada a documentos son similares a

registros pero no requieren un esquema estándar con la mismas secciones, huecos, partes, claves y similar

• Los documentos suelen ser direccionables por una clave que los representa unívocamente

• Además de la búsqueda por clave de documento, estas BBDD suelen ofrecer una API o lenguaje de consultas que permite recuperar documentos en base a sus contenidos

Page 43: Bases de Datos No Relacionales (NoSQL)

43

Características Bases de Datos Basadas en Grafos

• Inspiradas por Euler y la teoría de grafos• Modelo de datos: nodos, relaciones con pares

clave valor en ambos• Ejemplos: AllegroGraph, VertexBD, Neo4j

Page 44: Bases de Datos No Relacionales (NoSQL)

44

Apache Cassandra

• Es un almacén altamente escalable, eventualmente consistente y distribuido de estructuras clave-valor.– Iniciado por Facebook– Código abierto– Proyecto apache

• Licencia: Apache License 2.0– Escrito en Java– Multiplataforma– Versión actual: 1.1.6– Web: http://cassandra.apache.org/

• Documentación: http://www.datastax.com/docs/1.0/index

Page 45: Bases de Datos No Relacionales (NoSQL)

45

¿Quién usa Apache Cassandra?

• Algunos usuarios famosos de Cassandra son:– Digg– Facebook– Twitter– Rackspace– SimpleGEO– …

Page 46: Bases de Datos No Relacionales (NoSQL)

46

Ventajas de Cassandra para desarrolladores Web

• Cassandra está desarrollada para ser un servidor distribuido, pero puede también ejecutarse como un nodo simple:

– Escalabilidad horizontal (añade nuevo hardware cuando sea preciso)– Rápidas respuestas aunque la demanda crezca– Elevadas velocidades de escritura para gestionar volúmenes de datos incrementales– Almacenamiento distribuido– Capacidad de cambiar la estructura de datos cuando los usuarios demandan más

funcionalidad– Una API sencilla y limpia para tu lenguaje de programación favorito– Detección automática 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

Page 47: Bases de Datos No Relacionales (NoSQL)

47

Desventajas de Cassandra

• Hay algunas desventajas que un sistema de almacenamiento tan escalable ofrece en contrapartida:– No hay joins (a cambio de más velocidad)– No permite ordenar resultados en tiempo de

consulta– No tenía SQL

• Pero desde la versión 0.8 tenemos CQL

Page 48: Bases de Datos No Relacionales (NoSQL)

48

Instalación de Cassandra

• Documentación en:– Cassandra Wiki: GettingStarted,

http://wiki.apache.org/cassandra/GettingStarted• Requisitos:

– Java 1.6 en adelante• Las últimas versiones estables disponibles en:

– http://cassandra.apache.org/download/

Page 49: Bases de Datos No Relacionales (NoSQL)

49

Instalación de Cassandra

• Disponible desde: http://cassandra.apache.org/download/– Descargar apache-cassandra-1.1.6-bin.tar.gz o similar

• Descomprimir en tu sistema con Winrar o usando gzip en Linux

• Asociar a la variable de entorno PATH la localización de la carpeta bin dentro de Apache Cassandra:– En Windows podría quedar en: C:\Programming\Java\apache-cassandra-1.1.6\bin

Page 50: Bases de Datos No Relacionales (NoSQL)

50

Ejecutando un nodo de Cassandra

• Arrancar Apache Cassandra, ejecutando:– cassandra –f

• -f le dice a Cassandra que se ejecute en foreground para ver así los logs del sistema

• Tenemos un cluster con un solo nodo ejecutándose en el puerto 9160

• La configuración de este nodo la podemos encontrar en: conf/cassandra.yaml

• Ejecutar el cliente de consola para asegurarnos que todo está bien: – cassandra-cli

Page 51: Bases de Datos No Relacionales (NoSQL)

51

Comandos CLI Básicos

• help; – también se puede user ‘?’, sirve para pedir ayuda

• Para conectarte a un servidor, hacer:– connect localhost/9160;

• Alternativamente: cassandra-cli localhost/9160

– show cluster name;– show keyspaces;– show API version;

Page 52: Bases de Datos No Relacionales (NoSQL)

52

Comandos CLI Básicos• Vamos a crear un KeySpace, algo así como una base de datos relacional:

– Define un conjunto de familias de columnas• 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;assume User validator as Ascii;set User['dipina']['lname']='Lopez-de-Ipina';set User['dipina']['fname']='Diego';set User['dipina']['email']='[email protected]';count User['dipina'];get User['dipina'];del User['dipina']['email'];del User['dipina'];get User['dipina'];

Page 53: Bases de Datos No Relacionales (NoSQL)

53

Ring, clúster y el protocolo Gossip

• Cassandra usa un protocolo Gossip para permitir comunicación dentro de un ring, de tal modo que cada nodo sabe de otros nodos– Permite soportar descentralización y tolerancia a la partición

• Cassandra está diseñada para ser distribuida en varias máquinas que aparecen como una simple máquina a los ojos de los clientes– La estructura más externa de Cassandra es el cluster o ring

• Un nodo tiene una réplica para diferentes rangos de datos, si algo va mal una réplica puede responder

– El parámetro replication_factor en la creación de un KeySpace indica cuántas máquinas en el clúster recibirán copias de los mismos datos.

Page 54: Bases de Datos No Relacionales (NoSQL)

54

Ejecutando un Clúster

• Hay que repetir el paso anterior varias veces, PERO…– Necesitamos indicar qué nodo va a funcionar como Seed, dado que los

nodos en Cassandra se comunican usando un protocolo Gossip• La idea es permitir que los nodos en un cluster se descubran unos a otros

– Además deberemos indicar la interfaz IP para escuchar para Gossip y Thrift

• Documentación en:– http://crlog.info/2011/07/09/setting-up-a-multi-node-cassandra-clust

er-on-a-single-windows-machine/– http://www.datastax.com/docs/0.7/getting_started/configuring

Page 55: Bases de Datos No Relacionales (NoSQL)

55

Ejecutando un Clúster• Vamos a realizar un ejemplo con 4 nodos en Windows. Los pasos a seguir serán:

1. Abrir el fichero hosts en C:\Windows\System32\drivers\etc2. Añadir el siguiente contenido, para crear 4 nodos locales:

#cassandra nodes127.0.0.1 node1.cassandra127.0.0.1 node2.cassandra127.0.0.1 node3.cassandra127.0.0.1 node4.cassandra

3. Descomprime apache-cassandra-1.1.6-bin.tar.gz en 4 carpetas, por ejemplo: %HOME%\apache-cassandra-1.1.6\1 a %HOME%\apache-cassandra-1.1.6\4

4. Editar cada conf\cassandra.yaml con lo siguiente:• Propiedad cluster_name=“PruebaCluster”• Asegúrate que auto_bootstrap: false en node1 y node2• Configura los dos seed nodes con la línea: seeds: node1.cassandra, node2.cassandra• Modifica los directorios de datos: data_file_directories, commitlog_directory y

saved_caches_directory– Por ejemplo, commitlog_directory: /var/lib/cassandra/1/commitlog

• Modifica las variables:– listen_address: node1.cassandra– rpc_address: node1.cassandra

5. Modicar el número de puerto en cassandra.bat de JMX: -Dcom.sun.management.jmxremote.port=7199

6. Ejecutar el siguiente comando para ver los nodos en el clúster: • nodetool -h 127.0.0.1 -p 7199 ring

Page 56: Bases de Datos No Relacionales (NoSQL)

56

Teorema CAP en Cassandra

• Las bases de datos derivadas de Amazon Dynamo incluyen Cassandra, Voldemort, CouchDB y Riak– Centradas más en disponibilidad y tolerancia a fallos

• Permiten Consistencia Eventual– Donde “eventual” significa milisegundos

– Por tanto Cassandra es AP:• “To primarily support Availability and Partition Tolerance, your

system may return inaccurate data, but the system will always be available, even in the face of network partitioning”

Page 57: Bases de Datos No Relacionales (NoSQL)

57

Modelo de Datos en Cassandra

• Está basado en un modelo clave-valor• 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.

Page 58: Bases de Datos No Relacionales (NoSQL)

58

Modelo de Datos en Cassandra• Diseñado para datos distribuidos de modo escalable sacrifica ACID por ventajas

en rendimiento, disponibilidad y gestión 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 básicos son:– Clúster: son las máquinas que componen una instancia de Cassandra

• Pueden contener varios Keyspaces– Keyspace: espacio de nombres para un conjunto de ColumFamily, asociado a una

aplicación• 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

Page 59: Bases de Datos No Relacionales (NoSQL)

59

Column• Una columna es un par nombre-valor que también contiene

un timestamp – Los nombres y columnas son arrays de bytes– El timestamp registra la última vez que una columna es accedida– Unidad atómica

• name:value:timestamp• Email:[email protected]:123456789

• Ejemplo en JSON:{"name": "Email","value": "[email protected]","timestamp”: 123456789

}

Page 60: Bases de Datos No Relacionales (NoSQL)

60

Super-columnas• Una supercolumna es un array asociativo

(mapa) de columnas ordenadas por nombre

Page 61: Bases de Datos No Relacionales (NoSQL)

61

Column Family• Es un contenedor de columnas

– Análogo al concepto de tabla en RDBMS• Contiene una lista ordenada de columnas

– Cuando se crea de manera configurativa una familia de columnas se indica cómo se ordenarán las columnas de cada fila (cogiendo el nombre)

• ASCII, UTF-8, Long, UUID

• Cada familia de columnas se guarda en un fichero, y el fichero está ordenado por clave de fila

• Una familia de columnas tiene un …conjunto de filas con un conjunto de …

columnas similar pero no idéntico

• Pueden ser de tipo SUPER o STANDARD

Page 62: Bases de Datos No Relacionales (NoSQL)

62

Column Family• Ejemplo en JSON:

{ "mccv":{ "Users":{ "emailAddress":{"name":"emailAddress", "value":"[email protected]"}, "webSite":{"name":"webSite", "value":"http://bar.com"} }, "Stats":{ "visits":{"name":"visits", "value":"243"} } }, "user2":{ "Users":{ "emailAddress":{"name":"emailAddress",

"value":"[email protected]"}, "twitter":{"name":"twitter", "value":"user2"} } }}

Page 63: Bases de Datos No Relacionales (NoSQL)

63

Familia de super-columnas

• Una familia de super-columnas es un contenedor de super-columnas ordenadas por sus nombres, a su vez estas super-columnas aparecen ordenadas por las claves de fila (row_key)

Page 64: Bases de Datos No Relacionales (NoSQL)

64

Familia de super-columnas

Page 65: Bases de Datos No Relacionales (NoSQL)

65

Familias de Columnas vs. Familia de Super-Columnas

• Una fila en una familia de columnas normal es un mapa de nombres de columna ordenadas a valores de columna– “The address of a value in a regular column family is a row key

pointing to a column name pointing to a value”

• Una fila en una familia de super-columnas es un mapa ordenado de nombres de super-columnas a mapas de nombres de columnas a valores de columnas– “The address of a value in a column family of type “super” is a row

key pointing to a column name pointing to a subcolumn name pointing to a value”

Page 66: Bases de Datos No Relacionales (NoSQL)

66

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”:

Page 67: Bases de Datos No Relacionales (NoSQL)

67

Resumen Modelo de Datos

Page 68: Bases de Datos No Relacionales (NoSQL)

68

Clúster

• Los datos en Cassandra se guardan en un Clúster o Ring donde se asignan datos a los nodos dentro de un ring– Un nodo tiene réplicas para diferentes rangos de

datos– Si un nodo se cae su réplica puede responder– Un protocolo P2P hace que los datos se repliquen

entre nodos acorde con un replication_factor

Page 69: Bases de Datos No Relacionales (NoSQL)

69

Configuración de un Keyspace

• Los atributos básicos que puedes asociar a un keyspace son:– Replication factor: cuánto quieres pagar en rendimiento a

favor de consistencia– Replica placement strategy: indica cómo se colocan las

réplicas en el anillo: SimpleStrategy, OldNetworkTopologyStrategy y NetworkTopologyStrategy

• Revisar:http://www.datastax.com/docs/1.0/cluster_architecture/replication

– Column families: al menos una por Keyspace, es un contenedor de filas, que contienen columnas

Page 70: Bases de Datos No Relacionales (NoSQL)

70

Otros aspectos importantes

• Cassandra ofrece soporte para particionado distribuido de datos– RandomPartitioner te da buen balanceo de carga– OrderPreservingPartitionioner te permite ejecutar consultas de

rangos, pero exige más trabajo eligiendo node tokens• Más info en:

http://abel-perez.com/cassandra-partitioner-order-preserving-partit– Documentation:

http://www.datastax.com/docs/1.0/cluster_architecture/partitioning

• Cassandra tiene consistencia reconfigurable– http://www.datastax.com/docs/1.0/dml/data_consistency

• Con Cassandra tienes que pensar en las consultas que quieres ejecutar y luego realizar el modelo en torno a ellas

Page 71: Bases de Datos No Relacionales (NoSQL)

71

Diferencias entre un RDBMS y Cassandra

• No había lenguaje de consulta, tiene una API accesible a través de Thrift– Sí existe desde la versión 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 daban lugar a nuevos column families que mapean un campo a la clave de la primera column family

– Desde Cassandra 0.7 se pueden crear índices secundarios: http://www.datastax.com/dev/blog/whats-new-cassandra-07-secondary-indexes

• Ordenar es una decisión de diseño, 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

Page 72: Bases de Datos No Relacionales (NoSQL)

72

RDBS vs. KeySpace

Page 73: Bases de Datos No Relacionales (NoSQL)

73

Soporte Multi-lenguaje de Cassandra

• Cassandra utiliza la librería Thrift (http://thrift.apache.org/) para proveer una API independiente del lenguaje de programación– Thrift API 1.0: http://wiki.apache.org/cassandra/API– Ejemplo en: http://wiki.apache.org/cassandra/ClientExamples

• Thrift soporta un gran número de lenguajes incluyendo: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, y Ocaml

• Hay muchas librerías clientes disponibles:– Pycassa para Python: http://pycassa.github.com/pycassa/index.html– Hector para Java: https://github.com/hector-client/hector

Page 74: Bases de Datos No Relacionales (NoSQL)

74

Avro vs. Thrift• Avro remplazará Thrift como cliente RPC para interaccionar con Cassandra.

– Avro es un subproyecto de Apache Hadoop project– Proporciona funcionalidad similar a Thrift pero es una librería de serialización

dinámica que no requiere generación de código estática como Thrift– Thrift fue creado por Facebook y luego donado a Apache, pero apenas ha

recibido soporte últimamente.• El servidor de Cassandra será portado de

de org.apache.cassandra.thrift.CassandraServer a org.apache.cassandra.avro.CassandraServer– Todavía no hecho

• Más información sobre Avro en: http://avro.apache.org.

Page 75: Bases de Datos No Relacionales (NoSQL)

75

Mi primera aplicación con Cassandra

• Relational vs. – Cassandra Model

Page 76: Bases de Datos No Relacionales (NoSQL)

76

Cassandra vs. RDBMS

• Un RDBS es un modelo basado en el dominio– ¿qué respuestas tienes?

• Cassandra tiene un modelo orientado a consultas– ¿qué preguntas tienes?

Page 77: Bases de Datos No Relacionales (NoSQL)

77

Pycassa: un cliente Python para Apache Cassandra

• Instalación:– Dependencias:

• Instalar Python 2.7 o en adelante: http://www.python.org/download/• Instalar setuptools: http://pypi.python.org/pypi/setuptools#windows

– Descarga el ficero .zip de https://github.com/pycassa/pycassa– Descomprímelo en tu disco duro – Instala pip siguiendo las instrucciones en:

• http://www.pip-installer.org/en/latest/installing.html– Ejecuta python setup.py install– Actualizar PATH con directorio donde está python.exe

• Más info en:– http://pycassa.github.com/pycassa/tutorial.html#connecting-to-cassa

ndra

Page 78: Bases de Datos No Relacionales (NoSQL)

78

Interactuando con Cassandra desde Python: pycassa

• Comprobar que la librería funciona haciendo desde Python:import pycassa

• Asegúrate que el KeySpace1 existe en CassandraEjecuta: cassandra-cli –h localhost -f CreateKeySpace1.txt

• Conéctate a Cassandra:from pycassa.pool import ConnectionPoolpool = ConnectionPool('Keyspace1')

Page 79: Bases de Datos No Relacionales (NoSQL)

79

Interactuando con Cassandra desde Python: pycassa

• Recupera una ColumnFamily:from pycassa.pool import ConnectionPoolfrom pycassa.columnfamily import ColumnFamilypool = ConnectionPool('Keyspace1') col_fam = pycassa.ColumnFamily(pool, 'Standard1')

• Insertando datos:col_fam.insert('row_key', {'col_name': 'col_val'})

col_fam.insert('row_key2', {'col_name':'col_val', 'col_name2':'col_val2'})

col_fam.batch_insert({'row1': {'name1': 'val1', 'name2': 'val2'}, 'row2': {'foo': 'bar'}})

Page 80: Bases de Datos No Relacionales (NoSQL)

80

Interactuando con Cassandra desde Python: pycassa

• Pare recuperar las columnas de una fila:– col_fam.get('row_key')

• Si no queremos recuperar todas las columnas en una fila:– col_fam.get('row_key', columns=['col_name', 'col_name2'])

• Podemos también recuperar un rango de columnas en una fila o en orden decreciente un número máximo de columnas:for i in range(1, 10): ... col_fam.insert('row_key', {str(i): 'val'})col_fam.get('row_key', column_start='5', column_finish='7')

col_fam.get('row_key', column_reversed=True, column_count=3)

Page 81: Bases de Datos No Relacionales (NoSQL)

81

Interactuando con Cassandra desde Python: pycassa

• Para recuperar múltiples filas usamos:col_fam.multiget(['row1', 'row2'])

• También podemos recuperar rangos de filas:result = col_fam.get_range(start='row_key5',

finish='row_key7')

• Para conocer el número de columnas en una fila:col_fam.get_count('row_key')col_fam.get_count('row_key', columns=['foo', 'bar'])col_fam.get_count('row_key', column_start='foo')

• Para contabilizar las filas que cumplen ciertas restricciones:col_fam.multiget_count(['fib0', 'fib1', 'fib2', 'fib3',

'fib4'])

• Tutorial de pycassa en: http://pycassa.github.com/pycassa/tutorial.html#

Page 82: Bases de Datos No Relacionales (NoSQL)

82

Twissandra• Download de: https://github.com/twissandra/twissandra• Instalar Django:

– Bajar la última versión de: https://www.djangoproject.com/download/– Descomprimir el archivo descargado– Ejecutar: python setup.py install

• Instalar Twissandra:– Crear el schema

• cd twissandra • python manage.py sync_cassandra

– Arrancar el webserver• python manage.py runserver

• Los dos ficheros más importantes a revisar son:– Twissandra/tweets/management/commands/

sync_cassandra.py• Muestra cómo crear el schema de datos de Twissandra

– twissandra/cass.py • Muestra cómo hacer CRUD sobre ese schema

Page 83: Bases de Datos No Relacionales (NoSQL)

83

• Usuarios:User = { 'hermes': { 'password': '****', (other properties), },}

• Amigos y seguidores:Friends = {

'hermes': { # friend id: timestamp of when the friendship was added 'larry': '1267413962580791', 'curly': '1267413990076949', 'moe' : '1267414008133277', },}

Followers = { 'hermes': { # friend id: timestamp of when the followership was added 'larry': '1267413962580791', 'curly': '1267413990076949', 'moe' : '1267414008133277', },}

Modelo de Datos de Twissandra

Page 84: Bases de Datos No Relacionales (NoSQL)

84

• Tweets:Tweet = { '7561a442-24e2-11df-8924-001ff3591711': { 'username': 'hermes', 'body': 'Trying out Twissandra. This is awesome!', },}

• Timeline y UserLine:Timeline = { 'hermes': { # timestamp of tweet: tweet id 1267414247561777: '7561a442-24e2-11df-8924-001ff3591711', 1267414277402340: 'f0c8d718-24e2-11df-8924-001ff3591711', 1267414305866969: 'f9e6d804-24e2-11df-8924-001ff3591711', 1267414319522925: '02ccb5ec-24e3-11df-8924-001ff3591711', },}

Userline = { 'hermes': { # timestamp of tweet: tweet id 1267414247561777: '7561a442-24e2-11df-8924-001ff3591711', 1267414277402340: 'f0c8d718-24e2-11df-8924-001ff3591711', 1267414305866969: 'f9e6d804-24e2-11df-8924-001ff3591711', 1267414319522925: '02ccb5ec-24e3-11df-8924-001ff3591711', },}

Modelo de Datos de Twissandra

Page 85: Bases de Datos No Relacionales (NoSQL)

85

Cassandra Query Language (CQL)• Cassandra ha sido accedido principalmente mediante Thrift – una API RPC

que proporciona un denominador común a clientes para lenguajes específicos

• 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 implementación complejos al servidor– Los clientes sólo tienen que saber cómo interpretar objetos en un “resultset”

• Documentación: • 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

Page 86: Bases de Datos No Relacionales (NoSQL)

86

Acceso a CQL

• Los desarrolladores pueden usar CQL desde Python o línea de comandos

• Existen drivers en diferentes lenguajes de programación• Nosotros vamos a practicar con comandos CQL a través del

cliente de línea de comandos cqlsh• Desde Apache Cassandra 1.0.5, el cliente cqlsh está

instalado en $CASSANDRA_HOME/bin/cqlsh para instalaciones tarball o /usr/bin/cqlsh para instalaciones de paquetes Linux

• Ejemplo programático en: – http://crlog.info/2011/06/13/cql-creating-a-simple-keyspace/– http://www.datastax.com/docs/1.1/dml/using_cql

Page 87: Bases de Datos No Relacionales (NoSQL)

87

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 |

Page 88: Bases de Datos No Relacionales (NoSQL)

88

Un poco de CQL• Más ejemplos en:

http://www.datastax.com/docs/1.0/dml/using_cqlcqlsh> CREATE KEYSPACE twissandra1 WITH strategy_class = 'NetworkTopologyStrategy' AND strategy_options:DC1 = 3;

cqlsh> USE twissandra; cqlsh> CREATE COLUMNFAMILY users (

KEY varchar PRIMARY KEY,password varchar,gender varchar,session_token varchar,state varchar,birth_year bigint);

Page 89: Bases de Datos No Relacionales (NoSQL)

89

Hector• Una API de alto nivel en Java para Cassandra

– Incluye características empresariales: connection pooling, monitoring, etc. • Documentación:

– Tutorial: • https://github.com/rantav/hector/wiki/User-Guide • https://github.com/zznate/cassandra-tutorial

– Getting started guide: • https://github.com/rantav/hector/wiki/Getting-started-%285-minutes%29

– Ejemplos:• https://github.com/zznate/hector-examples• https://github.com/zznate/cassandra-tutorial• https://github.com/riptano/twissjava

– Inicializar BBDD con create-twissjava-db.txt– Ejecutar: mvn jetty:run– Ir a: http://localhost:8888/– mvn clean

Page 90: Bases de Datos No Relacionales (NoSQL)

90

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 acrónimo de"Cluster Of Unreliable

Commodity Hardware" • Su misión 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. I’ve 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

Page 91: Bases de Datos No Relacionales (NoSQL)

91

Características de CouchDB• CouchDB es una base de datos orientada a documentos JSON escrita en

Erlang. – Parte de la generación de bases de datos NoSQL– Es un proyecto open source de la fundación Apache

• Es altamente concurrente, diseñada para ser replicada horizontalmente, a través de varios dispositivos y tolerante a fallos.

• Permite a las aplicaciones guardar documentos JSON a través de una interfaz RESTful

• Utiliza map/reduce para indexar y consultar la base de datos• Permite escribir una aplicación cliente que habla directamente vía HTTP

con CouchDB sin necesidad de una capa servidora intermedia• Guarda datos en local en la propia máquina cliente para reducir latencia

– Gestiona la replicación a la nube por ti

Page 92: Bases de Datos No Relacionales (NoSQL)

92

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 característica 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 gestión documental

Page 93: Bases de Datos No Relacionales (NoSQL)

93

Ventajas de CouchDB

• Documentos JSON – todo lo que se guarda en CouchDB son simplemente documentos JSON.

• Interfaz RESTful – desde la creación a la replicación a la inserción de datos, toda la gestión de datos en CouchDB puede ser realizada vía HTTP.

• Replicación N-Master – puedes hacer uso de un número ilimitado de ‘masters’, dando lugar a topologías de replicación muy interesantes.

• Escrita para ejecutarse offline – CouchDB puede replicarse en dispositivos (e.j. teléfonos Android) que pueden quedarse sin conexión y gestionar sincronización 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

Page 94: Bases de Datos No Relacionales (NoSQL)

94

¿Quién usa CouchDB?

• Un largo listado de software y websites que hacen uso de CouchDB puede encontrarse en:– http://wiki.apache.org/CouchDB/CouchDB_in_the

_wild?action=show&redirect=InTheWild

Page 95: Bases de Datos No Relacionales (NoSQL)

95

Conceptos clave en CouchDB: Documentos

• Una base de datos en CouchDB es una colección de documentos, donde cada uno está identificado por un ID y contiene un conjunto de campos nombrados:– Los campos pueden ser strings, números, fechas o

incluso listas ordenadas y diccionarios.– Ejemplos de documentos serían:

"Subject": "I like Plankton“,"Tags": ["plankton", "baseball", "decisions"]

Page 96: Bases de Datos No Relacionales (NoSQL)

96

Conceptos clave en CouchDB: Documentos

• Las BBDD CouchDB guardan documentos nombrados de modo unívoco 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 están asociados a un esquema de bases de datos estricto

• Cada documento contiene metadatos (datos sobre datos) como el identificador unívoco del documento (id) y su número de revisión (rev)

• Los campos de un documento pueden ser de varios tipos como strings, números, booleanos, colecciones, etc.

• Cuando se hacen cambios sobre un documento CouchDB se crea una nueva versión del documento, denominado revisión

– Se mantiene un historial de modificaciones gestionado automáticamente por la BBDD• CouchDB no dispone de mecanismos de bloqueo (locking) ante escrituras

Page 97: Bases de Datos No Relacionales (NoSQL)

97

Conceptos clave en CouchDB: Vistas

• Son el mecanismo para añadir estructura a datos semi-estructurados

• El modelo de vistas en CouchDB usa JavaScript para describirlas

• Las vistas son el método para agregar y realizar informes sobre los documentos de un repositorio, siendo creados en demanda para agregar y agregar documentos.

• Las vistas se construyen dinámicamente y no afectan el documento subyacente, puedes tener tantas representaciones de vistas de los mismos datos como gustes.

Page 98: Bases de Datos No Relacionales (NoSQL)

98

Conceptos clave en CouchDB: Vistas

• CouchDB es desestructurado en naturaleza, adolece de un esquema estricto pero provee beneficios en términos 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 añadir estructura a los datos de modo que pueda agregarse para añadir 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 diseño y pueden ser replicadas a través de varias instancias

– Estos documentos de diseño contienen funciones JavaScript que pueden ejecutar consultas mediante el concepto de MapReduce.

• La función Map de la vista recibe un documento como argumento y realiza una serie de cálculos para determinar qué datos deberían ser disponibles en la vista

• Si la vista tiene una función Reduce, es usada para agregar los resultados. A partir de un conjunto de pares clave/valor devuelve un sólo valor.

Page 99: Bases de Datos No Relacionales (NoSQL)

99

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

reduce: function(keys, values) { return sum(values);}

Page 100: Bases de Datos No Relacionales (NoSQL)

100

Conceptos clave en CouchDB: Sin esquema

• CouchDB está diseñado para almacenar y reportar sobre grandes volúmenes de datos orientados a documentos semi-estructurados.

• Con CouchDB, no se impone ningún esquema, nuevos tipos de documentos con distintos campos y significados se pueden unir a los existentes.

• El motor de vistas, apoyado en JavaScript, está diseñado para facilitar la gestión de nuevos tipos de documentos y variados pero similares documentos.

Page 101: Bases de Datos No Relacionales (NoSQL)

101

Conceptos clave: Distribuida

• CouchDB es un sistema distribuido de base de datos basado en nodos – Un número variable de nodos CouchDB (servidores y clientes offline)

pueden tener “copias de réplicas” independientes de la misma BBDD, donde las aplicaciones pueden tener interactividad completa con la BBDD (consultar, añadir, editar y borrar)

• Cuando vuelven a estar online o de modo planificado, los cambios de las bases de datos son replicados bidireccionalmente.

• CouchDB tiene gestión de conflictos incorporada de serie, haciendo que el proceso de replicación sea incremental y rápido, copiando sólo documentos y campos individuales modificados desde la última replicación. – Utiliza Multi-Version Concurrency Control (MVCC)

Page 102: Bases de Datos No Relacionales (NoSQL)

102

Gestión 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 versión del mismo que coexiste con la versión antigua

• Las peticiones se ejecutan en paralelo haciendo que los servidores permitan una alta concurrencia– Una petición de lectura verá siempre la versión más reciente de la

BBDD

Page 103: Bases de Datos No Relacionales (NoSQL)

103

Teorema CAP en CouchDB

• El teorema CAP dice que en BBDD distribuidas sólo dos de los siguientes propiedades pueden cumplirse:– Consistency

• Todas las bases de datos cliente ven los mismos datos, incluso cuando se producen actualizaciones concurrentes.

– Availability• Todos los clientes pueden acceder a los datos.

– Partition tolerance• La base de datos puede partirse a múltiples servidores

• CouchDB sacrifica consistencia inmediata a cambio de obtener un mayor rendimiento a través de distribución de la información

Page 104: Bases de Datos No Relacionales (NoSQL)

104

Detalles técnicos• 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 (añadir, editar y borrar) documentos de la BBDD.

– Los documentos son la unidad de datos primaria en CouchDB y consisten de un número variable de campos y adjuntos

– Las modificaciones sobre documentos (añadir, editar, borrar) son del todo o de nada, o se modifican completamente o fallan completamente.

– El modelo de modificación de documentos de CouchDB es optimista y no hace uso de locks.

– Más detalles genéricos en: http://CouchDB.apache.org/docs/overview.html

Page 105: Bases de Datos No Relacionales (NoSQL)

105

Modelo de Vistas

• Para añadir estructura a datos no estructurados o semi-estructurados, CouchDB incorpora el modelo de vistas– Se crean dinámicamente y no afectan al documento subyacente– Se definen dentro de documentos de diseño– Se replican a otras instancias de la base de datos como si fueran

documentos convencionales• En CouchDB sólo se replican datos, aunque esos datos a menudo (código

JavaScript) puede corresponder a aplicaciones.

• Para garantizar un alto rendimiento, el motor de vistas mantiene índices de sus vistas e incrementalmente las actualiza para reflejar los cambios en la base de datos.

Page 106: Bases de Datos No Relacionales (NoSQL)

106

Map/Reduce en CouchDB

• Usar Map/Reduce tiene ventajas sobre consultas SQL porque pueden ser distribuidas entre varios nodos, algo que no puede hacerse con RDBMS.

• Las bases de datos NoSQL utilizan map/reduce para consultar e indexar la BBDD– map consiste en extraer los datos a procesar – reduce se centra en la agregación de los

mismos.

Page 107: Bases de Datos No Relacionales (NoSQL)

107

Instalación de CouchDB• Dependencias:

• Detalles de instalación:– http://wiki.apache.org/CouchDB/Installation

• Instrucciones detalladas para Windows en: https://github.com/LearningRegistry/LearningRegistry/wiki/Windows-Installation-Guide

– Curl– Visual C++ 2008 Redistributable Setup

» Microsoft Visual C++ 2010 Redistributable Package (x64)• http://www.microsoft.com/en-us/download/details.aspx?id=14632

– OpenSSL– Configurar %PATH% para que apunte a los dirs de instalación dependencias

CouchDBRuntime Build

Spidermonkey Erlang ICU cURL Automake Autoconf

0.9.x ==1.7 >=5.6.0 >= 3.0 >= 7.15.5 >= 1.6.3 >= 2.59

0.10.x >=1.7 && <=1.8.0 >=5.6.5 >= 3.0 >= 7.18.0 >= 1.6.3 >= 2.59

0.11.x >=1.7 >=5.6.5 >= 3.0 >= 7.18.0 >= 1.6.3 >= 2.59

Page 108: Bases de Datos No Relacionales (NoSQL)

108

Instalación en Windows y Linux• Algunos enlaces de ayuda para Windows:

– http://niallodoherty.com/post.cfm/installing-CouchDB-on-windows-quick-guide

– http://wiki.apache.org/CouchDB/Quirks_on_Windows

• Instalación en Linux:– Tan simple como: sudo aptitude install couchdb

– http://wiki.apache.org/couchdb/Installing_on_Ubuntu

• Para lanzar el servidor de CouchDB ejecutar el comando couchdb en el directorio bin de instalación.

Page 109: Bases de Datos No Relacionales (NoSQL)

109

Instalación CouchDB

• Sin embargo, lo más sencillo es:– Ir a CouchBase (http://www.couchbase.com/downloads)– Descargarse el binario de tu plataforma

• Seleccionar Enteprise Edition/Membase Server

– Abrir el administrador gráfico de bases de datos en CouchDB, denominado Futon:

• http://127.0.0.1:5984/_utils/• Recomendable instalar la extensión FireBug para FireFox:

http://getfirebug.com/ :– Permite editar, depurar y monitorizar CSS, HTML y JavaScript dinámicamente

sobre cualquier página» Características descritas en: https://getfirebug.com/whatisfirebug

Page 110: Bases de Datos No Relacionales (NoSQL)

110

CouchDB Futon

• Futon: http://localhost:5984/_utils/• Hace uso internamente de la librería

http://127.0.0.1:5984/_utils/script/jquery.couch.js• Lo primero que hay que hacer es hacer click en Fix

Me para asegurarnos que sólo usuarios autorizados pueden acceder a CouchDB– Nosotros usaremos la combinación admin/enpresadigitala

Page 111: Bases de Datos No Relacionales (NoSQL)

111

La API RESTful JSON• CouchDB ofrece una API como mecanismo para recuperar datos de una BBDD.

– Donde siguiendo la convención 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 vía 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 aplicación web, sin necesidad de hacer uso de un lenguaje de parte servidora

– La herramienta de línea de comando CURL pueden ser usada como cliente de línea 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

Page 112: Bases de Datos No Relacionales (NoSQL)

112

Probando la API RESTful de CouchDB con curl

• $ curl http://127.0.0.1:5984/– Respuesta: {"couchdb":"Welcome","version":"1.2.0"}

• O explícitamente define el tipo de petición realizada a través del parámetro -X de curl:– $ curl -X GET http://127.0.0.1:5984/_all_dbs

• Respuesta: ["_replicator","_users","nerekurtsoak","test_suite_reports","testdb","users"]

• Para crear dos nuevas bases de datos, ejecutaríamos los comandos:– $ curl -uadmin:enpresadigitala -X PUT http://127.0.0.1:5984/fruit

• Respuesta: {"ok":true}– $ curl -uadmin:enpresadigitala -X PUT http://127.0.0.1:5984/vegetables

• Si ejecutamos ahora:– $ curl -X GET http://127.0.0.1:5984/_all_dbs– Obtendríamos:

["_replicator","_users","fruit","nerekurtsoak","test_suite_reports","testdb","users"]

• Si intentamos volver a crear una BBDD ya existente, recibimos un error:– $ curl -X PUT http://127.0.0.1:5984/fruit

• Respuesta: {"error":"file_exists","reason":"The database could not be created, the file already exists.“}

Page 113: Bases de Datos No Relacionales (NoSQL)

113

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 información 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,"purge_seq":0, "compact_running":false,"disk_size":4179,"instance_start_time":"1321991208171560","disk_format_version":5,"committed_update_seq":1}

Page 114: Bases de Datos No Relacionales (NoSQL)

114

Programando CouchDB

• Gracias a la API RESTful, los desarrolladores pueden conectarse a CouchDB usando cualquier software que soporte HTTP

• La mayoría de los lenguajes modernos ofrecen algún tipo de interfaz HTTP, implicando que CouchDB puede ser usada en cualquier proyecto de desarrollo. – Revisar la siguiente página para diferentes clientes

programáticos a CouchDB:• http://wiki.apache.org/CouchDB/Related_Projects

Page 115: Bases de Datos No Relacionales (NoSQL)

115

Primeros pasos con CouchDB

• Vamos a seguir el tutorial en: http://net.tutsplus.com/tutorials/getting-started-with-CouchDB/– Asegúrate de crear una cuenta de admin/enpresadigitala

• Otros tutoriales:– http://www.catswhocode.com/blog/getting-starte

d-with-CouchDB-tutorial-a-beginners-guide

Page 116: Bases de Datos No Relacionales (NoSQL)

116

Primeros pasos en CouchDB

Page 117: Bases de Datos No Relacionales (NoSQL)

117

Primeros Pasos en CouchDB

• En Futon:1. Crearemos la base de datos haciendo click en “Create Database”, de

nombre "nerekurtsoak"2. Hacer click en “New Document”

• Vete añadiendo campos a través de “ADD Field”– "name" : “Curso NoSQL”– "price" : 30

• Guarda cada campo• Guarda el documento

3. Modificar el documento ya existente añadiendo el campo "type" con valor "course"

• La nueva versión del documento debería empezar por 2

Page 118: Bases de Datos No Relacionales (NoSQL)

118

Primeros Pasos en Curl1. Creemos un documento persona.json con el siguiente contenido:

{ "forename": "Diego", "surname": "Lopez-de-Ipina", "type": "person" }

2. Usamos el siguiente comando de CURL para subir el documento a CouchDB:– curl -X POST http://127.0.0.1:5984/nerekurtsoak/ -d

@persona.json -H "Content-Type: application/json"– Se devolvería:

• {"ok":true,"id":"b54b3496d090c43a4266180ecb002a92","rev":"1-93c73d298af443f623db6861f90e9f6e"}

3. Para recuperar todos los documentos:– curl -X GET http://127.0.0.1:5984/nerekurtsoak/_all_docs

Page 119: Bases de Datos No Relacionales (NoSQL)

119

Vista de un documento en Futon

Page 120: Bases de Datos No Relacionales (NoSQL)

120

Creando una función Map

• Seleccionar Temporary View en the Drop View dentro de Futon– La función map tendría el siguiente código:function (doc) {

if (doc.type == "course" && doc.name) { emit(doc.name, doc); } }

– Accede a ella a través del navegador como:• http://127.0.0.1:5984/_utils/database.html?nerekurtsoak/_design

/courses/_view/courses

Page 121: Bases de Datos No Relacionales (NoSQL)

121

Creando un Reduce• Nos aseguraremos de tener al menos dos cursos con precio• Definir la función de mapeo como:

function (doc) { if (doc.type === "course" && doc.price) { emit(doc.id, doc.price); } }

• Definir la función reduce como:function (keys, prices) {      return sum(prices);  }  

• Guardarlo como coursePrices, asegurarse de hacer click en Reduce• Ir a

http://127.0.0.1:5984/_utils/database.html?nerekurtsoak/_design/courseprices/_view/courseprices

Page 122: Bases de Datos No Relacionales (NoSQL)

122

Creando un Reduce

Page 123: Bases de Datos No Relacionales (NoSQL)

123

Documentos de Diseño en CloudDB

• Los documentos de diseño son un tipo especial de documento en CouchDB que contiene código de aplicación:– Vistas MapReduce, validaciones, funciones show, list y update

• Se suele crear un documento de diseño por cada aplicación• El documento de diseño es un documento CouchDB con un ID

que comienza con _design/:– Se replica como otros documentos en la BBDD y soporta gestión de

conflictos a través del parámetro rev• CouchDB mira las vistas y otras funciones de aplicación en él• Los contenidos estáticos de la aplicación aparecen como _attachments en el documento de diseño

Page 124: Bases de Datos No Relacionales (NoSQL)

124

Estructura interna de un Documento de Diseño

• Están compuestos de:– Funciones de validación– Definición de vistas– Funciones show, list y update– Attachments

• Una BBDD CouchDB puede tener varios documentos de diseño.

– _design/calendar– _design/contacts

• Para recuperar un documento de diseño haz un GET con el siguiente patrón de URL:

– http://localhost:5984/mydb/_design/calendar

– http://127.0.0.1:5984/mydb/_design/contacts

Page 125: Bases de Datos No Relacionales (NoSQL)

125

Vistas: funciones map• Las funciones vistas en CouchDB son strings guardados en el campo views del

documento de diseño• Los resultados de un vista se guardan en un B-tree, al igual que todo documento

– Estos árboles permiten realizar búsquedas de filas por clave y recuperar rangos de filas• Todas las funciones map tienen un único parámetro doc:

function(doc) { if(doc.date && doc.title) {

emit(doc.date, doc.title);}

}

• Las funciones map son funciones libres de efectos laterales que toman un documento como argumento y emiten pares clave/valor:

– Generan una lista ordenada por la clave de las filas• Tenemos varios parámetros para recuperar resultados:

– Una sola fila: _design/docs/_view/date?key="2009/01/30 18:04:11"– Varias filas: _design/docs/_view/date?startkey="2010/01/01

00:00:00"&endkey="2010/02/00 00:00:00”&descending=true

Page 126: Bases de Datos No Relacionales (NoSQL)

126

Vistas: funciones reduce• Las funciones reduce operan sobre las filas ordenadas emitidas por las

funciones map• Dada la manera en que los árboles B-tree están estructurados, podemos

cachear los resultados intermedios de un reduce en los nodos no-hoja• El formato de una función reduce en una vista es el siguiente:

function(keys, values, rereduce) {return sum(values)

}

• La función reduce se ejecuta sobre cada nodo del árbol para calcular el resultado final que es un valor escalar:– Cuando se ejecuta sobre las hojas del árbol (que contiene filas del mapa), el

parámetro rereduce es false– Cuando se ejecuta en los nodos internos del árbol, el valor de rereduce es

true

Page 127: Bases de Datos No Relacionales (NoSQL)

127

Configuración de vistas• Se definen en el documento de diseño como sigue:

{ "_id": "_design/application", "_rev": "1-C1687D17", "views": { "viewname": { "map": "function(doc) { ... }", "reduce": "function(keys, values) { ... }" }, "anotherview": { "map": "function(doc) { ... }", "reduce": "function(keys, values) { ... }" } }}

• Para acceder a ellas se realiza un HTTP GET a /database/_design/application/_view/viewname

Page 128: Bases de Datos No Relacionales (NoSQL)

128

Recetas: De SQL a MapReduce

• SELECT field FROM table WHERE value="searchterm“– La función map sería:

function(doc) { if(doc.age && doc.name) { emit(doc.age, doc.name); }}

– Y la consulta:/ladies/_design/ladies/_view/age?key=5

• Documentación: http://guide.CouchDB.org/draft/cookbook.html

Page 129: Bases de Datos No Relacionales (NoSQL)

129

Recetas: De SQL a MapReduce• SELECT field FROM table WHERE value LIKE "searchterm%"

– Para un documento:{ "_id": "Hugh Laurie", "_rev": "1-9fded7deef52ac373119d05435581edf", "mime-type": "image/jpg", "description": "some dude"}

– La función map sería:function(doc) { if(doc["mime-type"]) { var prefix = doc["mime-type"].match(/^[^\/]+\//); if(prefix) { emit(prefix, null); } }}

– Y la consulta:/files/_design/finder/_view/by-mime-type?key="image/"

Page 130: Bases de Datos No Relacionales (NoSQL)

130

Validaciones• CouchDB usa la función validate_doc_update para evitar que documentos inválidos o

no autorizados sean procesados.• CouchDB envía las funciones y documentos a un intérprete de JavaScript• La función validate_doc_update se ejecuta para cada documento a crear o actualizar

– Si lanza una excepción, la actualización es rechazada

• El formato de una función de validación es el siguiente:function(newDoc, oldDoc, userCtx) {

function require(field, message) {message = message || "Document must have a " +

field;if (!newDoc[field]) throw({forbidden : message});

};if (newDoc.type == "post") {

require("title");require("created_at");require("body");require("author");

}}

Page 131: Bases de Datos No Relacionales (NoSQL)

131

Funciones show y list• CouchDB permite generar respuestas en formatos distintos a JSON• Los campos del documento de diseño show y list contienen funciones utilizadas para

transformar documentos JSON en HTML, XML u otros Content-Types• Estas funciones son como acciones de una framework web, pero no tienen efectos laterales,

es decir, solamente realizan peticiones de recuperación de información, no cambian nada o inician procesos o lanzan otras funciones

• Las funciones show se invocan del siguiente modo: – GET /mydb/_design/mydesign/_show/myshow/72d43a93eb74b5f2

• donde myshow es una entrada dentro del campo shows del documento de diseño y 72d43a93eb74b5f2 es la clave del documento a mostrar

• El formato de una función show es:function(doc, req) {

return "<p>Aye aye, " + req.parrot + "!</p>";}

• Se suelen utilizar combinados con plantillas y con macros JavaScript de couchapp como !code y !json

Page 132: Bases de Datos No Relacionales (NoSQL)

132

Función list• Las funciones list en CouchDB permiten generar salida de vistas en cualquier formato

– Son guardadas bajo el campo lists del documento de diseño:{ "_id" : "_design/foo", "_rev" : "1-67at7bg", "lists" : { "bar" : "function(head, req) { var row; while (row = getRow()) { ... } }", "zoom" : "function() { return 'zoom!' }", }}

• La función es invocada con dos argumentos: head y req– Donde head tiene el formato: {total_rows:10, offset:0}– Donde req es el mismo objeto que reciben las funciones show, update y filter, conteniendo: { "info": {

"db_name": "test_suite_db","doc_count": 11,"doc_del_count": 0,"update_seq": 11,"purge_seq": 0,"compact_running": false,"disk_size": 4930,"instance_start_time": "1250046852578425","disk_format_version": 4},

"method": "GET","path": ["test_suite_db","_design","lists","_list","basicJSON","basicView"],"query": {"foo":"bar"},"headers":

{"Accept": "text/html,application/xhtml+xml ,application/xml;q=0.9,*/*;q=0.8","Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7","Accept-Encoding":"gzip,deflate","Accept-Language": "en-us,en;q=0.5","Connection": "keep-alive", …}"body": "undefined","form": {},"userCtx": {"db": "test_suite_db","name": null,"roles": ["_admin"]}

}

Page 133: Bases de Datos No Relacionales (NoSQL)

133

Función list• Para ejecutar una función list usamos el siguiente formato:

/db/_design/foo/_list/list-name/view-name– Dado que el nombre de la lista y de la vista son especificados, esto implica que es

posible usar la lista para más de una vista.• Una función list de ejemplo sería:

function(head, req) { var row; start({ "headers": { "Content-Type": "text/html" } }); while(row = getRow()) { send(row.value); }}

• Documentación de funciones show y list en: http://wiki.apache.org/CouchDB/Formatting_with_Show_and_List

Page 134: Bases de Datos No Relacionales (NoSQL)

134

Función update• La función update se utiliza para gestionar POSTs y transformarlos en nuevos documentos

– Son funciones que los clientes invocan para crear o actualizar documentos– Devuelven el nuevo documento y una respuesta al cliente– Para modificar, enviar petición PUT en el formato:

• /<database>/_design/<design>/_update/<function>/<docid>

– Para crear una nueva instancia, hacer POST en el formato: • /<database>/_design/<design>/_update/<function>

• En el documento de diseño se crearía lo siguiente:{ updates: { "hello" : "function(doc, req) { if (!doc) { if (req.id) { return [{ _id : req.id }, 'New World'] } return [null, 'Empty World']; } doc.world = 'hello'; doc.edited_by = req.userCtx; return [doc, 'hello doc']; }}

• Documentación en: http://wiki.apache.org/CouchDB/Document_Update_Handlers

Page 135: Bases de Datos No Relacionales (NoSQL)

135

CouchApp• A CouchApp es una framework para la creación 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 código en tu aplicación y volcarlos a una instancia de CouchDB:

• http://couchapp.org/page/couchapp-python

Page 136: Bases de Datos No Relacionales (NoSQL)

136

CouchApp

• CouchApp te simplifica la labor de crear aplicaciones web a partir de CouchDB:– Fragmenta un documento de diseño en un conjunto de directorios y

ficheros del sistema local, representando views, shows, validations, attachments, etc. que serán enviados al servidor CouchDB

• Una aplicación de Couch, CouchApp, sigue más o menos el patrón de diseño Modelo/Vista/Controlador:– CouchDB es el Modelo– El árbol DOM representando el HTML mostrado al usuario sería la vista– El JavaScript sería el Controller

Page 137: Bases de Datos No Relacionales (NoSQL)

137

Instalación de CouchApp

• Requiere la última versión de Python 2.x– Para las distintas plataformas seguir las instrucciones en:

• http://couchapp.org/page/installing– En Windows:

• Seguir instrucciones de: http://couchapp.org/page/windows-python-installers

– Instalar Python 2.7.2: http://www.python.org/download/releases/2.7.2/– Instalar la herramienta setuptools que incluye instalador de aplicaciones

que permite descargar, construir, instalar y gestionar paquetes Python automáticamente

» http://packages.python.org/distribute/easy_install.html• Añadir a PATH C:\Programming\Python27\Scripts

– Instalar las extensiones de Python para Windows: pywin32-214.win32-py2.7.exe

– Instalar Couchapp-0.7.5.win32.exe

Page 138: Bases de Datos No Relacionales (NoSQL)

138

Hola Mundo con CouchApp• Los pasos a seguir serán los siguientes:

1. Usar el comando couchapp para que genere la estructura de tu aplicación:

• couchapp generate helloworld

2. Crear una función show que devuelve el mensaje "Hello world"• cd helloworld• couchapp generate show hello• Editar el fichero generado "hello.js" con el siguiente contenido:

function(doc, req) { return "Hello World";

}

3. Subirlo a tu servidor de bases de datos, bajo la base de datos, http://127.0.0.1:5984/testdb :• couchapp push testdb• couchapp push . http://admin:[email protected]:5984/testdb

Page 139: Bases de Datos No Relacionales (NoSQL)

139

Hola Mundo con CouchApp4. Comprobar que se ha subido correctamente yendo a:

• http://127.0.0.1:5984/testdb/_design/helloworld/_show/hello

5. Se puede clonar una aplicación ya existente con el siguiente comando, que cogería una nueva versión en helloworld2:

• couchapp clone http://127.0.0.1:5984/testdb/_design/helloworld helloworld2

Page 140: Bases de Datos No Relacionales (NoSQL)

140

Mi primera aplicación seria con CouchApp

• El objetivo es crear un libro de direcciones usando HTML5 servido desde CouchApp– Cogido de:

http://blog.edparcell.com/using-jquery-and-CouchDB-to-build-a-simple-we• Los pasos a seguir:

1. Crear base de datos "addressbook" con Futon2. Crea los siguientes dos documentos en la base de datos:

{"type": "address", "name": "Fred", "mobile": "555-0001"}  

{"type": "address", "name": "Barney", "mobile": "555-0002"}

3. Generamos la aplicación y una vista para ella, subiendo la aplicación:• couchapp generate app addressbook• couchapp generate view addressbook phonenumbers• couchapp push addressbook http://127.0.0.1:5984/addressbook

Page 141: Bases de Datos No Relacionales (NoSQL)

141

Mi primera aplicación seria con CouchApp

4. Una vez creada la vista, la editamos de la siguiente manera:– Borramos addressbook/views/phonenumbers/reduce.js– Editamos el fichero addressbook/views/phonenumbers/map.js

con:function(doc) {

if (doc.type && doc.type == "address" && doc.name && doc.mobile) { emit(doc.name, doc.mobile); }

}

5. Comprueba que funciona la vista yendo a: http://127.0.0.1:5984/addressbook/_design/addressbook/_view/phonenumbers

Page 142: Bases de Datos No Relacionales (NoSQL)

142

Mi primera aplicación seria con CouchApp

6. Modifica el contenido de _attachments \index.html con lo siguiente, súbelo a CouchDB y vete a http://127.0.0.1:5984/addressbook/_design/addressbook/index.html:<!DOCTYPE html><html>  <head>    <title>Simple address book</title>    <link rel="stylesheet" href="style/main.css" type="text/css"><span style="white-space: pre;"> </span><script src="/_utils/script/json2.js"></script><span style="white-space: pre;"> </span><script

src="/_utils/script/jquery.js?1.3.1"></script><span style="white-space: pre;"> </span><script src="/_utils/script/jquery.couch.js?

0.9.0"></script><span style="white-space: pre;"> </span><script type="text/javascript"><span style="white-space: pre;"> </span></script>  </head>  <body>    <h1>Simple address book</h1><span style="white-space: pre;"> </span><div id="add"><button type="button"

id="add">Add</button></div>    <div id="addressbook"></div>  </body></html>

Page 143: Bases de Datos No Relacionales (NoSQL)

143

Mi primera aplicación seria con CouchApp

7. Modificamos el index.html introduciendo JavaScript que se activa cuando la página acaba de cargarse.– El código añadido recupera un documento JSON de la vista phonenumbers desde CouchDB– Itera sobre cada fila de la vista, añadiendo un elemento div por cada fila conteniendo el nombre, phonenumber y enlaces para editarlos

y borrarlos:$db = $.couch.db("addressbook"); function refreshAddressbook(){ $("div#addressbook").empty(); $db.view("addressbook/phonenumbers", { success: function(data){

for (i in data.rows) { id = data.rows[i].id; name = data.rows[i].key; phonenumber = data.rows[i].value; html = '<div class="address">' +

'<span class="name">' + name + '</span>&nbsp;' + '<span class="phonenumber">' + phonenumber + '</span>&nbsp; ' +'<a href="#" id="' + id + '" class="edit">edit</a>&nbsp;|&nbsp;' +'<a href="#" id="' + id + '" class="delete">delete</a>' +'</div>';

$("div#addressbook").append(html); }

} });}$(document).ready(function() { refreshAddressbook(); });

8. Lo subimos al servidor: couchapp push addressbook http://127.0.0.1:5984/addressbook

Page 144: Bases de Datos No Relacionales (NoSQL)

144

Mi primera aplicación seria con CouchApp

9. Para añadir elementos añadimos el siguiente formulario web:function addUpdateForm(target, existingDoc) {

html = '<form name="update" id="update" action=""><table>' + '<tr><td>Name</td><td>Number</td></tr>' + '<tr>' + '<td><input type="text" name="name" id="name" value="' +

(existingDoc ? existingDoc.name : "" ) + '"></td>' + '<td><input type="text" name="mobile" id="mobile" value="' +

(existingDoc ? existingDoc.mobile : "") + '"></td>' + '</tr><tr>' + '<td><input type="submit" name="submit" class="update" value="' +

(existingDoc ? "Update" : "Add") + '"></td>' + '<td><input type="submit" name="cancel" class="cancel"

value="Cancel"/></td>' + '</tr>' + '</table></form>';

target.append(html);target.children("form#update").data("existingDoc", existingDoc);

}

10. Para editar el formulario deberíamos hacer:id = $tgt.attr("id");if ($tgt.hasClass("edit")){ if ($tgt.hasClass("edit")) { $("button#add").show(); $("form#update").remove(); $db.openDoc(id, { success: function(doc) { addUpdateForm($tgt.parent(), doc);

}}); }}

Page 145: Bases de Datos No Relacionales (NoSQL)

145

Mi primera aplicación seria con CouchApp

11. Y para añadirlo:$("button#add").click(function(event) { $("form#update").remove(); $("button#add").hide(); addUpdateForm($("div#add"));});

12. Finalmente añadimos la parte de lógica para añadir y editar elementos:$("input.update").live('click', function(event) { var $tgt = $(event.target); var $form = $tgt.parents("form#update"); var $doc = $form.data('existingDoc') || {}; $doc.type = "address"; $doc.name = $form.find("input#name").val(); $doc.mobile = $form.find("input#mobile").val(); $db.saveDoc( $doc, { success: function(){

$("button#add").show(); $("form#update").remove(); refreshAddressbook(); }

} ); return false;})

Page 146: Bases de Datos No Relacionales (NoSQL)

146

Mi primera aplicación seria con CouchApp

13. Modify index.html to allow contact deleting:$(document).ready(function() { refreshAddressbook(); $("div#addressbook").click(function(event) { var $tgt = $(event.target);

if ($tgt.is('a')) { id = $tgt.attr("id");

if ($tgt.hasClass("edit")) { // TODO: implement edit functionality } if ($tgt.hasClass("delete")) { html = '<span class="deleteconfirm">Sure? <a href="#"

class="dodelete">Yes</a> <a href="#" class="canceldelete">No</a></span>'; $tgt.parent().append(html); } if ($tgt.hasClass("dodelete")) { $db.openDoc(id, { success: function(doc) { $db.removeDoc(doc, { success: function() {

$tgt.parents("div.address").remove(); }}) }}); } if ($tgt.hasClass("canceldelete")) { $tgt.parents("span.deleteconfirm").remove(); } }

}); });

Page 147: Bases de Datos No Relacionales (NoSQL)

147

Mi primera aplicación seria con CouchApp

14. Finalmente habría que subir la aplicación a CouchDB con el comando:$ cd <parent-dir-addressbook-app>$ couchapp push addressbook

http://admin:[email protected]:5984/addressbook

• Un ejemplo completo de CouchApp que incluye todas las características (funciones) de un documento de diseño puede encontrarse en:

– Sofa-blog: https://github.com/jchris/sofa• Para instalar: couchapp push .

http://admin:[email protected]:5984/myblogdb

– La implementación de esta aplicación es descrita paso a paso en: http://guide.CouchDB.org/editions/1/en/standalone.html

Page 148: Bases de Datos No Relacionales (NoSQL)

148

Escalabilidad en CouchDB• CouchDB permite hacer escalado en tres

niveles:– Escalando peticiones de lectura

• Se resuelve mediante una caché

– Escalando peticiones de escritura• Hay que utilizar técnicas de scaling

– Escalando datos• La solución es dividir los datos en cachos (chunks) y

colocarlos en diferentes servidores– Todos los servidores conteniendo chunks conforman un

clúster

Page 149: Bases de Datos No Relacionales (NoSQL)

149

Replicación en CouchDB

• La replicación sincroniza dos copias de la misma BBDD, permitiendo que los usuarios tengan baja latencia de acceso a datos independientemente de su localización– La replicación consiste en enviar una petición HTTP a un

servidor CouchDB incluyendo una BBDD de origen y otra de destino, haciendo que CouchDB envíe los cambios del origen al destino:

• POST /_replicate HTTP/1.1 {"source":"database","target":http://example.org/database}

Page 150: Bases de Datos No Relacionales (NoSQL)

150

Replicación en CouchDB• Para enviar cambios se sigue utilizando la misma llamada

– Cuando solicitas a CouchDB que replique una BBDD en otra, comparará ambas para encontrar qué documentos en el origen difieren de los del destino y luego enviará todos los cambios al destino en batch

• Las bases de datos en CouchDB tienen un número de secuencia que es incrementado cada vez que la BBDD se cambia

• Hay diferentes modos de replicación:– Replicación normal, en demanda– Replicación continua, cada vez que produce un cambio éste se

propaga• Añades "continuous":true al objeto de lanzamiento de replicación• CouchDB hará uso de la _changes API sobre cambios en documentos

Page 151: Bases de Datos No Relacionales (NoSQL)

151

Replicación con Futon• Abre tu navegador en Futon: http://127.0.0.1:5984/_utils/

– Haz clic en Replicator– Selecciona BBDD a replicar– Haz clic en continuous– Haz clic en el botón Replicate

• Alternativamente desde línea de comando: – curl -uadmin:enpresadigitala -X DELETE

http://127.0.0.1:5984/nerekurtsoak_rep2– curl -uadmin:enpresadigitala -X PUT

http://127.0.0.1:5984/nerekurtsoak_rep2– curl -uadmin:enpresadigitala -X POST

http://127.0.0.1:5984/_replicate -H "Content-Type: application/json" -d @replication-example.json

• Donde replication-example.json contiene:– '{"source":"http://127.0.0.1:5984/nerekurtsoak",

"target":http://admin:[email protected]:5984/nerekurtsoak_rep2, "continuous":true}'

Page 152: Bases de Datos No Relacionales (NoSQL)

152

Gestión de Conflictos

• Cuando replicas dos BBDD en CouchDB y se identifican conflictos, CouchDB los señala en los documentos afectados con el atributo "_conflicts":true– La versión que es seleccionada como última es la versión ganadora. – La revision perdedora es almacenada como versión anterior.– CouchDB no hace un merge de las revisiones conflictivas.

• Tu aplicación es la que resuelve programáticamente los conflictos

– La replicación garantiza que los conflictos se detecten y que cada instancia de CouchDB haga la misma selección respecto a ganadores y

perdedores, independientemente de las instancias que existan.

Page 153: Bases de Datos No Relacionales (NoSQL)

153

Resolución de conflictos por ejemplo

• La base de datos A se replica en B:

• Creamos un documento en A

• Forzamos replicación:

Page 154: Bases de Datos No Relacionales (NoSQL)

154

Resolución de conflictos por ejemplo

• Creamos una nueva versión del documento en B:

• Añadimos una nueva versión en A:

Page 155: Bases de Datos No Relacionales (NoSQL)

155

Resolución de conflictos por ejemplo

• Cuando replicamos ahora A en B, se detecta un conflicto:

• La aplicación resuelve el conflicto

Page 156: Bases de Datos No Relacionales (NoSQL)

156

Puesta en práctica de Replicación

• Creamos una BD y una réplica:– curl -uadmin:enpresadigitala -X PUT 127.0.0.1:5984/db

– curl -uadmin:enpresadigitala -X PUT 127.0.0.1:5984/db-replica

– curl -uadmin:enpresadigitala -X PUT 127.0.0.1:5984/db/foo -d @foo.json

– curl -uadmin:enpresadigitala -X POST http://127.0.0.1:5984/_replicate -H "Content-Type: application/json" -d @replication-conflict-example.json

Page 157: Bases de Datos No Relacionales (NoSQL)

157

Puesta en práctica de Replicación

– Actualizamos ahora el documento en db-replica a la versión 2:• curl -X PUT 127.0.0.1:5984/db-replica/foo -d '{"count":2,"_rev":"1-74620ecf527d29daaab9c2b465fbce66"}'

– Creamos el conflicto cambiando la versión del documento en db a 3:• curl -uadmin:enpresadigitala -X PUT 127.0.0.1:5984/db/foo -d '{"count":3,"_rev":"1-74620ecf527d29daaab9c2b465fbce66"}‘

– Volvemos a replicar la BBDD:• curl -uadmin:enpresadigitala -X POST http://127.0.0.1:5984/_replicate -H "Content-Type: application/json" -d @replication-conflict-example.json

Page 158: Bases de Datos No Relacionales (NoSQL)

158

Puesta en práctica de Replicación

– Para ver si tenemos conflictos creamos una vista en db-replica con Futon con el siguiente contenido:function(doc) { if(doc._conflicts) { emit(doc._conflicts, null); }}

– Ejecutamos la vista yendo a: http://127.0.0.1:5984/db-replica/_design/conflicts/_view/conflicts

• Resultado: {"total_rows":1,"offset":0,"rows":[ {"id":"foo","key":["2-7c971bb974251ae8541b8fe045964219"],"value":null} ]}

– La revisión con el mayor número histórico de revisiones o con una clave de revisión menor que la otra es la seleccionada

Page 159: Bases de Datos No Relacionales (NoSQL)

159

Algunos ejemplos de CouchApp

• Revisar documentación en:– http://couchapp.org/page/index

• Instalación de Pages:couchapp push pages http://admin:[email protected]:5984/pages

– Ir a: http://127.0.0.1:5984/pages/_design/pages/_rewrite/page/index

Page 160: Bases de Datos No Relacionales (NoSQL)

160

Notificaciones de cambios

• CouchDB ofrece un mecanismo de subscripciones a cambios mediante la API _changes

• La API _changes suministra información en el siguiente formato:– {"seq":12,"id":"foo","changes":[{"rev":"1-23202479633c2b380f79507a776743d5"}]}

• Donde seq es un valor que va cambiando cada vez que se produce un cambio en una BBDD

• id es el identificador del documento• El campos changes suele contener una descripción de las últimas

modificaciones

Page 161: Bases de Datos No Relacionales (NoSQL)

161

Probando la API _changes• Creamos una BBDD:

– $ curl -X PUT http://127.0.0.1:5984/db-changes

• Revisamos si ha habido cambios:– $ curl -X GET http://127.0.0.1:5984/db-changes/_changes

• Devuelve:– {"results":[], "last_seq":0}

• Añadimos un documento:– $ curl -X PUT http://127.0.0.1:5984/db-changes/test -d

'{"name":"Anna"}‘

• Revisamos si ha habido cambios de nuevo:– {"results":[{"seq":1,"id":"test","changes":[{"rev":"1-

aaa8e2a031bca334f50b48b6682fb486"}]}], "last_seq":1}

• Podemos usar el parámetro since para filtrar resultados y longpoll para quedarse bloqueado hasta un nuevo cambio:

– $ curl -X GET $HOST/db/_changes?feed=longpoll&since=1

Page 162: Bases de Datos No Relacionales (NoSQL)

162

Probando la API _changes• Long polling requiere abrir una nueva conexión HTTP por cada cambio notificado.• La API continuous changes permite establecer una conexión permanente entre tu aplicación y

CouchDB para recibir cambios:– $ curl -X GET "$HOST/db/_changes?feed=continuous&since=3"

• Podemos definir filtros para refinar los cambios en los que estamos interesados. Por ejemplo:{ "_id": "_design/app", "_rev": "1-b20db05077a51944afd11dcb3a6f18f1", "filters": { "important":

"function(doc, req) { if(doc.priority == 'high') { return true; } else { return false; } }" }}

• Para ver los cambios filtrados invocaríamos: $ curl "$HOST/db/_changes?filter=app/important"

Page 163: Bases de Datos No Relacionales (NoSQL)

163

APIs JavaScript para CouchApp

• Tutorial de JSON:– http://guide.CouchDB.org/editions/1/en/json.html

• Tutoriales de jQuery:– http://docs.jquery.com/Tutorials– jQuery.ajax():

• http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

• Hay un plugin jQuery para CouchDB:– http://bradley-holt.com/2011/07/CouchDB-jquery-plugin-r

eference/– API en:

• http://daleharvey.github.com/jquery.couch.js-docs/symbols/index.html

Page 164: Bases de Datos No Relacionales (NoSQL)

164

Mustache• Una manera cómoda de generar documentos HTML es a través de librerías de plantillas como Mustache

– Funciona expandiendo tags en una plantilla usando valores de un mapa

• Ejemplo:– El texto de entrada sería:

Hello {{name}}You have just won ${{value}}!{{#in_ca}}Well, ${{taxed_value}}, after taxes.{{/in_ca}}

– Dado el siguiente diccionario:{ "name": "Chris", "value": 10000, "taxed_value": 10000 - (10000 * 0.4), "in_ca": true}

– Produciría los siguientes resultados:Hello ChrisYou have just won $10000!Well, $6000.0, after taxes.

• Tutorial en: http://mustache.github.com/mustache.5.html

Page 165: Bases de Datos No Relacionales (NoSQL)

165

Evently• Evently es un librería sobre jQuery que define atajos para facilitar la mezcla de eventos estándar y propietarios, reduciendo

significativamente el código utilizado• Dado el siguiente código en jQuery:

$("#myelement").bind("click", function() {

$(this).text("You clicked me.");});$("#myelement").bind("mouseenter", function() { $(this).text("You moused over me.");});$("#myelement").bind("loggedIn", function(e, user) { $(this).text("You are logged in.");});$("#logIn").bind("click", function() { $("#myelement").trigger("loggedIn", ["Dr. Pepper"]);})

• En Evently se escribiría:$("#another").evently({ click : function() { $(this).text("You clicked me."); }, mouseenter : function() { $(this).text("You moused me."); }, loggedIn : function(e, name) { $(this).text("You are logged in, " + name); }});

• Tutorial en: http://couchapp.org/page/evently-primer y http://jameswestby.net/weblog/tech/20-couchapp-walkthrough-part-3-evently.html

Page 166: Bases de Datos No Relacionales (NoSQL)

166

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++• Es quizás el motor NoSQL más popular• Usada por SourceForge, Bit.ly, Foursquare o GitHub• URL: http://www.mongodb.org/

Page 167: Bases de Datos No Relacionales (NoSQL)

167

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 dinámico , haciendo que la integración de los datos en ciertas aplicaciones sea mas fácil y rápida.

• The MongoDB Manual:– http://docs.mongodb.org/manual/

Page 168: Bases de Datos No Relacionales (NoSQL)

168

Características Principales• Consultas Ad hoc

– MongoDB soporta la búsqueda por campos, consultas de rangos y expresiones regulares. Las consultas pueden devolver un campo específico del documento pero también puede ser una función JavaScript definida por el usuario.

• Indexación– 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.• Replicación

– MongoDB soporta el tipo de replicación maestro-esclavo. El maestro puede ejecutar comandos de lectura y escritura. El esclavo puede copiar los datos del maestro y sólo 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 serán distribuidos los datos en una colección. los datos son divididos en rangos (basado en la llave shard) y distribuidos a través de múltiples shard.

– Un shard es un maestro con uno o más esclavos. – MongoDB tiene la capacidad de ejecutarse en múltiple 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 replicación

de datos utilizando múltiples servidores para el almacenamiento de archivos. – Esta función (que es llamada GridFS ) está incluida en los drivers de MongoDB y disponible para los lenguajes de programación que soporta MongoDB.

• Agregación– La función MapReduce puede ser utilizada para el procesamiento por lotes de datos y operaciones de agregación. Esta función permite que los usuarios

puedan obtener el tipo de resultado que se obtiene cuando se utiliza el comando SQL “group-by”.

• Ejecución 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.

Page 169: Bases de Datos No Relacionales (NoSQL)

169

Casos de uso de MongoDB• Almacenamiento y registro de eventos• Para sistemas de manejo de documentos y contenido• Comercio Electrónico• Juegos• Problemas de alto volumen• Aplicaciones móviles• Almacén de datos operacional de una página Web• Manejo de contenido• Almacenamiento de comentarios

– Votaciones– Registro de usarios– Perfiles de usuarios– Sesiones de datos

• Proyectos que utilizan metodologías de desarrollo iterativo o ágiles• Manejo de estadísticas en tiempo real

Page 170: Bases de Datos No Relacionales (NoSQL)

170

Manipulación de Datos: colecciones y documentos

• MongoDB guarda la estructura de los datos en documentos tipo JSON con un esquema dinámico 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 colección puede tener un número indeterminado de documentos– Las colecciones son como tablas y los documentos – Cada documento en una colección 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 programación– Como valor se pueden usar números, cadenas o datos binarios como

imágenes o cualquier otro “key-value pairs”.

Page 171: Bases de Datos No Relacionales (NoSQL)

171

Ejemplo de documento en MongoDB

{ "_id":

ObjectId("4efa8d2b7d284dad101e4bc7"), "Last Name": "PELLERIN", "First Name": "Franck", "Age": 29, "Address": { "Street": "1 chemin des Loges", "City": "VERSAILLES" }}

Page 172: Bases de Datos No Relacionales (NoSQL)

172

Utilidades de MongoDB• Los siguientes comandos pueden ser instalados para el manejo y la administración del sistema de base de

datos:• mongo: es un Shell interactivo que permite a los desarrolladores ver, insertar, eliminar y actualizar datos

en su base de datos. Este también permite entre otras funciones la replicación de información, configurar los Shards, apagar los servidores y ejecutar JavaScript.

• mongostat: es un instrumento de línea de comandos que muestra en resumen una lista de estadísticas de una instancia de MongoDB en ejecución. Esto te permite visualizar cuantas inserciones, actualizaciones, eliminaciones, consultas y comandos se han ejecutado, pero también cuanta memoria esta utilizando y cuanto tiempo ha estado cerrada la base de datos.

• mongotop: es un instrumento de línea de comandos que provee un método para dar seguimiento a la cantidad de tiempo que dura una la lectura o escritura de datos en una instancia. También provee estadísticas en el nivel de cada colección.

• mongosniff: es un instrumento de línea de comandos que provee un sniffing en la base de datos haciendo un sniffing en el tráfico de la red que va desde y hacia MongoDB.

• mongoimport/mongoexport: es un instrumento de línea de comandos que facilita la importación exportación de contenido desde JSON, CSV o TSV. También tiene el potencial de importar o exportar hacia otros formatos.

• mongodump/mongorestore: es un instrumento de línea de comandos para la creación de una exportación binaria del contenido de la base de datos. Estos comandos son utilizado para la estrategia de copias de seguridad cuando se utiliza MongoDB.

Page 173: Bases de Datos No Relacionales (NoSQL)

173

Documentación e instalación• La documentación 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>mongoMongoDB shell version: 2.0.6connecting to: test> db.test.save( {a:1} )> db.test.find(){ "_id" : ObjectId("4fe6e41b184d3a26629be9b6"), "a" : 1 }>

Page 174: Bases de Datos No Relacionales (NoSQL)

174

Usando MongoDB• mongo es un shell JavaScript completo, cualquier función JavaScript, sintáxis o clase puede

usarse en el shelluse mydbj = { 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 itemsit// Store the cursor of the DB in a variablevar cursor = db.things.find();while (cursor.hasNext()) printjson(cursor.next());// Use functional features of JavaScriptdb.things.find().forEach(printjson);// cursor like an arrayvar cursor = db.things.find();printjson(cursor[4]);// The query expression is an document itself. db.things.find({name:"mongo"}).forEach(printjson);db.things.find({x:4}).forEach(printjson);db.things.find({x:4}, {j:true}).forEach(printjson);

Page 175: Bases de Datos No Relacionales (NoSQL)

175

Documentos de consulta• Documentos que indican el patrón 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 restricción:• printjson(db.things.findOne({name:"mongo"}));

– Limitar el número de resultados:• db.things.find().limit(3);

• More info at:– SQL to Mongo Mapping Chart

• http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart

Page 176: Bases de Datos No Relacionales (NoSQL)

176

GridFS

• GridFS is a specification for storing large files in MongoDB– The database supports native storage of binary data

within BSON objects– BSON objects in MongoDB are limited in size (4MB older versions,

16MB in v1.7/1.8, higher limits in the future)

• GridFS spec provides a mechanism for transparently dividing a large file among multiple documents– Each file has a metadata object in a files collection, and one or more

chunk objects in a chunks collection.

• URL: http://www.mongodb.org/display/DOCS/GridFS– Specification:

http://www.mongodb.org/display/DOCS/GridFS+Specification

Page 177: Bases de Datos No Relacionales (NoSQL)

177

MongoDB and Java

• Java Tutorial: http://www.mongodb.org/display/DOCS/Java+Tutorial

• Una lista de buenos ejemplos en MongoDB programados con Java:– http://www.mkyong.com/tutorials/java-mongodb-tutorials

/

• Ejemplo using GridFS con MongoDB– http://www.mkyong.com/mongodb/java-mongodb-save-i

mage-example/

Page 178: Bases de Datos No Relacionales (NoSQL)

178

Comparación de BBDD NoSQL• Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase

vs Neo4j comparison– http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

• NoSQL: Comparing the Different Solutions– http://www.readwriteweb.com/cloud/2010/11/nosql-comparison.php

• Is the Relational Database Doomed?– http://www.readwriteweb.com/enterprise/2009/02/is-the-relational-database

-doomed.php

• Comparing Document Databases to Key-Value Stores– http://nosql.mypopescu.com/post/659390374/comparing-document-

databases-to-key-value-stores

Page 179: Bases de Datos No Relacionales (NoSQL)

179

Comparación de BBDD NoSQL• Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase

vs Neo4j comparison– http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

• NoSQL: Comparing the Different Solutions– http://www.readwriteweb.com/cloud/2010/11/nosql-comparison.php

• Is the Relational Database Doomed?– http://www.readwriteweb.com/enterprise/2009/02/is-the-relational-database

-doomed.php

• Comparing Document Databases to Key-Value Stores– http://nosql.mypopescu.com/post/659390374/comparing-document-

databases-to-key-value-stores

Page 180: Bases de Datos No Relacionales (NoSQL)

180

NoSQL or not NoSQL?• En NoSQL, generalmente los datos son recuperados de manera mucho más rápida

que en un RDBMS, sin embargo las consultas que se pueden hacer son más limitadas y requieren trasladar complejidad a la aplicación

• 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 estadísticas, filtros, agrupaciones o ordenación.• Desde un punto de vista de sistemas deberíamos considerar la combinación de

SQL y NoSQL:– LinkedIn comenzó sólo con un RDBMS, pero desarrolló su propia BBDD NoSQL

(Voldemort)– Facebook tienen una arquitectura híbrida con Memcached y MySQL junto a un OLTP

(envío de mensajes al Wall), y Cassandra para la búsqueda en la bandeja de entrada

Page 181: Bases de Datos No Relacionales (NoSQL)

181

NoSQL or not NoSQL?• Los principales problemas de NoSQL son:

– Su complejidad:• Instalación• Consultas (comprender bien MapReduce)• Los modelos de datos usados

– Su falta de madurez• ¿Dónde usarlas?

– Datos sociales– Procesado de datos (Hadoop)– Búsqueda (Lucene)– Caching (Memcache)– Data Warehousing

• ¿Qué problema quieres resolver?– Transacciones– Grandes volúmenes de datos (Exabytes)– Estructura de los datos

Page 182: Bases de Datos No Relacionales (NoSQL)

182

Conclusión

• Las BBDD NoSQL son una clara alternativa a los RDBMS– Sobre todo para algunas aplicaciones sociales y web que requieren

elevada escalabilidad

• No son idóneas para todo, de hecho en la mayoría de los casos las RDBMS deberían seguir siendo la primera opción:– La capacidad de hacer JOIN y las garantías ACID son muy importantes

para muchas aplicaciones

• Es muy posible que los RDBMS actuales evolucionen para incorporar capacidades de NoSQL

Page 183: Bases de Datos No Relacionales (NoSQL)

183

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/

Page 184: Bases de Datos No Relacionales (NoSQL)

184

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

Page 185: Bases de Datos No Relacionales (NoSQL)

185

Referencias• NoSQL vs. RDBMS

– 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:2664632900346253817

– 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

Page 186: Bases de Datos No Relacionales (NoSQL)

186

Bases de Datos No Relacionales (NoSQL) 29, 30 y 31 de Octobre de 2012, 18:00-21:00 , Aula 104, ESIDEMáster en Desarrollo e Integración de Soluciones Software,

Facultad de Ingeniería, Universidad de Deusto

Dr. Diego Lz. de Ipiña Glz. de ArtazaDeustoTech-INTERNET2, DeustoTech – Deusto Institute of Technology, Universidad de Deusto

[email protected] http://paginaspersonales.deusto.es/dipina

http://www.morelab.deusto.es