Humongous Mongo

Parece ser que el nombre de Mongo DB se deriva del término humongous que viene a significar algo así como “enorme” o “monstruoso”, quizá por su habilidad para tratar grandes cantidades de datos y peticiones. Yo, la primera vez que oí este nombre pensé en el planeta Mongo de los comics de Flash Gordon :-P Ejemplos de lugares donde se usa Mongo son Foursquare, Bitly o el CERN para almacenar los datos del LHC.

flash-gordon-mapa-mongo

Esta BD open source NoSQL, es de las llamadas “documentales”. En una base de datos relacional cada cliente en una tabla de clientes, tiene siempre los mismos campos, nombre, apellidos, dni… en una BD documental, hoy un cliente de la colección clientes tiene quizá 10 campos, si el mes que viene nos damos cuenta de que los nuevos clientes necesitan 12, no hay problema, simplemente insertamos los nuevos con 12 campos. Es una BD sin un esquema que restrinja (o garantice) una estructura. Más libertad para el usuario, pero también más responsabilidad.

El lenguaje nativo de Mongo es javascript y las consultas e inserciones de documentos se hacen en JSON. Para insertar Zaragoza en la colección de ciudades hacemos algo así:

una_ciudad = {
nombre: “Zaragoza”,
poblacion: 700000,
ultimo_censo: ISODate(“2010-01-01”),
famosa_por: [ “basilica pilar”, “rio ebro” ],
alcalde : {
nombre : “Belloc”,
partido : “PSOE” }
}
db.ciudades.insert(una_ciudad)

Los atributos de un documento pueden estar anidados todo lo que sea necesario: un documento ciudad podría tener barrios, que contienen calles, que tienen direcciones, etc. No hay joins, ni ningún mecanismo out of the box que te cree referencias entre documentos. La escalabilidad tiene un precio.

Para hacer una búsqueda podemos definirla con JSON { nombre : /^P/, poblacion : { $lt : 10000 } } y realizar la consulta de la siguiente manera:

db.ciudades.find(
{ nombre : /^P/, poblacion : { $lt : 10000 } },
{ nombre : 1, poblacion : 1 }
)
En el caso anterior: nombre que empiece por P, población menor de 10000, muestra solo los campos nombre y población. Es como cuando usamos la cláusula WHERE en SQL.

De forma similar se pueden hacer actualizaciones y borrados. Es una forma de trabajar que no difiere mucho de la habitual en BD relacionales, cosa que facilita que Mongo esté teniendo buena acogida entre los desarrolladores.

Aparte de la flexibilidad en la estructura de los documentos que metemos en las colecciones, el otro punto fuerte de Mongo es lo bien que trabaja con cantidades muy grandes de datos, y lo hace garantizando la disponibilidad de estos mediante dos mecanismos: Replicación y Escalado Horizontal (Sharding).

En Mongo es muy sencillo levantar varios servidores indicándoles que cada uno debe mantener una réplica de una BD. Una de las instancias es la primaria y el resto secundarias. Todo lo que hagamos sobre la primaria se replica en las secundarias. Si la primaria cae las instancias restantes deciden de forma autónoma quien es la nueva primaria.

mongod –replSet book –dbpath ./mongo1 –port 27011 –rest
mongod –replSet book –dbpath ./mongo2 –port 27012 –rest
mongod –replSet book –dbpath ./mongo3 –port 27013 –rest

El otro mecanismo es el sharding. El contenido de una colección se puede distribuir entre distintos servidores, permitiendo que las peticiones sean gestionadas por distintas instancias dependiendo de lo que estés consultando o insertando. Es el clásico divide y vencerás.

Montar un sharding necesita tener servidores con tres roles diferentes. Están los servidores mongo shards que hemos comentado repartiéndose los datos. Están los mongo que reciben las peticiones de los clientes, que terminan cayendo a los shards. Y están los mongo de configuración que orquestan la fiesta.

En una instalación en producción sharding y replicación se combinan quedando una foto como la que sigue:

sharding-mongo

A diferencia de una BD clave-valor como Riak en la que añadir nuevos nodos es transparente e indoloro. En el caso de Mongo hay que pensarlo un poco. Es el coste de ofrecer más funcionalidad.

Mongo no es solamente otra de las especies del planeta NoSQL, es una de las que más éxito está teniendo.

Un comentario en “Humongous Mongo”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *