ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Menu Docs

Criar faixas em um cluster fragmentado

Na maioria das situações, um cluster fragmentado criará, divisão e distribuirá intervalos automaticamente sem intervenção do usuário. No entanto, em alguns casos, o MongoDB não pode criar intervalos suficientes ou distribuir dados com rapidez suficiente para suportar a taxa de transferência necessária.

Por exemplo, se você quiser consumir um grande volume de dados em um cluster em que tenha inserções distribuídas entre fragmentos, a pré-divisão dos intervalos de uma coleção fragmentada vazia pode melhorar a taxa de transferência.

Observação

A partir do MongoDB 6.0, o balanceador não distribui faixas vazias. Para pré-dividir a coleção, use para distribuir os intervalos vazios entre os fragmentos no moveRange cluster. moveRange divide automaticamente a faixa a ser movida, o que significa que moveRange executa tanto a divisão quanto a movimentação. Você não precisa divisão manualmente o intervalo com split.

Como alternativa, ao definir as zonas e as faixas de zonasantes de fragmentar uma coleção vazia ou inexistente, a operação de coleção de fragmentos cria faixas para as faixas de zonas definidas, bem como quaisquer faixas adicionais para cobrir toda a faixa dos valores da chave de fragmento e executa uma distribuição da faixa inicial com base nas faixas da zona. Para obter mais informações, consulte Coleção vazia.

Aviso

Somente intervalos pré-divididos para uma coleção vazia. A divisão manual de intervalos para uma coleção preenchida pode levar a intervalos e tamanhos imprevisíveis, bem como a um comportamento de balanceamento ineficiente ou ineficaz.

O exemplo a seguir mostra como gerar e distribuir intervalos manualmente. O exemplo utiliza uma coleção no namespace sample.documents e fragmenta esta coleção no campo email.

1

Crie uma função para definir os intervalos de chaves de fragmento. Este exemplo cria intervalos com base em possíveis endereços de e-mail, pois o email será utilizado como a chave de shard.

// 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 a collection sample.documents, execute este comando:

db.adminCommand( {
shardCollection: 'sample.documents',
key: {
email: 1
}
} );

Observação

Como a collection está vazia, o comando shardCollection cria automaticamente um índice no campo email para suportar a chave de shard.

3

Para alocar os shards para os intervalos definidos na etapa 1, execute o seguinte 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
});
}

O comando moveRange distribui os intervalos vazios entre os fragmentos no cluster. O cluster agora está otimizado para inserções em massa.

Para melhorar ainda mais o desempenho, crie índices adicionais para dar suporte às queries comuns do seu aplicativo.