sh.reshardCollection()
Definição
sh.reshardCollection(namespace, key, unique, options)
Novidades na versão 5.0.
O método
sh.reshardCollection()
altera a chave de fragmento de uma coleção e altera a distribuição de seus dados.Antes de refragmentar uma coleção, leia os requisitos de refragmentação e as limitações de refragmentação.
Importante
Método mongosh
Esta página documenta um método
mongosh
. Esta não é a documentação para comandos de banco de dados nem drivers específicos de linguagem, como Node.js.Para o comando do banco de dados, consulte o comando
reshardCollection
.Para drivers de API do MongoDB, consulte a documentação do driver do MongoDB específica da linguagem.
sh.reshardCollection()
usa os seguintes campos:CampoTipoDescriçãonamespace
string
O namespace da collection para fragmentar no formato
"<database>.<collection>"
.key
documento
O documento que especifica o novo campo ou campos a serem usados como a chave de shard.
{ <field1>: <1|"hashed">, ... }
Defina os valores do campo como:
"hashed"
para especificar uma chave de fragmento com hash.
Consulte também Índices de chaves de shard
unique
booleano
Opcional. Especifique se há uma restrição de exclusividade na chave de shard. Somente
false
é suportado. O padrão éfalse
.options
documento
Opcional. Um documento contendo campos opcionais, incluindo
numInitialChunks
,collation
,zones
eforceRedistribution
.O campo
options
suporta os seguintes campos:CampoTipoDescriçãonumInitialChunks
inteiro
Opcional. Especifica o número inicial de chunks para criar em todos os shards no cluster ao refragmentar uma collection. O valor padrão é
90
. Em seguida, o MongoDB cria e equilibra os chunks no cluster.numInitialChunks
deve resultar em menos de8192
por shard.Se você ver o erro "A chave de shard fornecida não tem cardinalidade suficiente para criar o número necessário de blocos", refaça a coleta com um valor
numInitialChunks
menor.collation
documento
Opcional. Se a coleção especificada para
reshardCollection
tiver um agrupamento padrão, você precisa incluir um documento de agrupamento com{ locale : "simple" }
, senão o comandoreshardCollection
falha.zones
array
Opcional. Especifica as zonas da collection.
Para manter ou adicionar zonas, especifique as zonas da sua collection em uma array:
[ { min: <document with same shape as shardkey>, max: <document with same shape as shardkey>, zone: <string> | null }, ... ] forceRedistribution
booleano
Opcional. Se definida como
true
, a operação será executada mesmo que a nova chave de shard seja igual à chave de shard antiga. Use com a opçãozones
para mover dados para zonas específicas.Novidades na versão 8.0.
Compatibilidade
Esse método está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Importante
Esse comando não é suportado em clusters M0, M2, M5 e Flex. Para obter mais informações, 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
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 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 de clone
Durante a fase de clonagem:
Cada shard destinatário cria uma coleção fragmentada temporária e vazia com as mesmas opções de coleção que a coleção fragmentada do doador. Essa nova coleção é o destino para onde os shards do destinatário gravam os novos dados. Os fragmentos do destinatário não criam nenhum índice, exceto o índice
_id
até a fase de índice.Cada shard do destinatário clona os dados de coleta do shard do doador, incluindo todos os documentos que o shard do destinatário possui sob a nova chave de shard.
Fase do índice
Durante a fase de índice, cada shard destinatário 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 aplicação e recuperação
Durante a fase de aplicação e recuperação:
Cada shard de destinatário começa a aplicar entradas de oplog que foram gravadas no shard de doador correspondente depois que o destinatário clonou os dados.
Quando a estimativa do tempo restante para concluir a operação de refragmentação for inferior a dois segundos, o shard do doador bloqueia as gravações na collection de origem.
Observação
Se necessário, você pode forçar manualmente a conclusão da operação de refragmentação emitindo o método sh.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 método sh.commitReshardCollection()
bloqueia as gravações antecipadamente e força a conclusão da operação de refragmentação. Durante o período em que as gravações são bloqueadas, seu aplicativo experimenta um aumento na latência.
Fase de confirmação
Durante a fase de confirmação:
O coordenador de refragmentação espera que todos os shards atinjam consistência estrita e, em seguida, confirma a operação de refragmentação.
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.
Observação
Depois que o processo de refragmentação atingir a fase de confirmação, o processo não poderá ser encerrado sh.abortReshardCollection()
com.
Exemplos
Refragmentar uma collection
O exemplo a seguir refragmenta a coleta sales.orders
com a nova chave de fragmento { order_id: 1 }
:
sh.reshardCollection( "sales.orders", { order_id: 1 } )
Saída de exemplo:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp(1, 1624887954), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: 0 } }, operationTime: Timestamp(1, 1624887947) }
Refragmentar uma collection para a mesma chave de shard
Para refragmentar na mesma chave de shard, configure forceRedistribution para true
. O exemplo a seguir refragmenta a collection sales.orders
para a mesma chave de shard { order_id: 1 }
e redistribui dados.
sh.reshardCollection( "sales.orders", { order_id: 1 }, { forceRedistribution: true } )
Saída de exemplo:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1733502241, i: 20 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1733502241, i: 20 }) }
Refragmentar uma collection com zonas
Refragmente uma collection com zonas quando precisar ajustar a distribuição de dados entre os shards em seu cluster para atender aos requisitos de alteração ou para melhorar o desempenho.
No exemplo a seguir , a coleção test.scores
reside em shard0
e shard1
. A chave de fragmento atual é { _id: 1}
.
Execute o sh.reshardCollection
com as novas informações da zona
sh.reshardCollection( "test.scores", { "studentId": 1, "testId": 1}, { zones: [ { min: { "studentId": MinKey(), "testId": MinKey() }, max: { "studentId": MaxKey(), "testId": MaxKey() }, zone: "NewZone" } ] } )
A operação de refragmentação adiciona os shards na zona NewZone
como destinatários. O fragmento primário do banco de dados de dados é adicionado como um destinatário como um backstop para quaisquer intervalos ausentes na definição da zona . Se não houver intervalos ausentes, a coleção será clonada em fragmentos no "NewZone", como shard2
e shard3
neste exemplo. sh.reshardCollection
retorna o seguinte:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp( { t: 1699484530, i: 54 } ), signature: { hash: Binary.createFromBase64( "90ApBDrSSi4XnCpV3OWIH4OGO0Y=", 0 ), keyId: Long( "7296989036055363606" ) } }, operationTime: Timestamp( { t: 1699484530, i: 54 } ) }