Академический Документы
Профессиональный Документы
Культура Документы
de bases de datos
19 Abril de 2012, 9:00-14:30
Miramon Enpresa Digitala. Paseo Mikeletegi 56, 1. 20009 San
Sebastin
Dr. Diego Lz. de Ipia Glz. de Artaza
DeustoTech-INTERNET2, DeustoTech Deusto Institute of Technology, Universidad de
Deusto
dipina@deusto.es
http://paginaspersonales.deusto.es/dipina
http://www.morelab.deusto.es
1
Agenda
1. Introduccin a las bases de datos NoSQL (60)
Descanso (20)
2
Agenda
3. Ejemplo de almacn de base de datos
orientada a documentos: CouchDB (90)
Introduccin: caractersticas (vistas, modelado sin
esquemas) y arquitectura
Instalacin sobre diferentes sistemas operativos
La API HTTP de CouchDB HTTP
Programacin de aplicaciones desde Python y Java
Desarrollo de una aplicacin avanzada con CouchApp
4. Conclusiones (40)
Comparativa entre las diferentes soluciones de NoSQL
Otras alternativas destacables: MongoDB, HBase
Aplicabilidad a mi empresa
3
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
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 data stores 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
Equivalente a:
You can have it good, you can have it fast, you can
have it cheap: pick two.
Atomicity
Consistency
Isolation
Durability
Por qu necesitamos
NoSQL?
Arquitectura de las
BBDD NoSQL
A menudo ofrecen slo garantas de
consistencia dbiles, como por ejemplo
eventual consistency, o transacciones
restringidas a elementos de datos simples
Emplean una arquitectura distribuida,
donde los datos se guardan de modo
redundante en distintos servidores, a
menudo usando tablas hash distribuidas
Suelen ofrecer estructuras de datos
sencillas como arrays asociativos o
almacenes de pares11 clave-valor
http://facility9.com/2010/09/five-reasons-touse-nosql/
Taxonoma de soluciones
NoSQL
Los principales tipos de BBDD de
acuerdo con su implementacin son
los siguientes:
Almacenes de documentos
Almacenes de Clave-Valor
Grafos
14
Caractersticas BBDD
orientadas a
Documentos
Caractersticas BBDD
orientadas a Clave-Valor
Su precursor fue 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
17
Alta disponibilidad
18
Apache Cassandra
Es un almacn altamente escalable,
eventualmente consistente y distribuido de
estructuras clave-valor.
Iniciado por Facebook
Cdigo abierto
Proyecto apache
Licencia: Apache License 2.0
Escrito en Java
Multiplataforma
Versin actual: 1.0.9
Web: http://cassandra.apache.org/
Documentacin:
http://www.datastax.com/docs/1.0/index
19
20
Ventajas de Cassandra
para desarrolladores
Web
Cassandra est desarrollada para ser un servidor distribuido, pero
puede tambin ejecutarse como un nodo simple:
Escalabilidad horizontal (aade nuevo hardware cuando sea preciso)
Rpidas respuestas aunque la demanda crezca
Elevadas velocidades de escritura para gestionar volmenes de datos
incrementales
Almacenamiento distribuido
Capacidad de cambiar la estructura de datos cuando los usuarios
demandan ms funcionalidad
Una API sencilla y limpia para tu lenguaje de programacin favorito
Deteccin automtica de fallos
No hay un punto de fallo nico (cada nodo conoce de los otros)
Descentralizada
Tolerante a fallos
Permite el uso de Hadoop para implementar Map Reduce
Hinted hand of
21
Desventajas de
Cassandra
Hay algunas desventajas que un
sistema de almacenamiento tan
escalable ofrece en contrapartida:
No hay joins (a cambio de ms
velocidad)
No permite ordenar resultados en
tiempo de consulta
No tiene SQL
Pero desde la versin 0.8 tenemos CQL
22
Instalacin de Cassandra
Documentacin en:
Cassandra Wiki: GettingStarted,
http://wiki.apache.org/cassandra/Getting
Started
Requisitos:
Java 1.6 en adelante
Instalacin de Cassandra
Disponible desde:
http://cassandra.apache.org/download/
Descargar apache-cassandra-1.0.9-bin.tar.gz o
similar
24
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
25
Ring, clster y el
protocolo
Gossip
Cassandra usa un protocolo Gossip para permitir
comunicacin dentro de un ring, de tal modo que
cada nodo sabe de otros nodos
Permite soportar descentralizacin y tolerancia a la
particin
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-cas
sandra-cluster-on-a-single-windows-machine/
http://www.datastax.com/docs/0.7/getting_started/config
uring
29
Ejecutando un Clster
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
5.
6.
Teorema CAP en
Cassandra
Las bases de datos derivadas de Amazon
Dynamo incluyen Cassandra, Voldemort,
CouchDB y Riak
Centradas ms en disponibilidad y tolerancia a
fallos
Permiten Consistencia Eventual
Donde eventual significa milisegundos
Modelo de Datos en
Cassandra
Est basado en un modelo clavevalor
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:
Unkeyspace, unacolumn family,
unakey, unasuper column opcional, y
32
unacolumn.
Modelo de Datos en
Cassandra
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
}
34
Super-columnas
Una supercolumna es un array
asociativo (mapa) de columnas
ordenadas por nombre
35
Column Family
Es un contenedor de columnas
Anlogo al concepto de tabla en RDBMS
36
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"}
}
}
}
37
Familia de supercolumnas
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)
38
Familia de supercolumnas
39
KeySpaces
Un espacio de claves o KeySpace es un
esquema de alto nivel que contiene
familias de columnas.
Supercolumn Family Estado de Usuario
41
Resumen Modelo de
Datos
42
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
43
replication_factor
Configuracin de un
Keyspace
Los atributos bsicos que puedes asociar a
un keyspace son:
Replication factor: cunto quieres pagar en
rendimiento a favor de consistencia
Replica placement strategy: indica cmo se
colocan las rplicas en el anillo:
SimpleStrategy, OldNetworkTopologyStrategy y
NetworkTopologyStrategy
Revisar:
http://answers.oreilly.com/topic/2408-replica-placem
ent-strategies-when-using-cassandra/
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 ms trabajo eligiendo
node tokens
Ms info en:
http://abel-perez.com/cassandra-partitioner-order-preserving
-partit
Diferencias entre un
RDBMS y Cassandra
RandomPartitioner, OrderPreservingPartitioner,
CollatingOrderPreservingPartitioner
47
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
49
Mi primera aplicacin
con Cassandra
Relational vs.
Cassandra Model
50
51
Pycassa: un cliente
Python
para Apache Cassandra
Instalacin:
Dependencias:
Instalar Python 2.7 o en adelante
Instalar setuptools
Ms info en:
http://pycassa.github.com/pycassa/tutorial.html#connec
ting-to-cassandra
52
Interactuando con
Cassandra desde Python:
pycassa
Comprobar que la librera funciona
haciendo desde Python:
import pycassa
Conctate a Cassandra:
from pycassa.pool import ConnectionPool
pool = ConnectionPool('Keyspace1')
53
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'}})
54
Interactuando con
Cassandra desde Python:
pycassa
Pare recuperar las columnas de una fila:
col_fam.get('row_key')
Interactuando con
Cassandra desde Python:
pycassa
Para recuperar mltiples filas usamos:
col_fam.multiget(['row1', 'row2'])
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
57
Modelo de Datos de
Twissandra
Usuarios:
User = {
'hermes': {
'password': '****',
(other properties),
},
}
Amigos y seguidores:
Friends = {
'hermes': {
# friend
'larry':
'curly':
'moe' :
},
}
Followers = {
'hermes': {
# friend
'larry':
'curly':
'moe' :
},
}
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',
},
}
59
Cassandra Query
Language (CQL)
Documentacin:
http://www.datastax.com/dev/blog/what%E2%80%99s-new-in-cas
sandra-0-8-part-1-cql-the-cassandra-query-language
http://www.datastax.com/docs/0.8/dml/using_cql#use-cql
60
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
cqlshest instalado en
$CASSANDRA_HOME/bin/cqlshpara instalaciones
tarball o /usr/bin/cqlshpara instalaciones de
paquetes Linux
Ejemplo programtico en:
61
http://crlog.info/2011/06/13/cql-creating-a-simple-keyspa
Un poco de CQL
62
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);
63
Hector
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
Ventajas de CouchDB
69
Conceptos clave en
CouchDB: Documentos
Una base de datos en CouchDB es
una coleccin de documentos,
donde cada uno est identificado por
un ID y contiene un conjunto de
campos nombrados:
Los campos pueden ser strings,
nmeros, fechas o incluso listas
ordenadas y diccionarios.
Ejemplos de documentos seran:
"Subject": "I like Plankton,
70
"Tags": ["plankton", "baseball",
Conceptos clave en
CouchDB: Documentos
Conceptos clave en
CouchDB: Vistas
Son el mecanismo para aadir estructura a datos
semi-estructurados
El modelo de vistas en CouchDB usa JavaScript
para describirlas
Las vistas son el mtodo para agregar y realizar
informes sobre los documentos de un repositorio,
siendo creados en demanda para agregar y
agregar documentos.
Las vistas se construyen dinmicamente y no
afectan el documento subyacente, puedes tener
tantas representaciones de vistas de los mismos
datos como gustes.
72
Conceptos clave en
CouchDB: Vistas
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);
}
74
Conceptos clave en
CouchDB:
Sin
esquema
CouchDB est diseado para almacenar y
reportar sobre grandes volmenes de datos
orientados a documentos semi-estructurados.
Con CouchDB, no se impone ningn esquema,
nuevos tipos de documentos con distintos
campos y significados se pueden unir a los
existentes.
El motor de vistas, apoyado en JavaScript, est
diseado para facilitar la gestin de nuevos tipos
de documentos y variados pero similares
documentos.
75
Conceptos clave:
Distribuida
CouchDB es un sistema distribuido de base de
datos basado en nodos
Un nmero variable de nodos CouchDB (servidores y
clientes offline) pueden tener copias de rplicas
independientes de la misma BBDD, donde las
aplicaciones pueden tener interactividad completa con
la BBDD (consultar, aadir, editar y borrar)
Cuando vuelven a estar online o de modo planificado, los
cambios de las bases de datos son replicados
bidireccionalmente.
Gestin de Conflictos
MVCC
Los documentos en CouchDB son versionados, de
modo similar a como se realiza en sistemas de
control de versiones como Subversion.
Si cambias un valor de un documento, realmente
creas una nueva versin del mismo que coexiste
con la versin antigua
Las peticiones se ejecutan en paralelo haciendo
que los servidores permitan una alta concurrencia
Una peticin de lectura ver siempre la versin ms
reciente de la BBDD
77
Teorema CAP en
CouchDB
Availability
Todos los clientes pueden acceder a los datos.
Partition tolerance
La base de datos puede partirse a mltiples
servidores
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:
79
http://CouchDB.apache.org/docs/overview.html
Modelo de Vistas
Para aadir estructura a datos no estructurados o
semi-estructurados, 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.
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
81
Instalacin de CouchDB
Dependencias:
Runtime
Build
Couch
DB
Spider
monke
y
Erlang
ICU
cURL
Autom
ake
Autoc
onf
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
Detalles de instalacin:
>=5.6.
>=
>=
>=
http://wiki.apache.org/CouchDB/Installation
0.11.x
>=1.7
>= 3.0
5
7.18.0
1.6.3
2.59
Instrucciones detalladas para Windows en:
https://github.com/LearningRegistry/LearningRegistry
/wiki/Windows-Installation-Guide
Curl
Visual C++ 2008 Redistributable Setup
OpenSSL
Configurar %PATH% para82
que apunte a los dirs de instalacin
dependencias
Instalacin en Windows y
Linux
Algunos enlaces de ayuda para Windows:
http://niallodoherty.com/post.cfm/installing-C
ouchDB-on-windows-quick-guide
http://wiki.apache.org/CouchDB/Quirks_on_Win
dows
Instalacin en Linux:
Tan simple como: sudo aptitude install
couchdb
http://wiki.apache.org/couchdb/Installing_on_U
buntu
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
CouchDB Futon
Futon: http://localhost:5984/_utils/
Hace uso internamente de la librera
http://127.0.0.1:5984/_utils/script/jquery.co
uch.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
85
$ curl http://127.0.0.1:5984/
Respuesta: {"CouchDB":"Welcome","version":"1.1.1"}
Respuesta: {"ok":true}
Si ejecutamos ahora:
Respuesta:
["_replicator","_users","nerekurtsoak","test_suite_reports","testdb","users
"]
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
89
Otros tutoriales:
http://www.catswhocode.com/blog/gettin
g-started-with-CouchDB-tutorial-a-begi
nners-guide
90
Primeros pasos en
CouchDB
91
En Futon:
1.
3.
92
2.
3.
{"ok":true,"id":"b54b3496d090c43a4266180ecb002a92","rev
":"1-93c73d298af443f623db6861f90e9f6e"}
93
curl -X GET
http://127.0.0.1:5984/nerekurtsoak/_all_docs
Vista de un documento
en Futon
94
Creando un Reduce
Creando un Reduce
97
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
Estructura interna de un
Documento de Diseo
Estn compuestos de:
Funciones de validacin
Definicin de vistas
Funciones show, list y
update
Attachments
Para recuperar un
documento de diseo haz un
GET con el siguiente patrn
de URL:
http://localhost:5984/my
99
db/_design/calendar
Configuracin de vistas
Recetas: De SQL a
MapReduce
SELECT field FROM table WHERE
value="searchterm
La funcin map sera:
function(doc) {
if(doc.age && doc.name) {
emit(doc.age, doc.name);
}
}
Y la consulta:
/ladies/_design/ladies/_view/age?key=5
Documentacin:
http://guide.CouchDB.org/draft/cookbook.h
tml
103
Recetas: De SQL a
MapReduce
Y la consulta:
/files/_design/finder/_view/by-mime-type?key="image/"
104
Validaciones
Funcin list
107
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:
110
http://couchapp.org/page/couchapp-python
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
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-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 automticamente
http://packages.python.org/distribute/easy_install.html
2.
3.
http://127.0.0.1:5984/testdb/_design/helloworld/_show/hello
couchapp clone
http://127.0.0.1:5984/testdb/_design/helloworld
helloworld2
114
Mi primera aplicacin
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
3.
Mi primera aplicacin
seria
con
CouchApp
4. Una vez creada la vista, la editamos de la siguiente
manera:
Borramos addressbook/views/phonenumbers/reduce.js
Editamos el fichero
addressbook/views/phonenumbers/map.js con:
function(doc) {
if (doc.type && doc.type == "address" && doc.name && doc.mobile) {
emit(doc.name, doc.mobile);
}
}
116
Mi primera aplicacin
seria
con CouchApp
117
Mi primera aplicacin
seria
con CouchApp
7.
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> ' +
'<span class="phonenumber">' + phonenumber + '</span> ' +
'<a href="#" id="' + id + '" class="edit">edit</a> | ' +
'<a href="#" id="' + id + '" class="delete">delete</a>' +
'</div>';
$("div#addressbook").append(html);
}
}
});
}
$(document).ready(function() {
refreshAddressbook();
});
8.
118
Mi primera aplicacin
seria
con CouchApp
9. Para aadir elementos aadimos el siguiente formulario web:
Mi primera aplicacin
seria
con CouchApp
11. Y para aadirlo:
$("button#add").click(function(event) {
$("form#update").remove();
$("button#add").hide();
addUpdateForm($("div#add"));
});
120
Mi primera aplicacin
seria
con CouchApp
13. Modify index.html to allow contact deleting:
$(document).ready(function() {
refreshAddressbook();
$("div#addressbook").click(function(event) {
var $tgt = $(event.target);
if ($tgt.is('a')) {
id = $tgt.attr("id");
if ($tgt.hasClass("edit")) {
// TODO: implement edit functionality
}
if ($tgt.hasClass("delete")) {
html = '<span class="deleteconfirm">Sure? <a href="#" class="dodelete">Yes</a> <a
href="#" class="canceldelete">No</a></span>';
$tgt.parent().append(html);
}
if ($tgt.hasClass("dodelete")) {
$db.openDoc(id, { success: function(doc) {
$db.removeDoc(doc, { success: function() {
$tgt.parents("div.address").remove();
}})
}});
}
if ($tgt.hasClass("canceldelete")) {
$tgt.parents("span.deleteconfirm").remove();
}
}
});
121
});
Mi primera aplicacin
seria
con
CouchApp
14.Finalmente habra que subir la aplicacin a CouchDB con el
comando:
$ cd <parent-dir-addressbook-app>
$ couchapp push addressbook
http://admin:enpresadigitala@127.0.0.1:5984/addressbook
122
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
123
conforman un clster
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.
124
org/database}
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
Resolucin de conflictos
por ejemplo
La base de datos A se replica en B:
Creamos un documento en A
Forzamos replicacin:
128
Resolucin de conflictos
por ejemplo
Creamos una nueva versin del
documento en B:
129
Resolucin de conflictos
por ejemplo
Cuando replicamos ahora A en B, se
detecta un conflicto:
130
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
131
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"}'
132
Puesta en prctica de
Replicacin
Para ver si tenemos conflictos creamos una vista en dbreplica con Futon con el siguiente contenido:
function(doc) {
if(doc._conflicts) {
emit(doc._conflicts, null);
}
}
133
Algunos ejemplos de
CouchApp
Revisar documentacin en:
http://couchapp.org/page/index
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/pag
es/_rewrite/page/index
134
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
135
Aadimos un documento:
$ curl -X PUT http://127.0.0.1:5984/db-changes/test -d
'{"name":"Anna"}
136
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; }
}"
}
}
137
$ curl "$HOST/db/_changes?filter=app/important"
Tutoriales de jQuery:
http://docs.jquery.com/Tutorials
jQuery.ajax():
http://api.jquery.com/jQuery.ajax/#jQuery-ajax-setting
s
Mustache
Ejemplo:
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++
Usada por SourceForge, Bit.ly, Foursquare
o GitHub
URL: http://www.mongodb.org/
141
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
Referencias
Cassandra
NoSQL Not only SQL (Introduction to Apache
Cassandra)
http://www.scriptandscroll.com/3508/technology/nosq
l-not-only-sql-introduction-to-apache-cassandra/#.T
tonPmMk6nA
DataSax company:
http://www.datastax.com/about-us/about-datastax
http://cassandra.apache.org/
145
Referencias
CouchDB
Exploring CouchDB, Joe Lennon,
http://www.ibm.com/developerworks/opensource/library/os-CouchD
B/index.html
CouchDB tutorial
http://net.tutsplus.com/tutorials/getting-started-with-couchdb/
CouchDB site:
http://CouchDB.apache.org/
Referencias
147
dipina@deusto.es
http://paginaspersonales.deusto.es/dipina
http://www.morelab.deusto.es
Los ejemplos de este curso estn disponibles en:
http://dl.dropbox.com/u/2763621/CursoNoSQL/NoSQL-cd.rar
148