reshardCollection
Nesta página
Definição
reshardCollection
Novidades na versão 5.0.
O comando
reshardCollection
altera a chave de fragmento de uma coleção e altera a distribuição dos seus dados.Dica
Em
mongosh
, esse comando também pode ser executado por meio do método assistentesh.reshardCollection()
.Os métodos auxiliares são práticos para os usuários
mongosh
, mas podem não retornar o mesmo nível de informações que os comandos do banco de dados. Nos casos em que a praticidade não for necessária ou os campos de retorno adicionais forem necessários, use o comando de banco de dados.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Observação
Este comando é aceito em todos os clusters do MongoDB Atlas. Para obter informações sobre o suporte do Atlas a todos os comandos, consulte Comandos não suportados.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
O comando tem a seguinte sintaxe:
db.adminCommand( { reshardCollection: "<database>.<collection>", key: <shardkey>, unique: <boolean>, numInitialChunks: <integer>, collation: { locale: "simple" }, zones: [ { min: <document with same shape as shardkey>, max: <document with same shape as shardkey>, zone: <string> | null }, ... ], forceRedistribution: <bool> } )
Campos de comando
O comando utiliza os seguintes campos:
Campo | Tipo | Descrição |
---|---|---|
reshardCollection | string | O namespace da collection a ser refragmentada. Assume o formato <database>.<collection> . |
key | documento | O documento que especifica o novo campo ou campos a serem usados como a chave de shard.
Defina os valores do campo como:
|
unique | booleano | Opcional. Especifique se há uma restrição de exclusividade na chave de shard. Somente false é suportado. O padrão é false . |
numInitialChunks | inteiro | Opcional. Especifica o número inicial de chunks para criar em todos os shards no cluster ao refragmentar uma collection. O padrão é o número de blocos que existem para a coleção sob o padrão de chave de shard atual. Em seguida, o MongoDB cria e equilibra os chunks no cluster. numInitialChunks deve resultar em menos de 8192 por shard. |
collation | documento | Opcional. Se a coleção especificada em reshardCollection tiver um agrupamento padrão, você deverá incluir um documento de agrupamento com { locale : "simple" } , ou o comando reshardCollection falhará. |
zones | array | Opcional. Para manter ou adicionar zonas, especifique as zonas da sua collection em uma array. |
forceRedistribution | booleano | Opcional. Se definida como Novidade na versão 7.2. |
Considerações
As compilações de índice que ocorrem durante a refragmentação podem falhar silenciosamente.
Não crie índices durante o processo de refragmentação.
Não inicie o processo de refragmentação se houver construções de índice em andamento.
Processo de refragmentação
Em uma operação de refragmentação de collection, um fragmento (shard) pode ser um:
doador, que atualmente armazena chunks para a coleção fragmentada.
receptor, que armazena novos chunks para a coleção fragmentada com base nas chaves de fragmento e nas zonas.
Um shard pode ser doador e um receptor ao mesmo tempo. O conjunto de shards do doador é idêntico aos shards do receptor, a menos que você use zonas.
O servidor de configuração primário é sempre o gerenciador de refragmentação e inicia cada fase da operação de refragmentação.
Fase de inicialização
Durante a fase de inicialização, o coordenador de refragmentação determina a nova distribuição de dados para a collection fragmentada.
Fase do índice
Durante a fase de índice:
Cada destinatário de fragmento cria uma nova coleção fragmentada vazia com as mesmas opções de coleção que a coleção fragmentada existente. Essa nova coleção fragmentada é o destino de onde os fragmentos do destinatário gravam os novos dados.
Cada destinatário de fragmento cria os novos índices necessários. Isso inclui todos os índices existentes na collection fragmentada e um índice compatível com o novo padrão de chave de shard, se esse índice ainda não existir na collection fragmentada.
Fase de clonagem, aplicação e recuperação
Durante a fase de clonagem, aplicação e recuperação:
Cada destinatário de shard clona uma cópia inicial dos documentos que possuiria sob a nova chave de shard.
Cada destinatário de shard começa a aplicar entradas de oplog de operações que aconteceram depois que o destinatário clonou os dados.
Quando a estimativa do tempo restante para concluir a operação de refragmentação é inferior a dois segundos, o coordenador de refragmentação bloqueia as gravações para a coleção.
Observação
Se desejar, você pode forçar manualmente a conclusão da operação de refragmentação emitindo o comando
commitReshardCollection
. Isso é útil se a estimativa de tempo atual para concluir a operação de refragmentação for uma duração aceitável para que sua collection bloqueie gravações. O comandocommitReshardCollection
bloqueia as gravações antecipadamente e força a conclusão da operação de refragmentação. Durante o período de bloqueio das gravações, seu aplicativo experimenta um aumento na latência.
Fase de confirmação
Depois que o processo de refragmentação atingir a fase de confirmação, ele não poderá mais ser abortado com
abortReshardCollection
.Quando todos os shards tiverem atingido a consistência estrita, o coordenador de refragmentação confirma a operação de refragmentação e instala a nova tabela de roteamento.
O coordenador de refragmentação instrui cada primary shard doador e destinatário, de forma independente, a renomear a collection fragmentada temporária. A collection temporária torna-se a nova collection refragmentada.
Cada shard doador descarta a antiga coleção fragmentada.
Exemplos
Refragmentar uma collection
O exemplo a seguir refragmenta a coleta sales.orders
com a nova chave de fragmento { order_id: 1 }
:
db.adminCommand({ reshardCollection: "sales.orders", key: { order_id: 1 } })
Saída:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp(1, 1624887954), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: 0 } }, operationTime: Timestamp(1, 1624887947) }
Redistribuir dados para novos shards
A partir do MongoDB 7.2, você pode refragmentar uma collection na mesma chave, que pode ser usada para redistribuir dados em novos shards.
Após adicionar um shard ao cluster, você utiliza o comando reshardCollection
com a opção forceRedistribution
para redistribuir dados pelo cluster:
db.adminCommand({ reshardCollection: "accounts.invoices", key: { store_id: "hashed" }, forceRedistribution: true })
Redistribuir dados para diferentes zonas
A partir do MongoDB 7.2, você pode utilizar o comando reshardCollection
para mover dados para novas zonas sem alterar a chave de shard.
O comando a seguir redistribui os dados da coleção accounts.sales
usando a mesma chave de fragmento, movendo os dados das zonas zone01
e zone02
para zone03
e zone04
:
db.adminCommand({ reshardCollection: "accounts.sales", key: { region_id: "hashed" }, forceRedistribution: true, zones: [ { zone: "zone04", min: { region_id: MinKey() }, max: { region_id: 10 } }, { zone: "zone05", min: { region_id: 10 }, max: { region_id: MaxKey() } } ] })