En la mayoría de las situaciones, un el clúster con fragmentos creará, dividirá y distribuirá los rangos automáticamente sin intervención del usuario. Sin embargo, en algunos casos, MongoDB no puede crear suficientes rangos o distribuir datos lo suficientemente rápido para soportar el rendimiento requerido.
Por ejemplo, si desea ingerir un gran volumen de datos en un clúster donde tiene inserciones distribuidas en fragmentos, dividir previamente los rangos de una colección fragmentada vacía puede mejorar el rendimiento.
Nota
A partir de MongoDB 6.0, el balanceador no distribuye rangos vacíos. Para predividir la colección, utilice moveRangepara distribuir los rangos vacíos entre los fragmentos del clúster. moveRange divide automáticamente el rango que se va a mover, lo que significa moveRange que realiza tanto la división como el movimiento. No es necesario dividir manualmente el rango split con.
Alternativamente, al definir las zonas y rangos de zonas antes de particionar una colección vacía o inexistente, la operación de particionado de la colección crea rangos para los rangos definidos de la zona, así como cualquier rango adicional para cubrir todo el rango de valores de la clave de partición y realiza una distribución inicial de rangos basada en los rangos de la zona. Para obtener más información, consulte Colección vacía.
Advertencia
Solo rangos previos divididos para una colección vacía. Dividir manualmente los rangos de una colección poblada puede llevar a rangos y tamaños impredecibles, así como a un comportamiento de balanceo ineficiente o ineficaz.
Pasos
El siguiente ejemplo muestra cómo generar y distribuir manualmente los rangos. El ejemplo utiliza una colección dentro del namespace sample.documents y fragmenta esa colección en el campo email.
Definir rangos de clave de partición
Cree una función para definir los rangos de claves de partición. Este ejemplo crea rangos basados en posibles direcciones de correo electrónico porque email se usará como clave de partición.
// Generate two character prefix email ranges. function getRanges(shards) { let ranges = []; // The total number of prefix possibilities is 26 * 26 (aa to zz). // We calculate the number of combinations to add in a range. const totalCombinationsPerShard = 26 * 26 / shards.length; let minKey = { email: MinKey }; let maxKey = { email: MinKey }; for(let i = 1; i <= shards.length; ++i) { // 97 is lower case 'a' in ASCII. let prefix = 97 + ((totalCombinationsPerShard*i)/26); let suffix = 97 + ((totalCombinationsPerShard*i)%26); let initialChars = String.fromCharCode(prefix) + String.fromCharCode(suffix); minKey = maxKey; maxKey = { email: i !== shards.length ? initialChars : MaxKey }; ranges.push({ min: minKey, max: maxKey }); } return ranges; }
Fragmentar la colección
Para shard la sample.documents colección, ejecuta este comando:
db.adminCommand( { shardCollection: 'sample.documents', key: { email: 1 } } );
Nota
Debido a que la colección está vacía, el comando shardCollection crea automáticamente un índice en el campo email para soportar la clave de partición.
Asignar particiones a rangos definidos
Para asignar las particiones a los rangos definidos en el paso 1, ejecuta el siguiente comando:
const shards = db.adminCommand({ listShards: 1 }).shards; let ranges = getRanges(shards); for (let i = 0; i < ranges.length; ++i) { db.adminCommand({ moveRange: 'sample.documents', min: ranges[i].min, max: ranges[i].max, toShard: shards[i]._id }); }
Resultados
El comando moveRange distribuye los rangos vacíos entre las particiones del clúster. El clúster ahora está optimizado para inserciones masivas.
Próximos pasos
Para mejorar aún más el rendimiento, crea índices adicionales para respaldar las consultas comunes de tu aplicación.
Obtén más información
Estrategias para inserciones masivas en una colección fragmentada
Rangos iniciales creados y distribuidos por el comando de fragmentación, consulte Colección vacía.
Balanceador y distribución automática de rangos entre particiones, consulte Detalles internos del balanceador y Migración de rangos.
Migra manualmente los rangos, consulta Migrar rangos en un clúster con particiones en MongoDB.