Bases de Datos No Relacionales (NoSQL)

dipina 22,086 views 186 slides Nov 08, 2012
Slide 1
Slide 1 of 186
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96
Slide 97
97
Slide 98
98
Slide 99
99
Slide 100
100
Slide 101
101
Slide 102
102
Slide 103
103
Slide 104
104
Slide 105
105
Slide 106
106
Slide 107
107
Slide 108
108
Slide 109
109
Slide 110
110
Slide 111
111
Slide 112
112
Slide 113
113
Slide 114
114
Slide 115
115
Slide 116
116
Slide 117
117
Slide 118
118
Slide 119
119
Slide 120
120
Slide 121
121
Slide 122
122
Slide 123
123
Slide 124
124
Slide 125
125
Slide 126
126
Slide 127
127
Slide 128
128
Slide 129
129
Slide 130
130
Slide 131
131
Slide 132
132
Slide 133
133
Slide 134
134
Slide 135
135
Slide 136
136
Slide 137
137
Slide 138
138
Slide 139
139
Slide 140
140
Slide 141
141
Slide 142
142
Slide 143
143
Slide 144
144
Slide 145
145
Slide 146
146
Slide 147
147
Slide 148
148
Slide 149
149
Slide 150
150
Slide 151
151
Slide 152
152
Slide 153
153
Slide 154
154
Slide 155
155
Slide 156
156
Slide 157
157
Slide 158
158
Slide 159
159
Slide 160
160
Slide 161
161
Slide 162
162
Slide 163
163
Slide 164
164
Slide 165
165
Slide 166
166
Slide 167
167
Slide 168
168
Slide 169
169
Slide 170
170
Slide 171
171
Slide 172
172
Slide 173
173
Slide 174
174
Slide 175
175
Slide 176
176
Slide 177
177
Slide 178
178
Slide 179
179
Slide 180
180
Slide 181
181
Slide 182
182
Slide 183
183
Slide 184
184
Slide 185
185
Slide 186
186

About This Presentation

No description available for this slideshow.


Slide Content

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

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

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/NoSQL-cd.rar

El Futuro del Desarrollo Software

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 Internet 1 Merrill Lynch: Cloud computing market opportunity by 2011 = $95bn in business and productivity apps + $65bn in online advertising = $160bn (1) Source: IBM

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

Forrester Research “A pool of abstracted, highly scalable, and managed compute infrastructure capable of hosting end-customer applications and billed by consumption 1 ” 1- “Is Cloud Computing Ready for The Enterprise?” Forrester Research, Inc.

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

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

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

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

Arquitectura Cloud Computing

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,…

Diferentes Manifestaciones

Cloud Computing vs. Centros de Datos Tradicionales

Componentes de Cloud Computing

Taxonomía de Cloud Computing

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 Extender s

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

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

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

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

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

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

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/

Amazon Web Services (AWS)

Amazon Web Services (AWS)

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”

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

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

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

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

¿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

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

¿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

¿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 )

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

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

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

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

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

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

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

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

¿Quién usa Apache Cassandra ? Algunos usuarios famosos de Cassandra son: Digg Facebook Twitter Rackspace SimpleGEO …

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

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

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/

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

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

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 ;

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 '];

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.

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-cluster-on-a-single-windows-machine/ http://www.datastax.com/docs/0.7/getting_started/configuring

Ejecutando un Clúster Vamos a realizar un ejemplo con 4 nodos en Windows. Los pasos a seguir serán: Abrir el fichero hosts en C:\Windows\System32\drivers\etc Añadir el siguiente contenido, para crear 4 nodos locales: # cassandra nodes 127.0.0.1 node1.cassandra 127.0.0.1 node2.cassandra 127.0.0.1 node3.cassandra 127.0.0.1 node4.cassandra 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 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 Modicar el número de puerto en cassandra.bat  de JMX: - Dcom.sun.management.jmxremote.port =7199 Ejecutar el siguiente comando para ver los nodos en el clúster: nodetool -h 127.0.0.1 -p 7199 ring

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”

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.

Modelo de Datos en Cassandra Diseñado para datos distribuidos de modo escalable  s acrifica 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

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 }

Super -columnas Una supercolumna es un array asociativo (mapa) de columnas ordenadas por nombre

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

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"} } } }

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 )

Familia de super -columnas

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 ”

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

Resumen Modelo de Datos

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

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

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

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 D esde 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

RDBS vs. KeySpace

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

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 .

Mi primera aplicación con Cassandra Relational vs. Cassandra Model

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?

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-cassandra

Interactuando con Cassandra desde Python : pycassa Comprobar que la librería funciona haciendo desde Python : import pycassa Asegúrate que el KeySpace1 existe en Cassandra Ejecuta: cassandra-cli –h localhost -f CreateKeySpace1.txt Conéctate a Cassandra : from pycassa.pool import ConnectionPool pool = ConnectionPool ('Keyspace1')

Interactuando con Cassandra desde Python : pycassa Recupera una ColumnFamily : from pycassa.pool import ConnectionPool from pycassa.columnfamily import ColumnFamily pool = 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'}})

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)

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#

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

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

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

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

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

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 |

Un poco de CQL Más ejemplos en: http://www.datastax.com/docs/1.0/dml/using_cql cqlsh > 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 );

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

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

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

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

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

¿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

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"]

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

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.

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.

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

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.

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)

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

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

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

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.

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.

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 CouchDB Runtime 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

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.

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

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

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

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 .“}

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}

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

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-started-with-CouchDB-tutorial-a-beginners-guide

Primeros pasos en CouchDB

Primeros Pasos en CouchDB En Futon : Crearemos la base de datos haciendo click en “ Create Database ”, de nombre " nerekurtsoak " 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 Modificar el documento ya existente añadiendo el campo " type " con valor " course " La nueva versión del documento debería empezar por 2

Primeros Pasos en Curl Creemos un documento persona.json con el siguiente contenido: { " forename ": "Diego", " surname ": "Lopez-de- Ipina ", " type ": " person " } 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"} Para recuperar todos los documentos: curl -X GET http://127.0.0.1:5984/nerekurtsoak/_all_docs

Vista de un documento en Futon

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

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

Creando un Reduce

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

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

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

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

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

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

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 /"

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 "); } }

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- Type s 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

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"]} }

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

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

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

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

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

Hola Mundo con CouchApp Los pasos a seguir serán los siguientes: Usar el comando couchapp para que genere la estructura de tu aplicación: couchapp generate helloworld 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"; } 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

Hola Mundo con CouchApp Comprobar que se ha subido correctamente yendo a: http://127.0.0.1:5984/testdb/_design/helloworld/_show/hello 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

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: Crear base de datos " addressbook " con Futon Crea los siguientes dos documentos en la base de datos: {" type ": " address ", " name ": "Fred", " mobile ": "555-0001"}   {" type ": " address ", " name ": " Barney ", " mobile ": "555-0002"} 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

Mi primera aplicación seria con CouchApp 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 ); } } Comprueba que funciona la vista yendo a: http://127.0.0.1:5984/addressbook/_design/addressbook/_view/phonenumbers

Mi primera aplicación seria con CouchApp 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 >

Mi primera aplicación seria con CouchApp 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 (); }); Lo subimos al servidor: couchapp push addressbook  http://127.0.0.1:5984/addressbook

Mi primera aplicación seria con CouchApp 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 ); } 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 ); }}); } }

Mi primera aplicación seria con CouchApp Y para añadirlo: $(" button#add "). click ( function ( event ) { $(" form#update "). remove (); $(" button#add "). hide (); addUpdateForm ($(" div#add ")); }); 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; })

Mi primera aplicación seria con CouchApp 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 (); } } }); });

Mi primera aplicación seria con CouchApp 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

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

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}

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

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}'

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 .

Resolución de conflictos por ejemplo La base de datos A se replica en B: Creamos un documento en A Forzamos replicación:

Resolución de conflictos por ejemplo Creamos una nueva versión del documento en B: Añadimos una nueva versión en A:

Resolución de conflictos por ejemplo Cuando replicamos ahora A en B, se detecta un conflicto: La aplicación resuelve el conflicto

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

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

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

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

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

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

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 "

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-reference/ API en: http://daleharvey.github.com/jquery.couch.js-docs/symbols/index.html

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 Chris You have just won $10000! Well , $6000.0, after taxes . Tutorial en: http://mustache.github.com/mustache.5.html

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

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/

MongoDB MongoDB  (de la palabra en ingles “ hu mongo us ” 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/

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.

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

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

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

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 .

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>mongo MongoDB shell version : 2.0.6 connecting to : test > db.test.save ( {a:1} ) > db.test.find () { "_id" : ObjectId ("4fe6e41b184d3a26629be9b6"), "a" : 1 } >

Usando MongoDB mongo   es un shell JavaScript completo , cualquier función JavaScript, sintáxis o clase puede usarse en el shell use mydb j = { name : "mongo" }; t = { x : 3 }; db.things.save(j); db.things.save(t); db.things.find(); for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i}); db.things.find(); // Iterate through the remaining items it // Store the cursor of the DB in a variable var cursor = db.things.find(); while (cursor.hasNext()) printjson(cursor.next()); // Use functional features of JavaScript db.things.find().forEach(printjson); // cursor like an array var 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 );

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

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

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-image-example/

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

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

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

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

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

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/

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

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

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