En la mayoría de las circunstancias, deberías dejar que el automático balanceador migrate chunks between shards. Sin embargo, es posible que desee migrar fragmentos manualmente en algunos casos:
Al pre-división una colección vacía, migra los fragmentos manualmente para distribuirlos equitativamente entre las particiones. Use pre-división in limited situations to support bulk data ingestion.
Si el balanceador en un clúster activo no puede distribuir fragmentos dentro de la ventana de balanceo, entonces tendrás que migrar fragmentos manualmente.
Para migrar rangos manualmente, usar la moveChunk .
Para obtener más información sobre cómo el balanceador automático mueve los rangos entre particiones, consulte Balanceador de clúster.
Ejemplo
Migrar un solo fragmento
El siguiente ejemplo asume que el campo username es la clave de partición para una colección llamada users en la base de datos myapp, y que el valor smith existe dentro del fragmento a migrar. Migra el fragmento usando el siguiente comando en mongosh.
db.adminCommand( { moveChunk : "myapp.users", find : {username : "smith"}, to : "mongodb-shard3.example.net" } )
Este comando mueve el fragmento que incluye el valor de la clave de partición "smith" a la partición 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 uniformemente los fragmentos
Para migrar uniformemente fragmentos para la colección myapp.users, coloca cada fragmento de prefijo en la siguiente partición respecto al 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]}) } }
Consulte Crear fragmentos en un clúster compartido para una introducción a la predivisión.
El comando moveChunk tiene el parámetro: _secondaryThrottle y el parámetro writeConcern que determina cuándo el balanceador procede con el siguiente documento en el fragmento de migración. Consulta el comando moveChunk para más detalles.
Advertencia
El comando moveChunk puede arrojar el siguiente mensaje de error:
The collection's metadata lock is already taken.
Esto ocurre cuando los clientes tienen demasiados cursores abiertos que acceden al fragmento en proceso de migración. Puedes esperar hasta que los cursores completen sus operaciones o cerrar los cursores manualmente.