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 collection, leia os requisitos de refragmentação e 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 shard 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
ezones
.
O campo options
suporta os seguintes campos:
Campo | Tipo | Descrição | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
| 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. | ||||||||
| documento | Opcional. Se a coleção especificada para | ||||||||
| array | Opcional. Para manter ou adicionar zona, especifique a zona da sua collection em uma array:
|
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
Este comando não é suportado em clusters M0, M2 e M5 . 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
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 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étodosh.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
Após o processo de refragmentação atingir a fase de confirmação, o processo não pode ser encerrado com
sh.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.
Exemplo
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 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 sh.reshardCollection
o 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 } ) }