¿Cómo MongoDB balancea tus datos?

migration_steps3Hemos visto ya el concepto de chunk ¿Qué es un chunk en MongoDB? y también cómo MongoDB lo divide cuando crece más allá del tamaño máximo establecido Cuatro pasos para dividir un chunk en MongoDB. En este artículo veremos los pasos que sigue MongoDB para mantener nuestro cluster balanceado.

Lo primero que tenemos que saber es que somos nosotros los que escogemos los datos que queremos balancear entre nuestros shards. Es decir, nosotros decidimos cuáles van a ser las colecciones que nos interesa particionar. Podéis leer en el artículo Dos pasos para particionar una colección en MongoDB cómo se particiona una colección.

El balancing no interfiere el funcionamiento normal del cluster, es un proceso que se ejecuta en background. Para no aumentar en exceso la carga de trabajo sólo hay una migración activa al mismo tiempo, por cluster. Por lo tanto, sólo va a haber dos shards involucrados (sólo sus nodos primarios). Si no modificamos el valor por defecto del tamaño del chunk, que son 64MD, esa es la cantidad de información máxima que el sistema va a estar transfiriendo en un determinado momento. Es un tamaño lo suficientemente grande como para que no haya demasiadas migraciones y, a la vez, pequeño para no aumentar la carga de trabajo de nuestra base de datos.

Ronda de balanceado

Cualquiera de nuestros mongos puede activar lo que se llama una ronda de balanceado (round balancing). Para ello, regularmente, el mongos decide comenzar una ronda, pero como no puede haber mas que un mongos balanceando a la vez lo primero que comprueba es que no haya ninguna ronda activa. Esto lo hace a través de la colección locks de la base de datos de los config servers.

Sólo en caso de que este valor sea 0 el mongos puede comenzar la ronda de balanceado.

¿Está el cluster balanceado?

El mongos consulta la relación de los chunks que hay en cada shard y determina si la colección/colecciones está balanceada o no. En este post ¿Qué es un chunk en MongoDB? explico el criterio que sigue para tomar esta decisión. En caso de no estar balanceada será el balanceador el que se encargue de mover los chunks necesarios para conseguirlo. Una vez se haya terminado la migración de chunks el mongos actualizará la tabla locks para que se pueda comenzar con una nueva ronda de balanceado.

¿Necesita el chunk ser dividido?

El mongos decide balancear la colección. Lo que hace ahora es escoger un chunk para moverlo a otro shard. Cómo escoge ese chunk lo explico en este artículo ¿Qué es un chunk en MongoDB?.

Antes de mover el chunk el mongos pregunta al shard propietario (shard FROM) si ese chunk es demasiado grande y tiene que ser dividido.

Comienza el balanceado

El mongos da orden al shard FROM de que comience la transferencia. Antes de comenzar, este shard se asegura de que no queda en marcha ningún borrado de datos pertenecientes a chunks migrados anteriormente.

Por favor, lee este chunk

El shard FROM le pide al shard TO (shard destino del chunk) que lea el chunk escogido para llevárselo.

Comienza la transferencia

Hasta  que la transferencia no haya terminado el chunk pertenece al shard FROM. Hasta entonces pueden darse operaciones de escritura sobre el chunk, operaciones que también tienen que ser transferidas al shard TO.

Finaliza la transferencia

El shard FROM actualiza los cambios en los config servers para reflejar que el chunk ha sido movido.

Se borran los datos transferidos

El shard FROM TO (Alex, gracias por tu puntualización) comienza a borrar los datos movidos.

Se refresca la caché

El mongos refresca su cache. El resto de mongos buscarán la información en el shard FROM y obtendrán un error (STALE CONFIG EXCEPTION), en ese momento leerán el metadata de los config servers y refrescarán su caché con los datos actualizados. Este proceso es transparente para los clientes.

Creo que con este post quedará mucho más claro cómo escoge MongoDB los datos a mover entre shards y los pasos que sigue para que nuestro cluster esté balanceado. Por favor, si detectáis cualquier error u omisión no dudéis en comentarlo pues entre todos aprenderemos mucho más.

Dejar un comentario

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

once − 6 =

3 ideas sobre “¿Cómo MongoDB balancea tus datos?”