En la mayoría de las situaciones, un Un clúster fragmentado creará, dividirá y distribuirá rangos automáticamente sin intervención del usuario. Sin embargo, en algunos casos, MongoDB no puede crear suficientes rangos ni distribuir datos con la rapidez suficiente para alcanzar 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 predividir rangos para una colección vacía. Dividir rangos manualmente para una colección completa puede generar rangos y tamaños impredecibles, así como un comportamiento de balanceo ineficiente o ineficaz.
Pasos
El siguiente ejemplo muestra cómo generar y distribuir rangos manualmente. El ejemplo utiliza una colección en el espacio de nombres sample.documents y la fragmenta 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 fragmentar la colección sample.documents, ejecute 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 fragmentos a rangos definidos
Para asignar los fragmentos a los rangos definidos en el paso 1, ejecute 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 los fragmentos del clúster. El clúster ahora está optimizado para inserciones masivas.
Próximos pasos
Para mejorar aún más el rendimiento, cree índices adicionales para admitir las consultas comunes de su 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.
Equilibrador y distribución automática de rangos entre fragmentos, consulte Aspectos internos del equilibrador y migración de rangos.
Migrar rangosmanualmente, consulte Migrar rangos en un clúster fragmentado.