miércoles, 29 de mayo de 2013

Manipulando datos con MapReduce en MongoDB

Después de haber tratado anteriormente como manipular datos con Aggregation Framework, hoy os vamos a hablar de MapReduce y como poder realizar operaciones de agregaciones complejas en nuestra base de datos Mongo.

Este sistema es ejecutado directamente en el lado del servidor, por lo que no tenemos que descargar previamente los datos que deseamos manipular. En MapReduce definimos funciones en JavaScript  para manipular dichos datos, estas funciones se basan en los conceptos:

  • Map() Usada para agrupar los datos a manipular en forma de par - valor, uniendo todos los pares con la misma clave en un mismo grupo, con esto indicamos mediante una función JavaScript que datos son los que deseamos usar.
  • Reduce() Esta función recibe de Map() cada grupo de claves y una matriz con los valores por cada grupo, para poderlos poderlos tratar y devolver un valor único.

Esquema MapReduce

martes, 28 de mayo de 2013

Replicación en MongoDB (1 parte)

A partir de ahora incluiremos una serie de entradas para explicar como MongoDB permite replicar datos entre instancias secundarias.

Estos miembros secundarios pueden cumplir diferentes funciones dentro del ecosistema de replicación (se explicaran mas abajo).

El mecanismo o fichero donde se guardan todos los cambios del servidor primario para ser replicados se llama Oplog  y envía estos datos de forma asincrona.

Su tamaño puede ser cambiado con la opción  oplogSize, pero es recomendable configurarlo antes de levantar la instancia porque por defecto el proceso mongod lo inicializa con los siguientes tamaños según el sistema donde se encuentre instalado:
  • Un tamaño del 5% del total del espacio libre del filesystem en sistemas Linux, Solaris, Freebsd y Windows de 64bits.
  • Para MacOS de 64bits se inicializa con un tamaño de 183Mb.
  • Y en sistemas de 32bits tan solo con 48Mb.

Se recomienda tener un Oplog lo bastante grande para contener datos durante 24 horas.

Imaginate el hipotetico caso de tener replicas paradas por algun problema en la red que impide la conexión entre ellas, si estas replicas logran conectarse de nuevo dentro de esas 24 horas no hay necesidad de recostruirlas, directamente el primario se encargará de enviar los datos guardados en el oplogs  para su  recuperación.

viernes, 24 de mayo de 2013

Administrando MongoDB desde RockMongo

Hoy vamos a explicar como instalar la herramienta de administración Web RockMongo en nuestro servidor. Es una herramienta similar a PHPmyAdmin escrita en PHP5, la cual nos va a permitir administrar nuestro servidor Mongo de forma cómoda.

Requisitos:
  • Tener instalado un servidor web como por ejemplo Apache.
  • Versión de PHP v5.1.6 o superior.
  • Instalación del modulo php_mongo.

No me voy a adetrar en la intalación/configuración de Apache y PHP ya que lo podemos instalar desde nuestro repositorio y es un tema bastante extenso, por lo que únicamente os voy a explicar como instalar el modulo de php_mongo y como acceder a RockMongo.

martes, 21 de mayo de 2013

Manipulando datos con Aggregation framework en MongoDB

Hemos visto anteriormente como manipular datos en MongoDB, insertando o realizando búsquedas sencillas para adentrarnos en el mundo de NoSQL.

Hoy os voy a hablar de Aggregation Framework, un método para manipular datos de forma sencilla que podemos encontrar a partir de la versión 2.2 de MongoDB. Para los que estamos acostumbrados a usar SQL, veremos que este metodo es muy similar en el concepto de realizar simples querys en SQL. Al igual que un shell script en linux, usaremos operadores de pipelines(tuberías), de esta forma conseguimos redirigir la salida de un proceso a otro y así afinar los resultados de nuestra query.

 Lo operadores de pipelines(tuberías) que podemos usar en Aggregation Framework son:

  •  $project -> Usado para añadir, renombrar, eliminar o realizar operaciones sobre campos de un documento.
  •  $match -> Este operador podemos realizar condiciones para afinar nuestra busqueda sobre documentos (En sql seria el equivalente a WHERE).
  •  $limit -> Al igual que en SQL, con limit podemos delimitar el numero de documentos obtenidos.
  •  $skip -> Con skip podremos saltarnos el numero de documentos que indiquemos.
  •  $unwind -> Devuelve los elementos de un array como una secuencia de documentos, es decir, un documento por cada miembro del array.
  •  $group -> Se usa para agrupar documentos con el propósito de calcular valores agregados basados en una colección es el equivalente al Group by en SQL.
  •  $sort -> Con sort podemos ordenador nuestra query por el campo indicado. 

La forma de usar los operadores es la siguiente:

viernes, 17 de mayo de 2013

Resize journal en mongodb

Los archivos de journal en mongodb son binarios y secuenciales, en apariencia tienen la misma funcionalidad que los binlogs y archivelogs de MySQL y Oracle, sirven para salvar las transacciones a disco antes de escribirse a sus respectivos datafiles, consiguiendo que los datos sean consistentes ante un fallo o error inesperado del proceso mongod.

Por defecto, mongodb escribe o valida la información del archivo journal al datafile cada 100milisegundos.
Este valor puede ser cambiado con el parámetro :
--journalCommitInterval <value>
Puedes deshabilitar el uso del journal descomentando el parámetro nojournal en el archivo de configuración.

 
[root@localhost mongo]# cat /etc/mongod.conf | grep jour
# Disables write-ahead journaling
# nojournal = true

Manipulación de datos con MongoDB

Adentrándonos en el mundo de MongoDB y el NoSQL, nos encontramos con el uso de BSON (Binary JSON) que es un formato de intercambio de datos usado principalmente para su almacenamiento y transferencia en la base de datos de MongoDB, diseñado para tener un almacenamiento y velocidad más eficiente que JSON.

En BSON disponemos de los siguientes tipo de datos los cuales podremos almacenar en nuestra Base de datos:

  • Cadena de caracteres (String)
  • Enteros de 32 o 64 bits
  • Tipo de dato real de 64 bits IEEE 754
  • Fecha (número entero de milisegundos en Tiempo Unix)
  • Array de bytes (datos binarios)
  • booleano
  • Nulo (null)
  • Objeto BSON
  • Array BSON
  • Expresiones Regulares
  • Código JavaScript

Vamos a ir viendo una serie de ejemplos de como manipular las colecciones y documentos en MongoDB utilizando la consola.

Para crear una colección de documentos en MongoDB, se puede usar la siguiente instrucción:
db.coleccion.insert( <documento> )
db.coleccion.insert( <documento> )