1 Bd NoSQL Documentos PROFA. MERCY OSPINA [email protected]
2 Agenda Modelo de datos Operaciones Técnicas usadas Cuando usar Caso de estudio
3 Modelo de datos Un documento auto descrito que puede estar en formato Json o XML Un documento Json (los mas usados) ◦ Es un conjunto de clave:valor o arreglos de clave:valor ◦ Los documentos están almacenados por una clave ◦ El sistema entiende la estructura arbitraria de los documentos ◦ Da soporte a listas, apuntadores a documentos y documentos anidados ◦ Permite crear índices secundarios además de índices sobre la clave
4 Modelo de datos 4
5 Modelo de datos - Estructuras Base de datos Contenedor físico de colecciones o documentos Colecciones Agrupaciones de documentos, no todas las BD lo tienen Documento Unidad básica de datos en Json Valores Atómicos Listas o arreglos Adjuntos (pdf, jpg, etc) 5
6 Caso de Estudio – Tipos de datos 6 Los definidos por Json String - Cadenas de caracteres. Integer - Números enteros. Double - Números con decimales. Boolean - Booleanos verdaderos o falsos. Date - Fechas. Timestamp - Marcas de tiempo. Null - Valor nulo. Array - Arreglos de otros tipos de dato. Object - Otros documentos embebidos. ObjectID - Identificadores únicos creados por MongoDB al crear documentos sin especificar valores para el campo _id. Data Binaria - Punteros a archivos binarios. Javascript - código y funciones Javascript
7 Caso de Estudio – Patrones de modelado 7 Existen 2 patrones principales para establecer la estructura que tendrán los documentos para relacionar datos que en una base de datos relacional estarían en diferentes tablas. Embeber ◦ Este patrón se enfoca en incrustar documentos uno dentro de otro con la finalidad de hacerlo parte del mismo registro y que la relación sea directa. Referenciar ◦ Este patrón busca imitar el comportamiento de las claves foráneas para relacionar datos que deben estar en colecciones diferentes.
8 Caso de Estudio – Patrones de modelado 8 Embeber Persona= { Nombre: 'Jonathan', Apellido: 'Wiesel', Genero: 'M', Documentos: { Pasaporte: 'D123456V7', Licencia: '34567651-2342', seguro_social: 'V-543523452' } } Relaciones 1:1
9 Caso de Estudio – Patrones de modelado 9 Persona= { Nombre: 'Jonathan', Apellido: 'Wiesel', Genero: 'M', Direcciones: [{ país: 'Venezuela', estado: 'Distrito capital‘, ciudad: 'Caracas', urbanizacion: 'La Florida', avenida:..., edificio:..., piso:..., apartamento:... }, { país: 'Estados Unidos', estado: 'Florida‘, ciudad: 'Miami‘, urbanizacion: 'Aventura', avenida:..., edificio:..., piso:..., apartamento:... }] } Relaciones 1:n Embeber
10 Caso de Estudio – Patrones de modelado 10 Direccion1: { _id: 1 país: 'Venezuela', estado: 'Distrito capital‘, ciudad: 'Caracas', urbanizacion: 'La Florida', avenida:..., edificio:..., piso:..., apartamento:... } Direccion2: { _id: 2, país: 'Estados Unidos', estado: 'Florida‘, ciudad: 'Miami‘, urbanizacion: 'Aventura', avenida:..., edificio:..., piso:..., apartamento:... } Relaciones 1:n Persona= { Nombre: 'Jonathan', Apellido: 'Wiesel', Genero: 'M', Direcciones: [1,2] } Referenciar
11 Caso de Estudio – Patrones de modelado 11 Relaciones n:m
12 Caso de Estudio – Patrones de modelado 12 Direccion1: { _id: 1 país: 'Venezuela', estado: 'Distrito capital‘, ciudad: 'Caracas', urbanizacion: 'La Florida', avenida:..., edificio:..., piso:..., apartamento:... personas: [100,101] } Direccion2: { _id: 2, país: 'Estados Unidos', estado: 'Florida‘, ciudad: 'Miami‘, urbanizacion: 'Aventura', avenida:..., edificio:..., piso:..., apartamento:... personas [100]} Relaciones n:m Persona1= { _id 100 Nombre: 'Jonathan', Apellido: 'Wiesel', Genero: 'M', Direcciones: [1,2] } Persona2= { _id 101 Nombre: ‘Carlos', Apellido: ‘Cerqueira', Genero: 'M', Direcciones: [1] }
13 Caso de Estudio – Patrones de modelado 13 Relaciones n:m Atributo propio
14 Caso de Estudio – Patrones de modelado 14 Direccion1: { _id: 1 país: 'Venezuela', estado: 'Distrito capital‘, ciudad: 'Caracas', urbanizacion: 'La Florida', avenida:..., edificio:..., piso:..., apartamento:... personas: [100,101] } Direccion2: { _id: 2, país: 'Estados Unidos', estado: 'Florida‘, ciudad: 'Miami‘, urbanizacion: 'Aventura', avenida:..., edificio:..., piso:..., apartamento:... personas [100]} Relaciones n:m Persona1= { _id 100 Nombre: 'Jonathan', Apellido: 'Wiesel', Genero: 'M', direcciones : [{ direccion_id : 1, viveAqui : true },{ direccion_id : 2, viveAqui : false }]} Persona2= { _id 101 Nombre: ‘Carlos', Apellido: ‘Cerqueira', Genero: 'M', direcciones : [{ direccion_id : 1, viveAqui : true }] }
15 Distribución de los datos Sharding automático: ◦ Por rango de clave, con servidor de metadata que mantiene la ubicación de los rangos ◦ Hashing consistente
16 Almacenamiento Si cada nodo tiene un conjunto de claves aleatorias, internamente puede almacenarse de distintas maneras: ◦ Tabla hash ◦ arboles B+ (Tokyo Cabinet) Tipos de registros ◦ ◦ Tupla
17 Operaciones CRUD ◦ Create: Crea un nuevo documento ◦ Read: Lee uno o mas documentos ◦ Update: Actualiza un documento nuevo ◦ Delete: Elimina uno o más documentos REST ◦ GET: Retorna un documento con un id dado ◦ PUT: Crea un nuevo documento o una nueva versión ◦ DELETE: Marca un documento como borrado Map - Reduce 17
18 Técnicas usadas - ejemplos ProblemaMongoDBCouchDB TopologíaCluster (maestro esclavo)Anillo Sharding Particionamiento por rango, particionamiento por hash y splitting Hashing Consistente Control de concurrencia Bloqueo compartido (S) para lectura y Exclusivo (X) para escritura con intentos de bloqueo (IS e IX) MVCC y relojes de vector con reconciliación durante lecturas Manejo de fallas temporales Servidor de configuración Sloppy Quorum y hinted handoff Manejo de fallas permanentes Replica sets maestro esclavo con elección de nuevo maestro cuando se presentan fallas Anti- entropía con árboles Merkle para Consistencia de Replicas Nodos salientes o entrantesSharded Collection Balancing Protocolo de membresía basado en Gossip y detección de fallas. Búsquedas Árboles B+ para Índices por clave y secundarios
19 Caso de Estudio 19 Viene de la palabra en inglés “humongous” que significa enorme Su desarrollo empezó en octubre de 2007 por la compañía de software 10gen, aunque su lanzamiento fue en el 2009 Es de código abierto, con licencia GNU AGPL (para SW de red) Última versión estable 3.0.2 el 9 de abril de 2015 Guarda estructuras de datos en documentos tipo JSON con un esquema dinámico (MongoDB llama ese formato BSON)JSONBSON https://docs.mongodb.org
20 Caso de Estudio- Operaciones CRUD ◦ Create 20
21 Caso de estudio - Operaciones CRUD ◦ Update ◦ Delete 21
22 Caso de Estudio - Consultas 22 En MongoDB una consulta se dirige a una colección específica de documentos. Las consultas especifican criterios o condiciones, que identifican los documentos que MongoDB vuelve a los clientes Una consulta puede incluir una proyección que especifica los campos de los documentos Opcionalmente, se puede imponer límites o criterios de ordenación a las consultas.
23 Caso de Estudio - Consultas 23
24 Caso de estudio- Índices Los índices en MongoDB son a nivel de colección y son similares a los índices en otros sistemas de base de datos ◦ Índices primarios para _id (clave primaria): se crean por defecto ◦ Índices secundarios para atributos en el documento ◦ Un solo campo ◦ Múltiples campos 24 db.users.createIndex({ “score" : 1 })
25 Caso de estudio - Índices Múltiples campos (Índices compuestos): hace referencia a múltiples campos en una colección de documentos ◦ db.events.createIndex( { "username" : 1, "date" : -1 } ) Este índice soporta las siguientes consultas ◦ db.events.find().sort( { username: 1, date: -1 } ) ◦ db.events.find().sort( { username: -1, date: 1 } ) 25
26 Caso de Estudio – Arquitectura 26 mongod es el proceso demonio primario para el sistema de MongoDB. Se ocupa de las solicitudes de datos, gestiona el acceso de datos, y realiza operaciones de gestión en background. Mongos para " MongoDB Shard", es un servicio de enrutamiento para las configuraciones de fragmento MongoDB que procesa las consultas de la capa de aplicación, y determina la ubicación de los datos en el clúster fragmentado, con el fin de completar estas operaciones. Config Server Mongos utiliza tres servidores de configuración para almacenar los metadatos del cluster, y los tres deben estar disponibles para apoyar cambios que incluyen divisiones de chunks y migraciones. Si uno de los servidores de configuración no está disponible debe reemplazarlo a la brevedad posible.
27 Caso de estudio - Replicación Un conjunto de replica ◦ Es un grupo de instancias de mongod que mantiene el mismo conjunto de datos, donde el primario recibe las actualizaciones de los clientes quien las replica a los secudarios 27
28 Caso de estudio - Replicación Fallo del primario ◦ Automaticamente se elige como primario a uno de los secundarios 28
29 Caso de estudio - Replicación Si el nodo se recupera ◦ Pasa a ser secundario 29
30 Caso de estudio - Sharding Divide el conjunto de datos y distribuye los datos a través de múltiples servidores o fragmentos. ◦ Cada fragmento es una base de datos independiente, ◦ y colectivamente, los fragmentos forman una sola base de datos lógica. 30
31 Caso de estudio - Sharding 31 Escalabilidad para escribir Key Range 0..100 mongod Key Range 0..50 Key Range 51..100
32 Caso de estudio - Sharding 32 mongod Key Range 0..25 Key Range 26..50 Key Range 51..75 Key Range 76.. 100 Escalabilidad para escribir
33 Caso de estudio - Sharding 33 Primary Secondary Primary Secondary Primary Secondary Primary Secondary Key Range 0..25 Key Range 26..50 Key Range 51..75 Key Range 76.. 100
34 Primary Secondary Primary Secondary Primary Secondary Primary Secondary Key Range 0..25 Key Range 26..50 Key Range 51..75 Key Range 76.. 100 MongoS Aplicación Caso de estudio - Sharding
35 Primary Secondary Primary Secondary Primary Secondary Primary Secondary Key Range 0..25 Key Range 26..50 Key Range 51..75 Key Range 76.. 100 MongoS Config Aplicación Caso de estudio - Sharding
36 Caso de estudio - Splitting 36 Splitting o división es un proceso en background que asegura que los datos almacenados no excedan un tamaño específico Mongo divide los datos en trozos (chunks). Cuando un trozo crece más allá de un tamaño especificado, MongoDB lo divide por la mitad y distribuye los trozos en un servidor de fragmentos.
37 Caso de estudio - Seguridad 37 MongoDB provee control de acceso basado en usuario o en Roles db.createUser( { user: "reportsUser", pwd: "12345678", roles: [ { role: "read", db: "reporting" }, { role: "read", db: "products" }, { role: "read", db: "sales" }, { role: "readWrite", db: "accounts" } ] } ) db.createRole( { role: "mongostatRole", privileges: [ { resource: { cluster: true }, actions: [ "serverStatus" ] } ], roles: [] } )
38 Caso de estudio - Seguridad 38 Para asignar un Rol a un usuario db.grantRolesToUser( "reportsUser", [ { role: "readWrite", db: "products" }, { role: "readAnyDatabase", db:"admin" } ] ) Tambien permite el uso de un proxy a través del protocolo LDAP
39 Caso de estudio – Quienes usan 39
40 Caso de estudio – Consultas avanzadas Consultas con arreglo de documentos: ◦ La siguiente operación devuelve documentos de la colección bios donde un arreglo premios contiene un elemento de documento incrustado que contiene el campo premio igual al "Premio Turing" y el campo de año mayor a 1980: db.bios.find( { awards: { $elemMatch: { award: "Turing Award", year: { $gt: 1980 } } )
41 Caso de estudio – Consultas avanzadas Consultas con documentos embebidos ◦ La siguiente operación devuelve documentos de la colección bios donde el documento embebido name es exactamente { first: "Yukihiro", last: "Matsumoto" } db.bios.find( { name: { first: "Yukihiro", last: "Matsumoto" } ) db.bios.find( { "name.first": "Yukihiro", "name.last": "Matsumoto" } )
42 Caso de estudio – Consultas avanzadas Cursores: ◦ El método db.collection.find() consulta una colección y retorna un cursor a los documentos resultantes ◦ Para acceder a los documentos se necesita iterar el cursor var myCursor = db.inventory.find(); var myFirstDocument = myCursor.hasNext() ? myCursor.next() : null; myCursor.objsLeftInBatch(); http://docs.mongodb.org/manual/core/cursors/
43 Caso de estudio – Consultas avanzadas Agregación: operaciones que procesan registros de datos y retornan resultados calculados Posee tres formas de agregación ◦ Pipeline de agregación: framework para llevar a cabo tareas de agregación. Modelado en el concepto de pipelines de procesamiento de datos ◦ Map-Reduce: Operaciones con dos fasos Map y Reduce. Usa funciones de Javascript ◦ Operaciones de agregación de propósito simple: comandos de base de datos de propósito especial
44 Caso de estudio – Consultas avanzadas Pipeline de agregación: Es una serie de transformación de Documentos ◦ Se ejecuta en estapas (stages) ◦ La entrada original es una colección ◦ Las salidas son documentos, cursores o colecciones ◦ Escrito en C++ ◦ Trabaja bien con Shardings http://www.slideshare.net/mongodb/aggregation-framework-36715147 $match$project$group$sort
45 Caso de estudio – Consultas avanzadas Pipeline de agregación: http://www.slideshare.net/mongodb/aggregation-framework-36715147
46 Caso de estudio – Consultas avanzadas ◦ Map-Reduce: Map: procesa cada documento y emite uno o dos objetos y Reduce: combina la salida de la operación Map.
47 Caso de estudio – Consultas avanzadas Operaciones de agregación de propósito simple: comandos de base de datos de propósito especial ◦ Count: cuenta los elementos de una colección que cumplen la condición de la consulta ◦ db.collection.count(consulta) ◦ db.collection.find(consulta).count() ◦ Disctint: Encuentra los valores diferentes de un campo ◦ db.collection.distinct(campo, consulta) ◦ Group
48 Caso de estudio – Consultas avanzadas db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] }) keydocumento Campo o campos a agrupar. Retorna una “key object” para usar como la clave de agrupamiento. reducefunción Una función de agregación que opera sobre los documentos durante la operación de agrupamiento. Puede retornar una suma o un conteo. Toma dos argumentos: el actual documento y un documento resultado de la agregación para el grupo. initialDocumentodocumento resultado de la agregación inicial keyfFunción Opcional. Alternativa al campo clave. Especifica una funcion que crea un “key object” para usar como clave de agrupamiento. Use keyf en lugar de key para agrupar por campos calculados. condDocumento Criterios de selección para determinar qué documentos de la colección procesar. Si se omite, se procesarán todos los documentos de la colección para la operación del grupo. finalizefunción Opcional. Una función que ejecuta cada elemento en el conjunto de resultados antes de que db.collection.group () devuelve el valor final. Esta función puede o bien modificar el documento resultado o sustituir el documento resultado como un todo.
49 Caso de estudio – Consultas avanzadas - Explain ◦ Retorna informacion del plan de consulta para las siguientes operaciones: ◦ aggregate(); count(); find(); group(); remove(); and update() methods. ◦ db.collection.explain(). ◦ Presenta el plan de consulta (query plan) como un árbol de etapas. ◦ Cada etapa pasa sus resultados (es decir, documentos o claves de índice) al nodo padre. ◦ Los nodos hoja acceden a la colección o los índices. ◦ Los nodos internos manipulan los documentos o las claves de índice que se derivan de los nodos secundarios. ◦ El nodo raíz es la etapa final de la que MongoDB deriva del conjunto de resultados
50 Caso de estudio – Consultas avanzadas - Explain ◦ Algunas de las operaciones del plan son: ◦ COLLSCAN Scan de una coleccion ◦ IXSCAN para búsqueda en el índice ◦ FETCH para recuperación de documentos ◦ SHARD_MERGE para mezclar results de fragmentos ◦ El explain tiene los siguientes parámetros opcionales (modos de verbosity) ◦ queryPlanner: es el modo por defecto, retorna solamente el plan de consulta ◦ executionStats: muestra el plan de consulta e información de ejecución ◦ allPlansExecution: muestra todos los posibles planes de ejecución.
51 Caso de estudio – Consultas avanzadas - Explain Ejemplos ◦ db.products.explain().count( { quantity: { $gt: 50 } } ) ◦ Retorna solo el plan de consulta ◦ db.products.explain("executionStats").find( { quantity: { $gt: 50 }, category: "apparel" } ) ◦ Retorna el plan de consulta y información de ejecución ◦ db.products.explain("allPlansExecution").update( { quantity: { $lt: 1000}, category: "apparel" }, { $set: { reorder: true } } ) ◦ No modifica los datos pero retorna todos los posibles planes de ejecución
52 Caso de estudio – respaldos Respaldo por copia de datos subyacentes: ◦ Se trata de una copia de snapshot en un punto del tiempo, sin embargo no depende de mongo sino del sistema operativo. mongodump - mongorestore ◦ mongodump: lee datos de una base de datos y crea archivos Bson de alta fidelidad ◦ mogorestore: restaura una base de datos desde un archivo Bson. mongoimport – mongoexport ◦ mongoexport es una utilidad que produce una exportación Json o CSV de los datos almacenados en una instancia de MongoDB. ◦ mongoimport importa el contenido de un archivo Json o CSV creado por mongoexport u otra herramienta de terceros.
53 Caso de estudio – Usos Cualquier aplicación que necesite almacenar datos semi estructurados Algunos casos de uso ◦ Almacenamiento y registro de eventos ◦ Manejo de documentos y contenido ◦ Comercio Electrónico ◦ Alto volúmenes de lectura ◦ Aplicaciones móviles ◦ Manejo de contenido ◦ Almacenamiento de comentario
54 Próxima clase BD Familia de columnas: ◦ Modelo de datos ◦ Operaciones ◦ Técnicas usadas ◦ Caso de estudio