Professional Documents
Culture Documents
dipina@deusto.es
http://paginaspersonales.deusto.es/dipina
http://www.morelab.deusto.es
Agenda
Infraestructura Virtualizada:
Cloud Computing
Un paradigma de computacin emergente donde los datos y servicios
residen en centros de datos muy escalables que pueden ser accedidos
ubicuamente desde cualquier dispositivo conectado a Internet1
Merrill Lynch:
Cloud computing market
opportunity by 2011 =
$95bn in business and
productivity apps +
$65bn in online advertising =
$160bn
Cloud Computing es
capacidad
computacional
y
almacenamiento
virtualizada
expuesta
mediante infraestructura agnstica a la
plataforma y accedida por Internet
Recursos IT compartidos en demanda, creados y
eliminados eficientemente y de modo escalable a
travs de una variedad de interfaces programticos
facturados en base a su uso
Forrester Research
A pool of abstracted, highly scalable, and
managed compute infrastructure capable of
hosting end-customer applications and billed
by consumption1
10
11
12
Caractersticas de Cloud
Tipos de despliegue
Cloud privada
Manifestaciones
Cloud Software as a Service (SaaS)
Cloud comunitaria
Cloud pblica
Vendida al pblico, gran escala
(ec2, S3,)
Cloud hbrida
Composicin de dos o ms
clouds
13
Diferentes Manifestaciones
14
15
16
17
Aplicaciones Cloud
Corresponden con lo que se denomina como SaaS
Manifestacin de cloud ms popular
Ejemplos: SalesForce, Gmail, Yahoo! Mail, rememberthemilk,
doodle, Google Docs, DropBox, picnik, Panda Cloud Antivirus,
scribd, slideshare
Ventajas: Libre, Fcil, Adopcin de consumo
Desventajas: funcionalidad limitada, no hay control de acceso
a la tecnologa subyacente
19
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, ms control que en las
aplicaciones cloud, configuradas estrechamente
Desventajas: restringidas a lo que est disponible, otras
dependencias, dependencia tecnolgica
20
Infraestructura Cloud
Proveen nubes de computacin y almacenamiento
Ofrecen capas de virtualizacin (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
21
Extensores de la Cloud
Proveen extensiones a infraestructura y plataformas cloud con
funcionalidad bsica
Ejemplos: Amazon SimpleDB, Amazon SQS, Google BigTable
Ventajas: extienden la funcionalidad de las nubes de
computacin y almacenamiento para integrar sistemas
heredados u otras cloud
Desventajas: a veces requieren el uso de plataformas o
infraestructura especfica
22
Agregadores Cloud
Se apoyan en varias infraestructuras cloud para su
gestin
Ejemplos: RightScale, Appistry
Ventajas: proveen ms opciones para entornos cloud
Desventajas: dependientes de proveedores de cloud
23
Qu framework o plataforma
usar para mis aplicaciones Cloud?
24
Documentacin: http://aws.amazon.com/documentation/
25
26
27
Introduccin a NoSQL
NoSQL es un trmino utilizado para describir un
subconjunto de bases de datos que difiere en varios
modos de bases de datos tradicionales (RDBMS).
No tienen schemas, no permiten JOINs, no intentan
garantizar ACID y escalan horizontalmente
28
Introduccin a NoSQL
NoSQL "not only SQL es una categora general
de sistemas de gestin de bases de datos que difiere
de modelo relacionales clsicos (RDBMS) en
diferente modos:
Estos datastores no requieren esquemas de informacin
fijas
Evitan las operaciones JOIN y escalan horizontalmente
Introduccin a NoSQL
La principal diferencia radica en cmo guardan los datos (por
ejemplo, almacenamiento de un recibo):
En una RDBMS tendramos que partir la informacin en
diferentes tablas y luego usar un lenguaje de programacin en la
parte servidora para transformar estos datos en objetos de la
vida real.
En NoSQL, simplemente guardas el recibo:
El teorema CAP
Teorema de Brewer: es imposible para un sistema computacional
distribuido ofrecer simultneamente las siguientes tres garantas:
Consistencia todos los nodos ven los mismos datos al mismo tiempo
Disponibilidad (Availability) garantiza que cada peticin recibe una
respuesta acerca de si tuvo xito o no
Tolerancia a la particin (Partition) el sistema continua funcionando a pesar
de la prdida de mensajes
Equivalente a:
You can have it good, you can have it fast, you can have it cheap: pick two.
31
Las aplicaciones web modernas presentan desafos muy distintos a las que
presentan los sistemas empresariales tradicionales (e.j. sistemas bancarios):
Atomicity
Consistency
Isolation
Durability
32
33
35
36
37
Caractersticas BBDD
orientadas a Clave-Valor
Su precursor fue Amazon Dynamo
Basadas en DHT (Distributed Hash Tables)
38
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 nmeros de nodos y gestionan la llegada continua de nodos, salidas y
fallos
39
Caractersticas 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
configuracin diferente de columnas
Ejemplos: HBase, Hypertable, Cassandra, Riak
Buenas en:
Gestin de tamao
Cargas de escrituras masivas orientas al stream
Alta disponibilidad
MapReduce
40
Caractersticas 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:
Caractersticas Bases de
Datos Basadas en Grafos
Inspiradas por Euler y la teora de grafos
Modelo de datos: nodos, relaciones con pares
clave valor en ambos
Ejemplos: AllegroGraph, VertexBD, Neo4j
43
Apache Cassandra
Es un almacn altamente escalable, eventualmente
consistente y distribuido de estructuras clave-valor.
Iniciado por Facebook
Cdigo abierto
Proyecto apache
Licencia: Apache License 2.0
Escrito en Java
Multiplataforma
Versin actual: 1.1.6
Web: http://cassandra.apache.org/
Documentacin: http://www.datastax.com/docs/1.0/index
44
45
Cassandra est desarrollada para ser un servidor distribuido, pero puede tambin
ejecutarse como un nodo simple:
Desventajas de Cassandra
Hay algunas desventajas que un sistema de
almacenamiento tan escalable ofrece en
contrapartida:
No hay joins (a cambio de ms velocidad)
No permite ordenar resultados en tiempo de
consulta
No tena SQL
Pero desde la versin 0.8 tenemos CQL
47
Instalacin de Cassandra
Documentacin en:
Cassandra Wiki: GettingStarted,
http://wiki.apache.org/cassandra/GettingStarted
Requisitos:
Java 1.6 en adelante
48
Instalacin de Cassandra
Disponible desde: http://cassandra.apache.org/download/
Descargar apache-cassandra-1.1.6-bin.tar.gz o similar
49
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
50
53
Ejecutando un Clster
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
Documentacin en:
http://crlog.info/2011/07/09/setting-up-a-multi-node-cassandracluster-on-a-single-windows-machine/
http://www.datastax.com/docs/0.7/getting_started/configuring
54
Ejecutando un Clster
Vamos a realizar un ejemplo con 4 nodos en Windows. Los pasos a seguir sern:
1.
2.
3.
4.
node1.cassandra
node2.cassandra
node3.cassandra
node4.cassandra
Propiedad cluster_name=PruebaCluster
Asegrate que auto_bootstrap: false en node1 y node2
Configura los dos seed nodes con la lnea: seeds: node1.cassandra, node2.cassandra
Modifica los directorios de datos: data_file_directories, commitlog_directory y
saved_caches_directory
Por ejemplo, commitlog_directory: /var/lib/cassandra/1/commitlog
Modifica las variables:
listen_address: node1.cassandra
rpc_address: node1.cassandra
5.
6.
55
56
Diseado para datos distribuidos de modo escalable sacrifica ACID por ventajas
en rendimiento, disponibilidad y gestin operacional
Los modelos que se crean son desnormalizados:
Se suele crear una column family por cada consulta (query) a realizar
Varias filas en un column family suelen dar respuesta a una consulta
58
Column
Una columna es un par nombre-valor que tambin contiene
un timestamp
Los nombres y columnas son arrays de bytes
El timestamp registra la ltima vez que una columna es accedida
Unidad atmica
name:value:timestamp
Email:dipina@deusto.es:123456789
Ejemplo en JSON:
{
"name": "Email",
"value": "dipina@deusto.es",
"timestamp: 123456789
}
59
Super-columnas
Una supercolumna es un array asociativo
(mapa) de columnas ordenadas por nombre
60
Column Family
Es un contenedor de columnas
Anlogo al concepto de tabla en RDBMS
61
Column Family
Ejemplo en JSON:
{
"mccv":{
"Users":{
"emailAddress":{"name":"emailAddress", "value":"foo@bar.com"},
"webSite":{"name":"webSite", "value":"http://bar.com"}
},
"Stats":{
"visits":{"name":"visits", "value":"243"}
}
},
"user2":{
"Users":{
"emailAddress":{"name":"emailAddress",
"value":"user2@bar.com"},
"twitter":{"name":"twitter", "value":"user2"}
}
}
}
62
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)
63
Familia de super-columnas
64
65
KeySpaces
Un espacio de claves o KeySpace es un esquema de
alto nivel que contiene familias de columnas.
Supercolumn Family Estado de Usuario
66
67
Clster
Los datos en Cassandra se guardan en un
Clster o Ring donde se asignan datos a los
nodos dentro de un ring
Un nodo tiene rplicas para diferentes rangos de
datos
Si un nodo se cae su rplica puede responder
Un protocolo P2P hace que los datos se repliquen
entre nodos acorde con un
replication_factor
68
Configuracin de un Keyspace
Los atributos bsicos que puedes asociar a un
keyspace son:
Replication factor: cunto quieres pagar en rendimiento a
favor de consistencia
Replica placement strategy: indica cmo se colocan las
rplicas en el anillo: SimpleStrategy,
OldNetworkTopologyStrategy y NetworkTopologyStrategy
Revisar:http://www.datastax.com/docs/1.0/cluster_architecture/r
eplication
Documentation:
http://www.datastax.com/docs/1.0/cluster_architecture/partitioning
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
RandomPartitioner, OrderPreservingPartitioner,
CollatingOrderPreservingPartitioner
72
Soporte Multi-lenguaje de
Cassandra
Cassandra utiliza la librera Thrift (http://thrift.apache.org/)
para proveer una API independiente del lenguaje de
programacin
Thrift API 1.0: http://wiki.apache.org/cassandra/API
Ejemplo en: http://wiki.apache.org/cassandra/ClientExamples
74
75
76
Ms info en:
http://pycassa.github.com/pycassa/tutorial.html#connecting-tocassandra
77
Conctate a Cassandra:
from pycassa.pool import ConnectionPool
pool = ConnectionPool('Keyspace1')
78
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'}})
79
Twissandra
Instalar Twissandra:
Crear el schema
cd twissandra
python manage.py sync_cassandra
Arrancar el webserver
python manage.py runserver
twissandra/cass.py
Muestra cmo hacer CRUD sobre ese schema
82
Usuarios:
User = {
'hermes': {
'password': '****',
(other properties),
},
}
Amigos y seguidores:
Friends = {
'hermes': {
# friend
'larry':
'curly':
'moe' :
},
}
Followers = {
'hermes': {
# friend
'larry':
'curly':
'moe' :
},
}
83
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',
},
}
84
Documentacin:
http://www.datastax.com/dev/blog/what%E2%80%99s-new-in-cassandra-0-8part-1-cql-the-cassandra-query-language
http://www.datastax.com/docs/0.8/dml/using_cql#use-cql
85
Acceso a CQL
Los desarrolladores pueden usar CQL desde Python o lnea de
comandos
Existen drivers en diferentes lenguajes de programacin
Nosotros vamos a practicar con comandos CQL a travs del
cliente de lnea 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 programtico en:
http://crlog.info/2011/06/13/cql-creating-a-simple-keyspace/
http://www.datastax.com/docs/1.1/dml/using_cql
86
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-thecassandra-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 |
87
Un poco de CQL
Ms 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);
88
Hector
Una API de alto nivel en Java para Cassandra
Incluye caractersticas empresariales: connection pooling, monitoring, etc.
Documentacin:
Tutorial:
https://github.com/rantav/hector/wiki/User-Guide
https://github.com/zznate/cassandra-tutorial
Ejemplos:
https://github.com/zznate/hector-examples
https://github.com/zznate/cassandra-tutorial
https://github.com/riptano/twissjava
CouchDB
CouchDB es una base de datos open source
orientada a documentos, accesible mediante una API
RESTful que hace uso extensivo de JavaScript Object
Notation (JSON)
"Couch" es el acrnimo de"Cluster Of Unreliable
Commodity Hardware"
Su misin es ser muy escalable, con alta disponibilidad y robustez,
incluso cuando se ejecuta en hardware convencional
Caractersticas de CouchDB
CouchDB es una base de datos orientada a documentos JSON escrita en
Erlang.
Parte de la generacin de bases de datos NoSQL
Es un proyecto open source de la fundacin Apache
Ventajas de CouchDB
Documentos JSON todo lo que se guarda en CouchDB son simplemente
documentos JSON.
Interfaz RESTful desde la creacin a la replicacin a la insercin de
datos, toda la gestin de datos en CouchDB puede ser realizada va HTTP.
Replicacin N-Master puedes hacer uso de un nmero ilimitado de
masters, dando lugar a topologas de replicacin muy interesantes.
Escrita para ejecutarse offline CouchDB puede replicarse en dispositivos
(e.j. telfonos Android) que pueden quedarse sin conexin y gestionar
sincronizacin de datos cuando el dispositivo est online de nuevo
Filtros de replicado puedes filtrar de modo preciso los datos que quieres
replicar a distintos nodos.
http://wiki.apache.org/couchdb/Replication#Filtered_Replication
93
94
96
97
Las vistas se crean en demanda y son utilizadas para agregar, enlazar y reportar
sobre documentos en la base de datos
Se definen en documentos de diseo y pueden ser replicadas a travs de varias
instancias
Estos documentos de diseo contienen funciones JavaScript que pueden ejecutar
consultas mediante el concepto de MapReduce.
La funcin Map de la vista recibe un documento como argumento y realiza una
serie de clculos para determinar qu datos deberan ser disponibles en la vista
Si la vista tiene una funcin Reduce, es usada para agregar los resultados. A partir
de un conjunto de pares clave/valor devuelve un slo valor.
98
100
102
Availability
Todos los clientes pueden acceder a los datos.
Partition tolerance
La base de datos puede partirse a mltiples servidores
103
Detalles tcnicos
Un servidor CouchDB gestiona bases de datos bajo un
nombre, que almacenan documentos:
Cada documento tiene un nombre nico en la BBDD y CouchDB
proporciona una API HTTP RESTful para leer y modificar (aadir, editar
y borrar) documentos de la BBDD.
Los documentos son la unidad de datos primaria en CouchDB y
consisten de un nmero variable de campos y adjuntos
Las modificaciones sobre documentos (aadir, editar, borrar) son del
todo o de nada, o se modifican completamente o fallan
completamente.
El modelo de modificacin de documentos de CouchDB es optimista y
no hace uso de locks.
Ms detalles genricos en:
http://CouchDB.apache.org/docs/overview.html
104
Modelo de Vistas
Para aadir estructura a datos no estructurados o semiestructurados, CouchDB incorpora el modelo de vistas
Se crean dinmicamente y no afectan al documento subyacente
Se definen dentro de documentos de diseo
Se replican a otras instancias de la base de datos como si fueran
documentos convencionales
En CouchDB slo se replican datos, aunque esos datos a menudo (cdigo
JavaScript) puede corresponder a aplicaciones.
105
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 agregacin de los
mismos.
106
Instalacin de CouchDB
Dependencias:
Runtime
CouchDB
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
Detalles de instalacin:
http://wiki.apache.org/CouchDB/Installation
Instrucciones detalladas para Windows en:
https://github.com/LearningRegistry/LearningRegistry/wiki/WindowsInstallation-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 instalacin dependencias
107
Instalacin en Linux:
Tan simple como: sudo aptitude install
couchdb
http://wiki.apache.org/couchdb/Installing_on_Ubuntu
Instalacin CouchDB
Sin embargo, lo ms sencillo es:
Ir a CouchBase (http://www.couchbase.com/downloads)
Descargarse el binario de tu plataforma
Seleccionar Enteprise Edition/Membase Server
109
CouchDB Futon
Futon: http://localhost:5984/_utils/
Hace uso internamente de la librera
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 slo usuarios autorizados
pueden acceder a CouchDB
Nosotros usaremos la combinacin
admin/enpresadigitala
110
CouchDB ofrece una API como mecanismo para recuperar datos de una BBDD.
Donde siguiendo la convencin REST: (si no aparece la sabes para crear POST y sino PUT)
Esta API es accesible va HTTP GET y POST y retorna datos en el formato de objetos
JavaScript mediante JSON.
Una ventaja de este enfoque es que puede usarse una framework AJAX como Prototype
o jQuery para crear una aplicacin web, sin necesidad de hacer uso de un lenguaje de
parte servidora
La herramienta de lnea de comando CURL pueden ser usada como cliente de lnea de
comandos HTTP:
Descargable de: http://curl.haxx.se/
Permite realizar peticiones GET, POST, PUT, y DELETE, mostrando la respuesta HTTP recibida del
servidor web
111
$ curl http://127.0.0.1:5984/
Respuesta: {"couchdb":"Welcome","version":"1.2.0"}
Respuesta: {"ok":true}
Si ejecutamos ahora:
Respuesta:
["_replicator","_users","nerekurtsoak","test_suite_reports","testdb","users"]
112
Para recuperarlo:
Programando CouchDB
Gracias a la API RESTful, los desarrolladores pueden
conectarse a CouchDB usando cualquier software
que soporte HTTP
La mayora de los lenguajes modernos ofrecen algn
tipo de interfaz HTTP, implicando que CouchDB
puede ser usada en cualquier proyecto de desarrollo.
Revisar la siguiente pgina para diferentes clientes
programticos a CouchDB:
http://wiki.apache.org/CouchDB/Related_Projects
114
Otros tutoriales:
http://www.catswhocode.com/blog/gettingstarted-with-CouchDB-tutorial-a-beginners-guide
115
116
En Futon:
1.
3.
117
1.
{
"forename": "Diego",
"surname": "Lopez-de-Ipina",
"type":
"person"
}
2.
3.
{"ok":true,"id":"b54b3496d090c43a4266180ecb002a92","rev":"193c73d298af443f623db6861f90e9f6e"}
118
119
Creando un Reduce
Nos aseguraremos de tener al menos dos cursos con precio
Definir la funcin de mapeo como:
function (doc) {
if (doc.type === "course" && doc.price) {
emit(doc.id, doc.price);
}
}
Creando un Reduce
122
Documentos de Diseo en
CloudDB
Los documentos de diseo son un tipo especial de documento
en CouchDB que contiene cdigo de aplicacin:
Vistas MapReduce, validaciones, funciones show, list y update
123
Estructura interna de un
Documento de Diseo
Funciones de validacin
Definicin de vistas
Funciones show, list y update
Attachments
Las funciones vistas en CouchDB son strings guardados en el campo views del
documento de diseo
Los resultados de un vista se guardan en un B-tree, al igual que todo documento
Estos rboles permiten realizar bsquedas de filas por clave y recuperar rangos de filas
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
La funcin 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
parmetro rereduce es false
Cuando se ejecuta en los nodos internos del rbol, el valor de rereduce es
true
126
Configuracin de vistas
Y la consulta:
/ladies/_design/ladies/_view/age?key=5
Documentacin:
http://guide.CouchDB.org/draft/cookbook.html
128
Y la consulta:
/files/_design/finder/_view/by-mime-type?key="image/"
129
Validaciones
Funcin list
Las funciones list en CouchDB permiten generar salida de vistas en cualquier formato
132
Funcin list
Funcin update
Son funciones que los clientes invocan para crear o actualizar documentos
Devuelven el nuevo documento y una respuesta al cliente
Para modificar, enviar peticin PUT en el formato:
/<database>/_design/<design>/_update/<function>/<docid>
/<database>/_design/<design>/_update/<function>
CouchApp
A CouchApp es una framework para la creacin de
aplicaciones JavaScript con CouchDB
Como son aplicaciones JavaScript y HTML5 son servidas
directamente desde CouchDB
Como efecto lateral consigues la flexibilidad y escalabilidad de
CouchDB
http://couchapp.org/
Para crear una CouchApp, necesitas un modo para meter
JavaScript, HTML y otros recursos en CouchDB
La herramienta CouchApp escrita en Python es la recomendada para
generar plantillas de cdigo en tu aplicacin y volcarlos a una instancia
de CouchDB:
http://couchapp.org/page/couchapp-python
135
CouchApp
CouchApp te simplifica la labor de crear aplicaciones web a
partir de CouchDB:
Fragmenta un documento de diseo en un conjunto de directorios y
ficheros del sistema local, representando views, shows, validations,
attachments, etc. que sern enviados al servidor CouchDB
136
Instalacin de CouchApp
Requiere la ltima versin 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-pythoninstallers
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
automticamente
http://packages.python.org/distribute/easy_install.html
2.
3.
5.
http://127.0.0.1:5984/testdb/_design/helloworld/_show/hello
couchapp clone
http://127.0.0.1:5984/testdb/_design/helloworld
helloworld2
139
3.
141
142
Modificamos el index.html introduciendo JavaScript que se activa cuando la pgina acaba de cargarse.
Itera sobre cada fila de la vista, aadiendo 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 class="phonenumber">'
'<a href="#" id="' + id + '"
'<a href="#" id="' + id + '"
'</div>';
$("div#addressbook").append(html);
}
}
});
}
$(document).ready(function() {
refreshAddressbook();
});
8.
+ '</span> ' +
+ phonenumber + '</span> ' +
class="edit">edit</a> | ' +
class="delete">delete</a>' +
143
Y para aadirlo:
$("button#add").click(function(event) {
$("form#update").remove();
$("button#add").hide();
addUpdateForm($("div#add"));
});
12.
145
147
Escalabilidad en CouchDB
CouchDB permite hacer escalado en tres
niveles:
Escalando peticiones de lectura
Se resuelve mediante una cach
Escalando datos
La solucin es dividir los datos en cachos (chunks) y
colocarlos en diferentes servidores
Todos los servidores conteniendo chunks conforman un
clster
148
Replicacin en CouchDB
La replicacin sincroniza dos copias de la misma
BBDD, permitiendo que los usuarios tengan baja
latencia de acceso a datos independientemente de
su localizacin
La replicacin consiste en enviar una peticin HTTP a un
servidor CouchDB incluyendo una BBDD de origen y otra
de destino, haciendo que CouchDB enve los cambios del
origen al destino:
POST /_replicate HTTP/1.1
{"source":"database","target":http://example.
org/database}
149
Replicacin 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 nmero de secuencia que es
incrementado cada vez que la BBDD se cambia
Gestin de Conflictos
Cuando replicas dos BBDD en CouchDB y se identifican
conflictos, CouchDB los seala en los documentos afectados
con el atributo "_conflicts":true
La versin que es seleccionada como ltima es la versin ganadora.
La revision perdedora es almacenada como versin anterior.
CouchDB no hace un merge de las revisiones conflictivas.
Tu aplicacin es la que resuelve programticamente los conflictos
152
Creamos un documento en A
Forzamos replicacin:
153
154
155
Puesta en prctica de
Replicacin
Creamos una BD y una rplica:
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 "ContentType: application/json" -d @replicationconflict-example.json
156
Puesta en prctica de
Replicacin
Actualizamos ahora el documento en db-replica a la versin 2:
curl -X PUT 127.0.0.1:5984/db-replica/foo -d
'{"count":2,"_rev":"174620ecf527d29daaab9c2b465fbce66"}'
157
Puesta en prctica de
Replicacin
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);
}
}
158
Instalacin de Pages:
couchapp push pages
http://admin:enpresadigitala@127.0
.0.1:5984/pages
Ir a:
http://127.0.0.1:5984/pages/_design/page
s/_rewrite/page/index
159
Notificaciones de cambios
CouchDB ofrece un mecanismo de subscripciones a cambios
mediante la API _changes
La API _changes suministra informacin en el siguiente
formato:
{"seq":12,"id":"foo","changes":[{"rev":"123202479633c2b380f79507a776743d5"}]}
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 descripcin de las ltimas
modificaciones
160
Aadimos un documento:
$ curl -X PUT http://127.0.0.1:5984/db-changes/test -d
'{"name":"Anna"}
Long polling requiere abrir una nueva conexin HTTP por cada cambio notificado.
La API continuous changes permite establecer una conexin permanente entre tu aplicacin
y CouchDB para recibir cambios:
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; }
}"
}
}
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
Mustache
Una manera cmoda de generar documentos HTML es a travs de libreras de plantillas como Mustache
Ejemplo:
164
Evently
Evently es un librera sobre jQuery que define atajos para facilitar la mezcla de eventos estndar y propietarios, reduciendo
significativamente el cdigo utilizado
Dado el siguiente cdigo en jQuery:
$("#myelement").bind("click", function() {
En Evently se escribira:
$("#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);
}
});
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 quizs el motor NoSQL ms popular
Usada por SourceForge, Bit.ly, Foursquare o GitHub
URL: http://www.mongodb.org/
166
MongoDB
MongoDB (de la palabra en ingles humongous que
significa enorme) es un sistema de base de datos
NoSQL orientado a documentos
MongoDB guarda estructuras de datos en
documentos tipo BSON (Binary JSON (JSON Binario)
con un esquema dinmico , haciendo que la
integracin de los datos en ciertas aplicaciones sea
mas fcil y rpida.
The MongoDB Manual:
http://docs.mongodb.org/manual/
167
Caractersticas Principales
Consultas Ad hoc
Indexacin
MongoDB puede ser utilizado con un sistema de archivos, tomando la ventaja de la capacidad que tiene MongoDB para el balanceo de carga y la replicacin
de datos utilizando mltiples servidores para el almacenamiento de archivos.
Esta funcin (que es llamada GridFS ) est incluida en los drivers de MongoDB y disponible para los lenguajes de programacin que soporta MongoDB.
Agregacin
Almacenamiento de archivos
MongoDB soporta el tipo de replicacin maestro-esclavo. El maestro puede ejecutar comandos de lectura y escritura. El esclavo puede copiar los datos del
maestro y slo se puede usar para lectura o para copia de seguridad, pero no se pueden realizar escrituras. El esclavo tiene la habilidad de poder elegir un
nuevo maestro en caso del que se caiga el servicio con el maestro actual.
Balanceo de carga
Cualquier campo en un documento de MongoDB puede ser indexado, al igual que es posible hacer ndices secundarios. El concepto de
ndices en MongoDB es similar a los encontrados en base de datos relacionales.
Replicacin
MongoDB soporta la bsqueda por campos, consultas de rangos y expresiones regulares. Las consultas pueden devolver un campo especfico
del documento pero tambin puede ser una funcin JavaScript definida por el usuario.
La funcin MapReduce puede ser utilizada para el procesamiento por lotes de datos y operaciones de agregacin. Esta funcin permite que los usuarios
puedan obtener el tipo de resultado que se obtiene cuando se utiliza el comando SQL group-by.
MongoDB tiene la capacidad de realizar consultas utilizando JavaScript, haciendo que estas sean enviadas directamente a la base de datos para ser
ejecutadas.
168
Votaciones
Registro de usarios
Perfiles de usuarios
Sesiones de datos
169
Manipulacin de Datos:
colecciones y documentos
MongoDB guarda la estructura de los datos en documentos tipo JSON con
un esquema dinmico llamado BSON, lo que implica que no existe un
esquema predefinido.
Los elementos de los datos son llamados documentos y se guardan en
colecciones
Una coleccin puede tener un nmero indeterminado de documentos
Las colecciones son como tablas y los documentos
Cada documento en una coleccin puede tener diferentes campos.
170
Ejemplo de documento
en MongoDB
{
"_id":
ObjectId("4efa8d2b7d284dad101e4bc7"),
"Last Name": "PELLERIN",
"First Name": "Franck",
"Age": 29,
"Address": {
"Street": "1 chemin des Loges",
"City": "VERSAILLES"
}
}
171
Utilidades de MongoDB
Los siguientes comandos pueden ser instalados para el manejo y la administracin 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 tambin permite entre otras funciones la replicacin de informacin, configurar
los Shards, apagar los servidores y ejecutar JavaScript.
mongostat: es un instrumento de lnea de comandos que muestra en resumen una lista de estadsticas
de una instancia de MongoDB en ejecucin. Esto te permite visualizar cuantas inserciones, actualizaciones,
eliminaciones, consultas y comandos se han ejecutado, pero tambin cuanta memoria esta utilizando y
cuanto tiempo ha estado cerrada la base de datos.
mongotop: es un instrumento de lnea de comandos que provee un mtodo para dar seguimiento a la
cantidad de tiempo que dura una la lectura o escritura de datos en una instancia. Tambin provee
estadsticas en el nivel de cada coleccin.
mongosniff: es un instrumento de lnea de comandos que provee un sniffing en la base de datos
haciendo un sniffing en el trfico de la red que va desde y hacia MongoDB.
mongoimport/mongoexport: es un instrumento de lnea de comandos que facilita la importacin
exportacin de contenido desde JSON, CSV o TSV. Tambin tiene el potencial de importar o exportar hacia
otros formatos.
mongodump/mongorestore: es un instrumento de lnea de comandos para la creacin de una
exportacin binaria del contenido de la base de datos. Estos comandos son utilizado para la estrategia de
copias de seguridad cuando se utiliza MongoDB.
172
Documentacin e instalacin
La documentacin completa de MongoDB puede encontrarse en:
http://docs.mongodb.org/manual/
Usando MongoDB
mongo es un shell JavaScript completo, cualquier funcin JavaScript, sintxis 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);
174
Documentos de consulta
Documentos que indican el patrn de claves y valores que deben ser
localizados
Ejemplos:
SELECT * FROM things WHERE name="mongo
db.things.find({name:"mongo"}).forEach(printjson);
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)
URL: http://www.mongodb.org/display/DOCS/GridFS
Specification:
http://www.mongodb.org/display/DOCS/GridFS+Specification
176
178
179
Aplicaciones que generan informes emplean consultas complejas para las que
NoSQL no es muy adecuado
Aplicando MapReduce, las bases de datos NoSQL pueden paralelizar operaciones
complejas como agregaciones estadsticas, filtros, agrupaciones o ordenacin.
Desde un punto de vista de sistemas deberamos considerar la combinacin de
SQL y NoSQL:
LinkedIn comenz slo con un RDBMS, pero desarroll su propia BBDD NoSQL
(Voldemort)
Facebook tienen una arquitectura hbrida con Memcached y MySQL junto a un OLTP
(envo de mensajes al Wall), y Cassandra para la bsqueda en la bandeja de entrada
180
Su falta de madurez
Dnde usarlas?
Datos sociales
Procesado de datos (Hadoop)
Bsqueda (Lucene)
Caching (Memcache)
Data Warehousing
Conclusin
Las BBDD NoSQL son una clara alternativa a los RDBMS
Sobre todo para algunas aplicaciones sociales y web que requieren
elevada escalabilidad
182
Referencias
Cassandra
NoSQL Not only SQL (Introduction to Apache
Cassandra)
http://www.scriptandscroll.com/3508/technology/nosql-not-onlysql-introduction-to-apache-cassandra/#.TtonPmMk6nA
DataSax company:
http://www.datastax.com/about-us/about-datastax
http://cassandra.apache.org/
183
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 site:
http://CouchDB.apache.org/
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
184
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:2664632
900346253817
185
dipina@deusto.es
http://paginaspersonales.deusto.es/dipina
http://www.morelab.deusto.es
186