¿Qué es un chunk en MongoDB?

cluster_migrations

Ya sabemos que MongoDB es capaz por sí mismo de mantener nuestro cluster balanceado para una o varias colecciones (Two steps to shard a MongodB collection). Lo hace en base al número de chunks que guarda cada shard y no en base al número de documentos ni al tamaño ocupado por ellos.

¿Qué es un chunk?

Pero, ¿qué es un chunk? Para distribuir los datos de nuestra colección entre los shards necesitamos escoger un campo en base al que dividir esos datos, la shardkey.

Este campo aceptará unos valores, desde un valor mínimo a un valor máximo. Ese rango lo dividiremos de tal forma que un shard guardará los datos asociados a una parte del rango, otro shard guardará otra parte, y así sucesivamente.

El concepto de chunk es abstracto, no son datos en sí mismos, y está referido a cada uno de los rangos en que dividimos los datos.

Esta información (metadata) se guarda en la configdb, que es la base de datos que gestionan los config servers y que guarda, entre otras cosas, la distribución de nuestros datos entre todos los shards. De una manera simplificada la colección chunks tiene la siguiente información para una colección dada:

Chunk _id Minimum value Maximum value Shard
«_id» : «testdb.presplit-x_7000.0» «min» : { «x» : 7000 } «max» : { «x» : 8000 } «shard» : «shard0001»
«_id» : «testdb.presplit-x_8000.0» «min» : { «x» : 8000 } «min» : { «x» : 9000 } «shard» : «shard0001»
«_id» : «testdb.presplit-x_9000.0» «min» : { «x» : 9000 } «min» : { «x» : 10000 } «shard» : «shard0002»
«_id» : «testdb.presplit-x_10000.0» «min» : { «x» : 10000 } «min» : { «x» : 11000 } «shard» : «shard0002»

¿Está balanceado nuestro sistema?

En este cuadro podemos ver cuándo MongoDB considera el sistema balanceado y cuándo no:

Chunks Diff
Fewer than 20 2
20 – 79 4
80 and greater 8

Supongamos que, por ejemplo, tenemos 2 shards y nuestra colección está dividida en 31 chunks. Si el shard0000 tiene 17 chunks y el shard0001 tiene 14 chunks, MongoDB considera el sistema balanceado al ser la diferencia menor a 4 chunks.

Funcionamiento de MongoDB

Cuando creamos una colección por primera vez MongoDB la asigna a uno de nuestros shards y crea un chunk que recoge todo el rango de valores posibles para la shardkey escogida.

En este ejemplo vemos:

  • La shardkey escogida es el campo “x”.
  • Se ha creado un único chunk.
  • Los datos a los que se refiere el chunk residen en el shard0000.
  • El rango que recoge este chunk va desde el valor mínimo posible para la shardkey hasta el valor máximo.

Según vamos insertando datos en la colección nuestro chunk va creciendo en tamaño (su tamaño máximo por defecto es de 64MB) hasta llegar al valor máximo establecido. En ese momento MongoDB realiza el split, es decir lo divide en dos.

Ahora MongoDB comprueba si el sistema está balanceado. Si no lo está lo que hace es mover un chunk del shard que más tenga al que menos (chunk migration).

Os preguntaréis ¿qué chunk escoge MongoDB para la migración? Siempre el que guarde los valores más bajos.

En el siguiente post hablaré sobre los pasos que sigue MongoDB para hacer el split de un chunk.

Dejar un comentario

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

12 + 6 =