Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

reshardCollection

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Campos de comando
  • Processo de refragmentação
  • Exemplos
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 assistente sh.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.

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 é suportado em todos os clusters do MongoDB Atlas. Para obter informações sobre todos os comandos, consulte Comandos sem suporte.

  • 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

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>
}
)

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.

{ <field1>: <1|"hashed">, ... }

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 true, a operação será executada mesmo que a nova chave de shard seja igual à chave de shard antiga. Use com a opção zones para mover dados para zonas específicas.

Novidade na versão 7.2.

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.

Durante a fase de inicialização, o coordenador de refragmentação determina a nova distribuição de dados para a collection fragmentada.

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.

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 comando commitReshardCollection 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.

  • 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.

    Dica

    Veja também:

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)
}

Dica

Veja também:

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
})

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() }
}
]
})

Voltar

removeShardFromZone