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 call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove",
"dbsToMove" : [
"db1",
"db2"
],
collectionsToMove: ["db1.collA"]
"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
  1. Determinar qué colecciones deben ser movidas

    Para listar las colecciones no particionadas en la partición, utiliza la etapa de agregación $listClusterCatalog:

    use admin
    db.aggregate([
    { $listClusterCatalog: { shards: true } },
    { $match: {
    $and: [
    { sharded: false },
    { shards: '<shard_to_remove>' },
    { type: { $nin: ["timeseries","view"] } },
    { ns: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" }}},
    { $or: [{ns: {$not: { $regex: "\.system\." }}}, {ns: {$regex: "\.system\.buckets\."}}]},
    { db: { $ne: 'config' } },
    { db: { $ne: 'admin' } }
    ]}},
    { $project: {
    _id: 0,
    ns: {
    $cond: [
    "$options.timeseries",
    {
    $replaceAll: {
    input: "$ns",
    find: ".system.buckets",
    replacement: ""
    }
    },
    "$ns"
    ]
    }
    }}
    ])
  2. Mueva las colecciones una por una

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

    sh.moveCollection( "<database>.<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 1 para la próxima colección.

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

5

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 se ejecuta movePrimary, cualquier colección que no se haya movido en el Move unsharded collections to another shard el paso no está disponible durante el proceso movePrimary.

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

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

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