Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Particionamiento de datos

Crear rangos en un clúster fragmentado

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

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.

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.

1

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;
}
2

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.

3

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
});
}

El comando moveRange distribuye los rangos vacíos entre las particiones del clúster. El clúster ahora está optimizado para inserciones masivas.

Para mejorar aún más el rendimiento, crea índices adicionales para respaldar las consultas comunes de tu aplicación.

Volver

Particionamiento de datos

En esta página