Criar faixas em um cluster fragmentado
Nesta página
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, utilize para distribuir os intervalos vazios através dos 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 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.
Passos
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
.
Definir intervalos de chaves de shard
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; }
Fragmentar a coleção
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.
Alocar shards para intervalos definidos
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 }); }
Resultados
O comando moveRange
distribui os intervalos vazios entre os fragmentos no cluster. O cluster agora está otimizado para inserções em massa.
Próximos passos
Para melhorar ainda mais o desempenho, crie índices adicionais para dar suporte às queries comuns do seu aplicativo.
Saiba mais
Estratégias para inserção em massa em uma coleção compartilhada
Para as faixas iniciais criadas e distribuídas pelo comando de fragmentação, consulte Coleção vazia.
Balancer e distribuição automática de faixas entre fragmentos, consulte Componentes internos do balancer e Migração de faixa.
Para migrar intervalos manualmente, consulte Migrar faixas em um cluster fragmentado.