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

Mover uma coleção

Nesta página

  • Sobre esta tarefa
  • Controle de acesso
  • Antes de começar
  • Passos
  • Saiba mais

A partir do MongoDB 8.0, você pode mover uma coleção não fragmentada para um fragmento diferente usando o comando moveCollection .

Se seu sistema tiver o controle de acesso ativado, a função enableSharding concederá a você acesso para executar o comando moveCollection .

Antes de mover sua collection, certifique-se de atender aos seguintes requisitos:

  • Seu aplicação pode tolerar um período de dois segundos em que a collection afetada bloqueia as gravações. Durante o período em que as gravações são bloqueadas, seu aplicação experimenta um aumento na latência.

  • Seu banco de dados atende aos seguintes requisitos de recursos:

    • Verifique se o fragmento para o qual você está movendo a collection tem espaço de armazenamento suficiente para a collection e seus índices. O fragmento de destino exige pelo menos ( Collection storage size + Index Size ) * 2 bytes disponíveis.

    • Certifique-se de que sua capacidade de E/S esteja abaixo de 50%.

    • Certifique-se de que a carga da CPU esteja abaixo de 80%.

Importante

Esses requisitos não são exigidos pelo banco de dados. Uma falha na alocação de recursos suficientes pode resultar em:

  • o banco de dados ficar sem espaço e desligando

  • redução do desempenho

  • a operação demora mais que o esperado

Se o seu aplicação tiver períodos com menos tráfego, execute esta operação na coleção durante esse período, se possível.

1

Para mover uma coleção não fragmentada denominada inventory no banco de banco de dados do app para o fragmento do shard02 , execute moveCollection:

db.adminCommand(
{
moveCollection: "app.inventory",
toShard: "shard02"
}
)

Para obter uma lista dos IDs de shard disponíveis, execute sh.status(). Para obter detalhes, consulte sh.status() Saída.

2
  1. Monitore o tempo restante.

    Para monitorar o tempo restante para a operação moveCollection , use o estágio de pipeline $currentOp .

    Este exemplo mostra como verificar o progresso de moveCollection na collection app.inventory :

    db.getSiblingDB("admin").aggregate( [
    { $currentOp: { allUsers: true, localOps: false } },
    {
    $match: {
    type: "op",
    "originatingCommand.reshardCollection": "app.inventory"
    }
    }
    ] )

    Observação

    Para ver os valores atualizados, você precisa executar continuamente o pipeline anterior.

    As saídas do pipeline $currentOp:

    • totalOperationTimeElapsedSecs: tempo de operação decorrido em segundos

    • remainingOperationTimeEstimatedSecs: tempo restante estimado para a operação moveCollection atual. É retornado como -1 quando uma nova operação moveCollection é iniciada.

    Observação

    remainingOperationTimeEstimatedSecs está definido para uma estimativa de tempo pessimista:

    • A estimativa de tempo da fase de recuperação é definida como o tempo da fase de clonagem, que
      é um tempo relativamente longo.
    • Na prática, se houver apenas algumas operações de escrita pendentes, o
      o tempo real da fase de recuperação é relativamente curto.

    Esse estágio do pipeline tem uma saída semelhante a esta:

    [
    {
    shard: '<shard>',
    type: 'op',
    desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>',
    op: 'command',
    ns: '<database>.<collection>',
    originatingCommand: {
    reshardCollection: '<database>.<collection>',
    key: <shardkey>,
    unique: <boolean>,
    collation: { locale: 'simple' }
    },
    totalOperationTimeElapsedSecs: <number>,
    remainingOperationTimeEstimatedSecs: <number>,
    ...
    },
    ...
    ]
  2. Monitore o número de bytes transferidos.

    Para monitorar o número de bytes transferidos, use shardingStatistics.resharding.active.bytesCopied e compare com o número de bytes na collection.

3

Para confirmar se a coleção foi movida para o fragmento esperado, use o estágio de pipeline $collStats .

Este exemplo mostra como confirmar que a coleção app.inventory existe no fragmento esperado:

db.inventory.aggregate( [
{ $collStats: {} },
{ $project: { "shard": 1 } }
] )

Esse estágio do pipeline tem uma saída semelhante a esta:

[ { shard: 'shard02' } ]

Voltar

Coleções móveis