MongoDB

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda
MongoDB
Desarrollador(es)
MongoDB Inc.
http://www.mongodb.org/
Información general
Modelo de desarrollo Código abierto
Lanzamiento inicial 2009
Última versión estable 3.2.4 (info)
7 de marzo de 2016; hace 4 meses (2016-03-07)
Última versión en pruebas 3.2.0-rc5 (info)
1 de diciembre de 2015; hace 7 meses (2015-12-01)
Género Base de datos, NoSQL
Programado en C++
Sistema operativo Multiplataforma
Licencia GNU AGPL v3.0 (drivers: licencia Apache)
[editar datos en Wikidata]

MongoDB (de la palabra en inglés “humongous” que significa enorme) es un sistema de base de datos NoSQL orientado a documentos, desarrollado bajo el concepto de código abierto.

MongoDB forma parte de la nueva familia de sistemas de base de datos NoSQL. En lugar de guardar los datos en tablas como se hace en las base de datos relacionales, MongoDB guarda estructuras de datos en documentos similares a JSON con un esquema dinámico (MongoDB utiliza una especificación llamada BSON), haciendo que la integración de los datos en ciertas aplicaciones sea más fácil y rápida.

El desarrollo de MongoDB empezó en octubre de 2007 por la compañía de software 10gen.[1] Ahora MongoDB es una base de datos lista para su uso en producción y con muchas características (features). Esta base de datos se utiliza mucho en la industria[2] , contando con implantaciones en empresas como MTV Network,[3] Craiglist[4] o Foursquare[5] .

El código binario está disponible para los sistemas operativos Windows, Linux, OS X y Solaris.

Historia[editar]

El desarrollo de MongoDB empezó con la empresa de software 10gen Inc. (ahora llamada MongoDB Inc.)[1] en 2007 cuando estaban desarrollando una plataforma como servicio (PaaS) similar al conocido Google App Engine.[6] En 2009 MongoDB fue lanzado como un producto independiente y publicado bajo la licencia de código abierto AGPL.[7]

En marzo de 2011, se lanzó la versión 1.4 y se consideró ya como una base de datos lista para su uso en producción.[8]

Concesión de licencias y soporte[editar]

MongoDB se puede obtener de una forma gratuita bajo la licencia pública general de Affero (AGPL) de GNU.[9] Los drivers para los lenguajes de programación están bajo la licencia de Apache. Adicional a estas licencias, MongoDB Inc. ofrece una licencia comercial para MongoDB que incluye características avanzadas (como integración con SASL, LDAP, Kerberos[10] , Simple Network Management Protocol[11] y búsqueda de texto de Rosette Linguistics Platform de Basis Technology[12] ), herramientas de gestión, monitorización y backup, así como soporte. [13]

Características principales[editar]

Lo siguiente es una breve descripción de las características principales de MongoDB:

Consultas Ad hoc[editar]

MongoDB soporta la búsqueda por campos, consultas de rangos y expresiones regulares. Las consultas pueden devolver un campo específico del documento pero también puede ser una función JavaScript definida por el usuario.

Indexación[editar]

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.

Replicación[editar]

MongoDB soporta el tipo de replicación primario-secundario. Cada grupo de primario y sus secundarios se denomina replica set [14] . El primario puede ejecutar comandos de lectura y escritura. Los secundarios replican los datos del primario y sólo se pueden usar para lectura o para copia de seguridad, pero no se pueden realizar escrituras. Los secundarios tiene la habilidad de poder elegir un nuevo primario en caso de que el primario actual deje de responder.

Balanceo de carga[editar]

MongoDB se puede escalar de forma horizontal usando el concepto de “shard”.[15] El desarrollador elige una clave de sharding, la cual determina cómo serán distribuidos los datos de una colección. Los datos son divididos en rangos (basado en la clave de sharding) y distribuidos a través de múltiples shard. Cada shard puede ser una replica set. MongoDB tiene la capacidad de ejecutarse en múltiple servidores, balanceando la carga y/o replicando los datos para poder mantener el sistema funcionando en caso que exista un fallo de hardware. La configuración automática es fácil de implementar bajo MongoDB y se pueden agregar nuevas servidores a MongoDB con el sistema de base de datos funcionando.

Almacenamiento de archivos[editar]

MongoDB puede ser utilizado como un sistema de archivos, tomando la ventaja de la capacidad que tiene MongoDB para el balanceo de carga y la replicación de datos utilizando múltiples servidores para el almacenamiento de archivos. Esta función se llama GridFS[16] y es mas bien una implementación en los drivers, no en el servidor[17] , por lo que está incluida en los drivers oficiales que la compañía de MongoDB desarrolla. Estos drivers exponen funciones y métodos para la manipulación de archivos y contenido a los desarrolladores. En un sistema con múltiple servidores, los archivos pueden ser distribuidos y replicados entre los mismos y de una forma transparente, de esta forma se crea un sistema eficiente que maneja fallos y balanceo de carga.

Agregación[editar]

MongoDB proporciona un framework de agregación que permite realizar operaciones similares a las que se obtienen con el comando SQL "GROUP BY". El framework de agregación está construido como un pipeline en el que los datos van pasando a través de diferentes etapas en los cuales estos datos son modificados, agregados, filtrados y formateados hasta obtener el resultado deseado. Todo este procesado es capaz de utilizar índices si existieran y se produce en memoria. Asimismo, MongoDB proporciona una función MapReduce que puede ser utilizada para el procesamiento por lotes de datos y operaciones de agregación.

Ejecución de JavaScript del lado del servidor[editar]

MongoDB tiene la capacidad de realizar consultas utilizando JavaScript, haciendo que estas sean enviadas directamente a la base de datos para ser ejecutadas.

Fragmentación (Sharding)[editar]

Si estas desarrollando un servicio que se va haciendo popular o los niveles de acceso a base de datos son cada vez más altos, empezarás a notar que tu base de datos está siendo martillada por el exceso de tráfico y tu servidor esté sufriendo por los altos niveles de procesamiento continuo y te podrías ver en la necesidad de actualizar tu infraestructura para soportar la demanda.

Aquí entra en juego la fragmentación, es el modo en el que hacemos nuestra base de datos escalable. En lugar de tener una colección en una base de datos, la pondríamos en varias bases de datos distribuidas, de modo que a la hora de consultar los datos de dicha colección, los recuperemos como si de una única base de datos se tratase. Mongo se encargará de averiguar de manera transparente en que base de datos se encuentran los datos.

Los fragmentos estarán formados por replica set, de modo que si creamos tres fragmentos, cada uno de los cuales tiene una replica set con tres servidores, estaríamos hablando de un total de nueve servidores.

Si hacemos consultas, estas se realizarán de manera distribuida a través de un módulo enrutador llamado “MongoS” que mantendrá un pequeño pull de conexiones a los distintos host. Para conocer en que fragmento debe consultar para recuperar datos de una colección ordenada, se utilizan rangos y shard_key, de modo que se trocea la colección en rangos y les asigna un id (shard_key), que puede ser una parte del propio documento, y se distribuye en los fragmentos (replica set). De modo que cuando se consulte la colección debemos proporcionar el “shard_key”.

Principales problemas[editar]

No implementa las propiedades ACID[editar]

El no implementar las propiedades ACID genera que la base de datos no asegure la durabilidad, la integridad, la consistencia y el aislamiento requeridos obligatoriamente en las transacciones. Es posible que en futuras versiones esto se solucione.

Sobre la base de este punto se detallan los cuatro siguientes:

Problemas de consistencia[editar]

Las lecturas estrictamente consistentes ven versiones obsoletas de documentos, también pueden devolver datos incorrectos de lecturas que nunca deberían haber ocurrido.[18]

Bloqueo a nivel de documento[editar]

MongoDB bloquea la base de datos a nivel de documento ante cada operación de escritura. Sólo se podrán hacer operaciones de escritura concurrentes entre distintos documentos.

Las escrituras no son durables ni verificables[editar]

MongoDB retorna cuando todavía no se ha escrito la información en el espacio de almacenamiento permanente, lo que puede ocasionar pérdidas de información. En MongoDB 2.2 se cambia el valor por defecto para escribir en al menos una réplica, pero esto sigue sin satisfacer la durabilidad ni la verificabilidad.[19]

Problemas de escalabilidad[editar]

Tiene problemas de rendimiento cuando el volumen de datos supera los 100GB.[20]

Casos de uso[editar]

La base de datos MongoDB es adecuada para los siguientes usos:[21]

  • Almacenamiento y registro de eventos
  • Para sistemas de manejo de documentos y contenido
  • Comercio Electrónico
  • Juegos
  • Problemas de alto volumen de lecturas
  • Aplicaciones móviles
  • Almacén de datos operacional de una página web
  • Manejo de contenido
  • Almacenamiento de comentarios
  • Votaciones
  • Registro de usuarios
  • Perfiles de usuarios
  • Sesiones de datos
  • etc.
  • Proyectos que utilizan metodologías de desarrollo iterativo o ágiles
  • Manejo de estadísticas en tiempo real

MongoDB es utilizado para uno o varios de estos casos por varias empresas.[22]

Manipulación de datos: colecciones y documentos[editar]

MongoDB guarda la estructura de los datos en documentos tipo JSON con un esquema dinámico llamado BSON, lo que implica que no existe un esquema predefinido. Los elementos de los datos se denominan documentos y se guardan en colecciones. Una colección puede tener un número indeterminado de documentos. Comparando con una base de datos relacional, se puede decir que las colecciones son como tablas y los documentos son registros en la tabla. La diferencia es que en una base de datos relacional cada registro en una tabla tiene la misma cantidad de campos, mientras que en MongoDB cada documento en una colección puede tener diferentes campos. En un documento, se pueden agregar, eliminar, modificar o renombrar nuevos campos en cualquier momento,[23] ya que no hay un esquema predefinido. La estructura de un documento es simple y compuesta por “key-value pairs” parecido a las matrices asociativas en un lenguaje de programación, esto es debido a que MongoDB sigue el formato de JSON. En MongoDB la clave es el nombre del campo y el valor es su contenido, los cuales se separan mediante el uso de “:”, tal y como se puede ver en el siguiente ejemplo. Como valor se pueden usar números, cadenas o datos binarios como imágenes o cualquier otro “key-value pairs”.

{
    "_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
    "Last Name": "PELLERIN",
    "First Name": "Franck",
    "Age": 29,
    "Address": {
        "Street": "1 chemin des Loges",
        "City": "VERSAILLES"
    }
}

En este ejemplo se puede ver que en el campo “Address” se contiene otro documento que tiene los campos de “Street” y “City”.

Lenguajes de programación soportados[editar]

MongoDB tiene drivers oficiales para los siguientes lenguajes de programación:

Instrumentos de MongoDB[editar]

Los siguientes comandos pueden ser instalados para el manejo y la administración del sistema de base de datos:

  • mongo:[24] es un Shell interactivo que permite a los desarrolladores y administradores ver, insertar, eliminar y actualizar datos en su base de datos. Este también permite entre otras funciones la replicación de datos, configuración de sharding, apagar los servidores, ejecutar JavaScript y todos los comandos que se puedan realizar.
  • mongostat:[25] es un instrumento de línea de comandos que muestra en resumen una lista de estadísticas de una instancia de MongoDB en ejecución. Esto te permite visualizar cuantas inserciones, actualizaciones, eliminaciones, consultas y comandos se han ejecutado, pero también cuanta memoria está utilizando y cuanto tiempo ha estado cerrada la base de datos.
  • mongotop:[26] es un instrumento de línea de comandos que provee un método para dar seguimiento a la cantidad de tiempo que dura una lectura o escritura de datos en una instancia. También provee estadísticas en el nivel de cada colección.
  • mongosniff:[27] es un instrumento de línea de comandos que provee un sniffing en la base de datos haciendo un sniffing en el tráfico de la red que va desde y hacia MongoDB.
  • mongoimport/mongoexport:[28] [29] es un instrumento de línea de comandos que facilita la importación exportación de contenido desde JSON, CSV o TSV. También tiene el potencial de importar o exportar hacia otros formatos.
  • mongodump/mongorestore:[30] es un instrumento de línea de comandos para la creación de una imagen binaria del contenido de la base de datos. Estos comandos son utilizados para la estrategia de copias de seguridad en MongoDB.

Referencias[editar]

  1. a b «10gen Announces Company Name Change to MongoDB, Inc.». MongoDB. Consultado el 6 de mayo de 2016. 
  2. http://db-engines.com/en/ranking
  3. http://blog.mongodb.org/post/5360007734/mongodb-powering-mtvs-web-properties
  4. http://blog.mongodb.org/post/5545198613/mongodb-live-at-craigslist
  5. http://web.archive.org/web/http://blip.tv/mongodb/mongodb-at-foursquare-3723202
  6. http://www.theregister.co.uk/2011/05/25/the_once_and_future_mongodb/
  7. http://blog.mongodb.org/post/103832439/the-agpl
  8. http://blog.mongodb.org/post/472835820/mongodb-1-4-ready-for-production
  9. http://blog.mongodb.org/post/103832439/the-agpl
  10. «Enterprise Authentication Mechanisms — MongoDB Manual 3.2». docs.mongodb.com. Consultado el 6 de mayo de 2016. 
  11. «Monitor MongoDB With SNMP on Linux — MongoDB Manual 3.2». docs.mongodb.com. Consultado el 6 de mayo de 2016. 
  12. «Text Search with Basis Technology Rosette Linguistics Platform — MongoDB Manual 3.2». docs.mongodb.com. Consultado el 6 de mayo de 2016. 
  13. https://www.mongodb.com/lp/contact/enterprise
  14. https://docs.mongodb.org/manual/replication/
  15. http://www.mongodb.org/display/DOCS/Sharding
  16. http://www.mongodb.org/display/DOCS/GridFS
  17. «mongodb/specifications». GitHub. Consultado el 12 de abril de 2016. 
  18. Call me maybe: MongoDB stale reads
  19. Broken by Design: MongoDB Fault Tolerance :: Hacking, Distributed
  20. MongoDB mocked after posting “100GB Scaling Checklist”
  21. http://www.mongodb.org/display/DOCS/Use+Cases
  22. http://web.archive.org/web/http://www.mongodb.org/display/DOCS/Production+Deployments
  23. http://www.mongodbspain.com/wp-content/uploads/2014/03/MongoDBSpain-CheetSheet.pdf
  24. http://www.mongodb.org/display/DOCS/mongo+-+The+Interactive+Shell
  25. http://docs.mongodb.org/manual/reference/mongostat/
  26. http://docs.mongodb.org/manual/reference/mongotop/
  27. http://docs.mongodb.org/manual/reference/mongosniff/
  28. http://docs.mongodb.org/manual/reference/mongoimport/
  29. http://docs.mongodb.org/manual/reference/mongoexport/
  30. http://docs.mongodb.org/manual/reference/mongodump/

Bibliografía[editar]

  • Banker, Kyle (28 de marzo de 2011), MongoDB in Action (1st edición), Manning, p. 375, ISBN 9781935182870 
  • Chodorow, Kristina; Dirolf, Michael (23 de septiembre de 2010), MongoDB: The Definitive Guide (1st edición), O'Reilly Media, p. 216, ISBN 9781449381561 
  • Pirtle, Mitch (3 de marzo de 2011), MongoDB for Web Development (1st edición), Addison-Wesley Professional, p. 360, ISBN 9780321705334 
  • Hawkins, Tim; Plugge, Eelco; Membrey, Peter (26 de septiembre de 2010), The Definitive Guide to MongoDB: The NoSQL Database for Cloud and Desktop Computing (1st edición), Apress, p. 350, ISBN 9781430230519 

Enlaces externos[editar]