¿Qué son los chunks de MongoDB?

Categoría
Descripción

Un chunk es una agrupación lógica de documentos que MongoDB usa para dividir la información entre los distintos shards de un sharded cluster.

El servidor de configuración del sharded cluster almacena los metadatos necesarios para saber en qué shard está cada chunk. Cada chunk almacena los documentos cuya shard key está entre unos valores mínimo y máximo. A este rango posible de valores se le llama espacio de claves (key space)Cuando se crea la sharded collection, se crea un chunk inicial que contendrá todos los valores entre la mínima clave y la máxima clave posibles. A medida que se van añadiendo documentos, el valor mínimo y máximo de cada chunk se va redefiniendo para así permitir una distribución igualitaria de los documentos entre todos los chunks. Todos los documentos de un mismo chunk residen en un mismo shard.

El número de chunks generados variará en función de 2 factores:

  • ChunkSize: por defecto, MongoDB toma un tamaño de 64Mb por chunk. Esto quiere decir que, una vez que el chunk llegue a esa capacidad, se dividirá. Se puede establecer un valor en Mb en el rango [1..1024]: Este tamaño se puede establecer en tiempo de ejecución. Se puede cambiar su tamaño mediante el comando db.settings.save({_id: "chunksize", value: <valor>}), donde <valor> es el nuevo valor de tamaño del chunk en Megabytes. Una vez que se produzcan tareas que impliquen a los datos, mongos reubicará los documentos en los chunks adecuados.
  • Frecuencia de los valores de la shard key: en caso de que la cardinalidad sea correcta, pero la frecuencia no lo sea, se puede generar una situación anormal en la que el tamaño del chunk va más allá del tamaño establecido en la configuración. Se generan los llamados jumbo chunks. Estos chunks:
    • Son más grandes del tamaño especificado en la configuración
    • No se pueden mover: una vez que un chunk se marca como jumbo, el balanceador se los salta y evita moverlos
    • En muchos casos no se podrán dividir

El comando sh.status() nos puede arrojar información sobre el estado de los chunks. Imaginemos que tenemos una base de datos tienda con una colección llamada productos.

 databases:
        {  "_id" : "tienda",  "primary" : "tienda-repl-1",  "partitioned" : true }
               tienda.productos
                        shard key: { "ref" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                tienda-repl-1       1
                                tienda-repl-2       2
                        { "ref" : { "$minKey" : 1 } } -->> { "ref" : 23153496 } on : tienda-repl-1 Timestamp(2, 0)
                        { "ref" : 23153496 } -->> { "ref" : 28928914 } on : tienda-repl-2 Timestamp(2, 1)
                        { "ref" : 28928914 } -->> { "ref" : { "$maxKey" : 1 } } on : tienda-repl-2 Timestamp(1, 2)

En este ejemplo vemos que la colección tienda.productos tiene una shard key que contiene la referencia de los productos, y que tiene 3 chunks: 1 en tienda-repl-1 y 2 en tienda-repl-2. El chunk 1, que está en tienda-repl-1, va desde minKey hasta 23153496. El chunk 2, que está en tienda-repl-2, va desde 23153496 hasta 28928914. Y el chunk 3, que está en tienda-repl-2, va desde 28928914 hasta maxKey.