sh.reshardCollection()
Nesta página
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
stringO namespace da collection para fragmentar no formato"<database>.<collection>"
.key
documentoO 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
booleanoOpcional. Especifique se há uma restrição de exclusividade na chave de shard. Somentefalse
é suportado. O padrão éfalse
.options
documentoOpcional. Um documento contendo campos opcionais, incluindonumInitialChunks
,collation
ezones
.
O campo options
suporta os seguintes campos:
Campo | Tipo | Descrição | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
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 para reshardCollection tiver um agrupamento padrão, você precisa incluir um documento de agrupamento com { locale : "simple" } , senão o comando reshardCollection falha. | ||||||||
zones | array | Opcional. Para manter ou adicionar zona, especifique a zona da sua collection em uma array:
|
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 } ) }