Download - MongoDb (BcnDevCon Nov 2011)
¿PORQUE NOSQL?
• Atomic
• Consistent
• Isolated
• Durable
• Basic Availability
• Soft State
• Eventual Consistency
• Consistency
• Availabilty
• Partition Tolerance
TIPOS DE BBDD NOSQL• Key / Value Pairs
• Column Familiy
• Documentales
• ….
KEY / VALUE PAIRS STORES
• Los datos se almacenan en pares (clave, valor) donde clave es usualmente una cadena y el valor un blob
• Consultas: Solo por clave
/users/1020 000101011001010110001010000101000100001001000010101010000000010111110101010101111
/users/1021 0001100110010101100010100001010110101001000001101010100000000101111101110010101110
/fras/2011/1WE1 0101010101000101010101001010010100010010010000100100100100000010100110111110
COLUMN FAMILY
Clave BcnDevCon
Columnas Lugar Barcelona
Inicio 17 / 11 / 2011
Fin 19 / 11 / 2011
Clave Salón del Manga
Columnas Lugar Barcelona
Inicio 12 / 09 / 2011
Visitantes 21428
Artista invitado Kurosawa
Ferias
DE DOCUMENTOS
• Pueden verse como una key / value pair store donde el valor está en algún formato conocido (json, bson, xml,…)
• A diferencia de los anteriores al conocer el formato de los datos pueden realizarse operaciones en estos
{“nombre” : “Edu”,“Twitter”:”Eiximenis”,“Ciudad”:”Igualada”}
{“nombre” : “Joan”,“Empresa”:”raona”,“Ciudad”:”Bcn”,“Edad” : “29”}
¿POR QUÉ MONGODB?
• Alto rendimiento
• Disponible en Windows, Unix, Mac,…
• La razón principal:
• .NET C#
• Erlang
• C / C++
• Java
• PHP
• Ruby
• Haskell
• Perl
• Python
• Coldfusion
• …
CONCEPTOS DE MONGODB
• Base de Datos
• Colección
• Documento
• Schema free
OPERACIONES BÁSICAS DE MONGODB• Conectar con una base de datos
• use BaseDeDatos
• Insertar un documento
• db.coleccion.insert({…})
• Encontrar uno o más documentos
• db.coleccion.find({…})
• Ordenar
• db.coleccion.find().sort({…})
• Metaoperadores ($or, $and,$gt)
• db.coleccion.find({$or[{…},{…},….]})
UPSERTS
• Reemplazar un documento
• db.coleccion.update()
• Upsert de un documento (creación o reemplazo)
• db.coleccion.save()
• Modificadores
• $inc
• $set / $unset
• $push / $pull
• …
MAP AND REDUCE
• Operación “equivalente” al GROUP BY de BBDD relacionales
• Posible de calcular en paralelo
• Posible de calcular con datos distribuídos entre distintas máquinas
• Se compone de dos pasos
• Map -> De una colección recoge y transforma los datos en el formato necesario para Reduce.
• Reduce -> Opera sobre los datos generados por Map efectuando los cálculos necesarios.
MAP…
{ "_id" : "1", "BlogId" : "b1", "Titulo" : "foo", "Comentarios" : [ { "Autor" : "eiximenis", "Texto" : "...." }, { "Autor" : "eiximenis", "Texto" : "...." } ]}
{ "_id" : “2", "BlogId" : "b2", "Titulo" : “bar", "Comentarios" : [ { "Autor" : “pisukeman", "Texto" : "...." }, { "Autor" : "eiximenis", "Texto" : "...." } ]}
{ "_id" : “3", "BlogId" : "b2", "Titulo" : “bar", "Comentarios" : [ { "Autor" : “bandolero", "Texto" : "...." }, { "Autor" : “pisukeman", "Texto" : "...." } ]}
MAP…{ "_id" : "1", "BlogId" : "b1", "Titulo" : "foo", "Comentarios" : [ { "Autor" : "eiximenis", "Texto" : "...." }, { "Autor" : "eiximenis", "Texto" : "...." } ]}
{ "_id" : “2", "BlogId" : "b2", "Titulo" : “bar", "Comentarios" : [ { "Autor" : “pisukeman", "Texto" : "...." }]}
{ "_id" : “3", "BlogId" : "b2", "Titulo" : “bar", "Comentarios" : [ { "Autor" : “bandolero", "Texto" : "...." }, { "Autor" : “pisukeman", "Texto" : "...." } ]}
{“BlogId” : “b1”,“NumComentarios” : 2}
{“BlogId” : “b1”,“NumComentarios” :1}
{“BlogId” : “b2”,“NumComentarios” :2}
… REDUCE{“BlogId” : “b1”,“NumComentarios” : 2}
{“BlogId” : “b1”,“NumComentarios” :1}{“BlogId” : “b2”,“NumComentarios” :2}{“BlogId” : “b1”,“NumComentarios” :7}
{“BlogId” : “b2”,“NumComentarios” : 0}
{“BlogId” : “b1”,“NumComentarios” :2}
{“BlogId” : “b1”,“NumComentarios” : 3}
{“BlogId” : “b2”,“NumComentarios” : 2}
{“BlogId” : “b1”,“NumComentarios” : 9}
{“BlogId” : “b2”,“NumComentarios” : 0}
{“BlogId” : “b1”,“NumComentarios” : 12}
{“BlogId” : “b2”,“NumComentarios” : 2}
MAP / REDUCE EN MONGODB• 2 funciones (map y reduce) escritas en javascript
• Ejecutadas en el servidor
function() { emit(this.BlogId, {numcoments : this.Comentarios.length});}
function(key, values) { var ret = {numcoments : 0}; values.forEach(function(value) { ret.numcoments +=value.numcoments; }); return ret;}
{“_id” : “b1”,[{“numcoments” : 2},{“numcoments: 4}]}
{“_id” : “b1”, “value” { “numcoments” : 6 }}
REPLICA SETS
• Redundancia de datos
• Tolerancia a fallos
• Un primario, varios secundarios
• Escrituras: Solo a/desde el primario
• Lecturas: Solo desde el primario o bien desde cualquier nodo
• Si el primario cae, un secundario toma su rol de forma automática