Docs Menu
Docs Home
/ /

Crear rangos en un clúster fragmentado

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

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.

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.

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 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.

3

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

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

Para mejorar aún más el rendimiento, cree índices adicionales para admitir las consultas comunes de su aplicación.

Volver

Particionamiento de datos

En esta página