En la mayoría de las circunstancias, deberías dejar que el automático balanceador migrate ranges between shards. Sin embargo, tal vez quieras migrar rangos manualmente en algunos casos:
Cuando predividas una colección vacía, migra los rangos manualmente para distribuirlos uniformemente entre las particiones. Utilizar una pre-división en situaciones limitadas para apoyar la ingesta masiva de datos.
Si el balanceador en un clúster activo no puede distribuir rangos dentro de la ventana de balanceo, entonces tendrás que migrar rangos manualmente.
Para migrar rangos manualmente, utilice el moveChunk o el comando moveRange.
Para obtener más información sobre cómo el equilibrador automático mueve los rangos entre particiones, consulta Internals del equilibrador y Migración de rangos.
Ejemplo
Migrar un solo rango
El siguiente ejemplo asume que el campo username es la clave de fragmento de una colección llamada users en la myapp base de datos y que el valor smith existe dentro del rango que se va a migrar. Migre el rango con el siguiente comando en
mongosh.
db.adminCommand( { moveChunk : "myapp.users", find : {username : "smith"}, to : "mongodb-shard3.example.net" } )
Este comando mueve el rango que incluye el valor de la clave de partición "smith" al shard llamado mongodb-shard3.example.net. El comando se bloqueará hasta que la migración esté completa.
Tip
Para devolver una lista de particiones, utiliza el comando listShards.
Ejemplo
Migrar rangos uniformemente
Para migrar equilibradamente los rangos de la colección myapp.users, coloca cada rango de prefijos en la siguiente partición respecto del otro y ejecuta los siguientes comandos en la mongo shell:
var shServer = [ "sh0.example.net", "sh1.example.net", "sh2.example.net", "sh3.example.net", "sh4.example.net" ]; for ( var x=97; x<97+26; x++ ){ for( var y=97; y<97+26; y+=6 ) { var prefix = String.fromCharCode(x) + String.fromCharCode(y); db.adminCommand({moveChunk : "myapp.users", find : {email : prefix}, to : shServer[(y-97)/6]}) } }
Consulta Crear rangos en un clúster para una introducción a la pre-división.
Utilice el
moveChunkcomando con los campos_secondaryThrottlewriteConcerny para determinar cuándo el balanceador procede con el siguiente documento en el rango de migración.Utilice el
moveRangecomando con los campossecondaryThrottlewriteConcerny para determinar cuándo el balanceador procede con el siguiente documento en el rango de migración.
Consulta moveChunk y moveRange para más detalles.
Change Streams y documentos huérfanos
A partir de MongoDB 5.3, durante la migración de rango, los eventos de flujo de cambios no se generan para las actualizaciones de documentos huérfanos.