Docs Menu
Docs Home
/ /

Remover fragmentos de un clúster con particiones

Para eliminar un Fragmento: debe asegurarse de que sus datos se migren a los fragmentos restantes del clúster. Este procedimiento describe cómo migrar datos de forma segura y eliminar un fragmento.

  1. Este procedimiento utiliza el método para mover colecciones fuera del fragmento eliminado. Antes de comenzar, revise sh.moveCollection() las moveCollection consideraciones y requisitos de para comprender el comportamiento del comando.

  2. Para eliminar un fragmento, primero conéctese a una de las instancias del clúster mongos 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 del fragmento, ejecute el listShards comando:

db.adminCommand( { listShards: 1 } )

El campo shards._id contiene el nombre del fragmento.

3

Ejecute el comando para el fragmento que desea removeShard eliminar:

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

Nota

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

El fragmento entra en el estado draining y el balanceador comienza a migrar fragmentos del fragmento eliminado a otros fragmentos del clúster. Estas migraciones se realizan lentamente para evitar un impacto grave en el clúster general. Dependiendo de la capacidad de la red y la cantidad de datos, esta operación puede tardar desde unos minutos hasta varios días en completarse.

Tip

Mientras el fragmento esté en el draining estado, puede usar el comando reshardCollection para redistribuir datos fuera del fragmento eliminado.

Mover datos con reshardCollection puede ser más rápido que esperar a que el balanceador migre fragmentos. El clúster garantiza que los datos no se coloquen en fragmentos que se están agotando. No se pueden ejecutar operaciones moveCollection y reshardCollection simultáneamente.

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

4
  1. Determinar qué colecciones deben trasladarse

    Para enumerar las colecciones no fragmentadas en el fragmento, utilice 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,sh.moveCollection() ejecute:

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

    Nota

    moveCollection El comando falla si se ejecuta en un espacio de nombres fragmentado. Si recibe este mensaje de error, ignórelo y vuelva al paso 1 para la siguiente recopilación.

  3. Regrese al paso 1 para verificar que no queden colecciones sin fragmentar en el fragmento de drenaje.

5

Ejecute el db.printShardingStatus() método:

db.printShardingStatus()

En la sección databases de la salida del comando, verifique el campo database.primary. Si el campo primary corresponde al fragmento eliminado, debe mover la base de datos principal a otro fragmento.

Para cambiar el fragmento principal de una base de datos, ejecute el movePrimary comando.

Advertencia

When you run movePrimary, any collections that were not moved in the Move unsharded collections to another shard step are unavailable during the movePrimary process.

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

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

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

En la salida, el campo remaining incluye estos campos:

Campo
Descripción

chunks

Número de fragmentos que quedan actualmente en el fragmento

dbs

Número de bases de datos cuyo fragmento principal es el fragmento. Estas bases de datos se especifican en el dbsToMove campo de salida.

jumboChunks

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

Si jumboChunks es mayor 0 que, espere hasta que solo jumboChunks queden en el fragmento. Una vez que solo queden jumbo fragmentos, debe borrar manualmente la bandera jumbo antes de que se complete el vaciado. Consulte Borrar la jumbo bandera.

Una vez que se jumbo borra el indicador, el balanceador puede migrar estos fragmentos. Para obtener más información sobre el procedimiento de migración, consulte Procedimiento de migración de rangos.

Continúe verificando 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 fragmentos, 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

Agregar un miembro a un fragmento

En esta página