Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Criar faixas em um cluster fragmentado

Nesta página

  • Passos
  • Resultados
  • Próximos passos
  • Saiba mais

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

Como alternativa, ao definir as zonas e as faixas de zonas antes 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.

Voltar

Partição de dados