Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Remover fragmentos de un clúster con particiones

Para eliminar un Partición debe asegurarse de que los datos de la partición se migren a las particiones restantes en el clúster. Este procedimiento describe cómo migrar datos de forma segura y remover una partición.

  1. Este procedimiento utiliza el método sh.moveCollection() para mover colecciones fuera de la partición eliminada. Antes de comenzar este procedimiento, revise las moveCollection consideraciones y los requisitos para comprender el comportamiento del comando.

  2. Para remover una partición, primero conéctese a una de las instancias mongos del clúster usando mongosh.

Nota

Al remover múltiples particiones, remuévelos simultáneamente en lugar de uno a la vez. Eliminar una partición a la vez provoca que el balanceador drene los datos a otras particiones restantes. Una partición solo puede participar en una migración de fragmentos a la vez, por lo que remover una partición limita el rendimiento de la migración de datos.

1

Para migrar datos desde un fragmento, el proceso de balanceo debe estar habilitado. Para comprobar el estado del balanceo, utilice el sh.getBalancerState() método:

sh.getBalancerState()

Si la operación devuelve true, el balanceador está habilitado.

Si la operación false devuelve, consulte Habilitar el balanceador.

2

Para encontrar el nombre de la partición, ejecuta el comando listShards:

db.adminCommand( { listShards: 1 } )

El campo shards._id contiene el nombre de la partición.

3

Ejecuta el comando removeShard para la partición que deseas remover:

db.adminCommand( { removeShard: "<shardName>" } )

La operación removeShard devuelve:

{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "<shardName>",
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"db1",
"db2"
],
"ok" : 1,
"operationTime" : Timestamp(1575398919, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575398919, 2),
"signature" : {
"hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="),
"keyId" : Long("6766255701040824328")
}
}
}

La partición entra en el estado draining y el balanceador comienza a migrar fragmentos de la partición eliminada a otras particiones del clúster. Estas migraciones ocurren lentamente para evitar un impacto severo en el clúster general. Dependiendo de la capacidad de la red y de la cantidad de datos, esta operación puede tardar desde unos minutos hasta varios días en completarse.

Tip

Mientras la partición está en el estado draining, puedes usar el comando reshardCollection para redistribuir los datos fuera de la partición eliminada.

Mover datos con reshardCollection puede ser más rápido que esperar a que el balanceador migre los fragmentos. El clúster garantiza que no se almacenen datos en ninguna partición en drenaje. No puedes ejecutar las operaciones de moveCollection y reshardCollection simultáneamente.

Para conocer el procedimiento completo, consulte Refragmentación para agregar y eliminar fragmentos.

4

Para devolver una lista de namespaces de colecciones fragmentadas, utilice la etapa $shardedDataDistribution y proyecte el campo ns:

use admin
db.aggregate(
[
{ $shardedDataDistribution: { } },
{ $project: { ns: 1 } }
]
)

Registra la salida para consultarla más adelante en este tutorial.

5
db.adminCommand( { listDatabases: 1, nameOnly: true } )
6

Para cada base de datos del clúster, excluyendo admin y config, realiza estos pasos:

  1. Enumere las colecciones de bases de datos

    Enumere las colecciones en la base de datos, omitiendo los siguientes tipos de colecciones:

    • Colecciones internas que admiten CSFLE

    • Colecciones del sistema

    • Colecciones de series temporales

    • Vistas

    use <databaseName>
    db.getCollectionInfos(
    {
    $and: [
    { type: { $nin: [ "view", "timeseries" ] } },
    { name: { $not: { $regex: "^system\." } } },
    { name: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" } } }
    ]
    },
    { nameOnly: true }
    )
  2. Mover colecciones necesarias

    Para cada colección devuelta por getCollectionInfos(), realizar los siguientes pasos.

    Nota

    Solo una operación moveCollection puede estar en progreso al mismo tiempo. Completa todos los subpasos antes de pasar a la siguiente colección.

    1. Determine si la colección necesita ser trasladada.

      Ejecute la etapa de agregación $collStats y proyecte los campos ns y shard:

      db.<collName>.aggregate(
      [
      {
      $collStats: { }
      },
      {
      $project: {
      ns: 1,
      shard: 1
      }
      }
      ]
      )

      Si se cumple alguno de los siguientes criterios, omita la colección y vuelva al paso i para la siguiente colección en la base de datos:

      • El campo ns está presente en la salida $shardedDataDistribution del paso 4.

      • El campo shard no es el fragmento que se está eliminando.

      Si no se cumple ninguno de los criterios anteriores, continúe con el paso ii para la colección actual.

    2. Mover la colección.

      Para mover la colección, ejecute sh.moveCollection() en la colección:

      sh.moveCollection( "<namespace>.<collection>", "<ID of recipient shard>" )

      Nota

      moveCollection falla si ejecutas el comando en un espacio de nombres que está particionado. Si recibes este mensaje de error, ignóralo y vuelve al paso i para la próxima colección.

    3. Vuelve al paso i para cada colección de la base de datos.

  3. Repite el procedimiento para otras bases de datos

    Repita el paso 6, Move collections off of the shard (y subpasos) para cada base de datos del clúster.

  4. Vuelve al paso 1 para comprobar que no queden colecciones sin particionar en la partición de drenaje.

7

Ejecuta el método db.printShardingStatus():

db.printShardingStatus()

En la sección databases de la salida del comando, verifica el campo database.primary. Si el campo primary es la partición removida, debe mover el primario de esa base de datos a otra partición.

Para cambiar la partición primaria de una base de datos, ejecuta el comando movePrimary.

Advertencia

Cuando ejecuta movePrimary, cualquier colección que no se haya movido en el paso Move unsharded collections to another shard no estará disponible durante el proceso movePrimary.

db.adminCommand(
{
movePrimary: <dbName>,
to: <shardName>
}
)
8

Para comprobar el progreso de la migración, ejecuta removeShard de la base de datos admin nuevamente:

db.adminCommand( { removeShard: "<shardName>" } )

En el output, el campo remaining incluye estos campos:

Campo
Descripción

chunks

Número de fragmentos actualmente restantes en la partición

dbs

Número de bases de datos cuya partición primaria es la partición. Estas bases de datos se especifican en el campo de salida dbsToMove.

jumboChunks

Del número total de chunks, el número que son jumbo.

Si jumboChunks es mayor que 0, espera hasta que solo el jumboChunks permanezca en la partición. Una vez que únicamente queden los jumbo fragmentos, tendrás que limpiar manualmente la bandera jumbo antes de que el drenaje pueda completarse. Consulta Quitar bandera jumbo.

Después de que la bandera jumbo se borre, el balanceador puede migrar estos fragmentos. Para más detalles sobre el procedimiento de migración, consulta Procedimiento de Migración de Rangos.

Sigue comprobando el estado del comando removeShard hasta que el número de fragmentos restantes sea 0.

db.adminCommand( { removeShard: "<shardName>" } )
9

Para finalizar el proceso de eliminación de particiones, vuelva a ejecutar el comando removeShard:

db.adminCommand( { removeShard: <shardName> } )

Nota

Operaciones de DDL

Si elimina un fragmento mientras su clúster ejecuta una operación DDL (una operación que modifica una colección como),reshardCollection la removeShard operación se ejecuta después de que finaliza la operación DDL simultánea.

Si se elimina el fragmento, la salida del comando se parece a la siguiente:

{
msg: 'removeshard completed successfully',
state: 'completed',
shard: '<shardName>',
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1721941519, i: 7 }),
signature: {
hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
keyId: Long('0')
}
},
operationTime: Timestamp({ t: 1721941519, i: 7 })
}

Volver

Añadir un nodo a una partición

En esta página