Para remover 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.
Acerca de esta tarea
Crear, particionado o mover colecciones mientras se realiza este procedimiento puede provocar interrupciones y causar resultados inesperados.
No uses este procedimiento para migrar un clúster completo a un hardware nuevo. Para migrar, consulte Migrar un clúster fragmentado autogestionado a diferente hardware.
Cuando se elimina una partición en un clúster con una distribución desigual de fragmentos, el balanceador primero elimina los fragmentos de la partición en proceso de drenaje y luego equilibra la distribución desigual de fragmentos restante.
Eliminar una partición puede causar que se cierre un cursor de flujo de cambios abierto, y es posible que el cursor de flujo de cambios cerrado no pueda reanudarse por completo.
Puede reiniciar de manera segura un clúster durante un proceso de eliminación de particiones. Si reinicias un clúster durante un proceso de vaciado en curso, vaciado continúa automáticamente después de que los componentes del clúster se reinicien. MongoDB registra el estado de drenaje de particiones en el
config.shardscolección.
Antes de comenzar
Este procedimiento utiliza el método
sh.moveCollection()para mover colecciones fuera de la partición eliminada. Antes de comenzar este procedimiento, revise lasmoveCollectionconsideraciones y los requisitos para comprender el comportamiento del comando.Para remover una partición, primero conéctese a una de las instancias
mongosdel clúster usandomongosh.
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.
Pasos
Asegúrate de que el balanceador esté habilitado.
Para migrar datos desde una partición, el proceso balanceador debe estar habilitado. Para verificar el estado del balanceador, utiliza el método sh.getBalancerState():
sh.getBalancerState()
Si la operación devuelve true, el balanceador está habilitado.
Si la operación devuelve false, consulta Activar el balanceador.
Determinar el nombre de la partición a remover.
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.
Comienza a drenar la partición.
Ejecuta el comando startShardDraining para comenzar a mover fragmentos de las colecciones particionadas a las demás particiones del clúster:
db.adminCommand( { startShardDraining: "shard04" } )
Si necesitas remover varias particiones, puedes iniciar los procesos de drenaje para que se ejecuten en paralelo.
Mover las colecciones.
Cuando creas una colección en mongos y no llamas a shardCollection, dicha colección permanece sin fragmentar y MongoDB la almacena íntegramente en un shard particular del clúster. Las bases de datos que usan la partición como primario también almacenan sus colecciones en la partición.
Si la partición que deseas eliminar contiene una colección no fragmentada o una base de datos principal, necesitas mover la colección a otra partición.
Para identificar si la partición que deseas remover contiene estas colecciones y ver el estado de drenaje, ejecuta el comando shardDrainingStatus y revisa el arreglo para el campo de salida collectionsToMove:
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ msg: "draining ongoing", state: "ongoing", remaining: { chunks: Long(2), dbs: Long(2), jumboChunks: Long(0), collectionsToMove: Long(2) }, shard: "shard04", note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", dbsToMove: [ "accounts", ], collectionsToMove: [ "accounts.us-east", "accounts.us-west", "locations.us", ], ok: 1, operationTime: Timestamp(1575399086, 1655), $clusterTime: { clusterTime: Timestamp(1575399086, 1655), signature: { hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), keyId: Long("6766255701040824328") } } }
Cualquier colección encontrada en el campo collectionsToMove es una colección almacenada en esta partición. Antes de que puedas remover la partición, primero debes mover estas colecciones a otra partición.
Para mover una colección a otra partición, utiliza el comando moveCollection:
db.adminCommand( { moveCollection: "accounts.us-east", toShard: "shard05" } )
Mover primarios.
Los clústeres fragmentados designan una partición específica para que actúe como la partición primaria de una base de datos. Si la partición que desea remover es una primaria, debe moverlo a una partición diferente.
Para identificar los principales, ejecute el comando shardDrainingStatus y verifique el arreglo en el campo de salida de dbsToMove.
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ msg: "draining ongoing", state: "ongoing", remaining: { chunks: Long(2), dbs: Long(2), jumboChunks: Long(0), collectionsToMove: Long(2) }, shard: "shard04", note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", dbsToMove: [ "accounts", ], collectionsToMove: [ ], ok: 1, operationTime: Timestamp(1575399086, 1655), $clusterTime: { clusterTime: Timestamp(1575399086, 1655), signature: { hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), keyId: Long("6766255701040824328") } } }
Cada base de datos mostrada en el campo dbsToMove es una base de datos que necesitas mover a una partición diferente.
Para mover la base de datos, use el comando movePrimary:
db.adminCommand( { movePrimary: "accounts", to: "shard05" })
Retire la partición.
Antes de remover la partición, compruebe que la operación de drenaje esté completa.
Para comprobar el estado de la operación de vaciado, ejecute el comando shardDrainingStatus:
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ "msg" : "draining completed successfully", "state" : "drainingComplete", "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771839836, 139), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771839836, 139) }
Cuando el campo state devuelve drainingComplete para la partición que deseas remover, el proceso de drenaje se haya completado. Ahora puedes remover la partición.
Para remover la partición, ejecutar el comando commitShardRemoval:
db.adminCommand( { commitShardRemoval: "shard04" } )
{ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771840037, 12), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771840037, 12) }
Si la partición no está completamente vaciada, el comando devuelve un error.