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úrese 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.
Determina el nombre del fragmento que se va a extraer.
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 el fragmento.
Ejecute el comando para comenzar a mover fragmentos de las colecciones fragmentadas a los otros fragmentos del startShardDraining clúster:
db.adminCommand( { startShardDraining: "shard04" } )
Si necesita eliminar varios fragmentos, puede iniciar los procesos de drenaje para que se ejecuten en paralelo.
Mover colecciones.
Cuando se crea una colección en mongos y no se llama a, esa colección permanece sin fragmentar y MongoDB la almacena completamente en un fragmento específico del clúster. Las bases de datos que utilizan el fragmento como principal también almacenan sus colecciones en shardCollection él.
Si el fragmento que desea eliminar contiene una colección no fragmentada o una base de datos principal, deberá mover la colección a otro fragmento.
Para identificar si el fragmento que desea eliminar contiene esta colección y para ver el estado de drenaje, ejecute el comando y verifique el array para shardDrainingStatus el collectionsToMove campo de salida:
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 que se encuentre en el campo collectionsToMove es una colección almacenada en este fragmento. Antes de poder eliminar el fragmento, primero debe mover estas colecciones a otro fragmento.
Para mover una colección a otro fragmento, utilice el moveCollection comando:
db.adminCommand( { moveCollection: "accounts.us-east", toShard: "shard05" } )
Mover las primarias.
En los clústeres fragmentados, se designa una partición específica como partición principal de la base de datos. Si la partición que desea eliminar es la principal, deberá moverla a otra partición.
Para identificar los elementos primarios, ejecute el comando y compruebe la matriz en shardDrainingStatus el dbsToMove campo de salida.
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 que se muestra en el campo dbsToMove es una base de datos que debe mover a un fragmento diferente.
Para mover la base de datos, utilice el movePrimary comando:
db.adminCommand( { movePrimary: "accounts", to: "shard05" })
Retire el fragmento.
Antes de retirar el fragmento, compruebe que el drenaje se haya completado.
Para comprobar el estado de la operación de drenaje, ejecute el shardDrainingStatus comando:
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 el fragmento que desea eliminar, el proceso de vaciado ha finalizado. Ahora puede eliminar el fragmento.
Para eliminar el fragmento, ejecute el commitShardRemoval comando:
db.adminCommand( { commitShardRemoval: "shard04" } )
{ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771840037, 12), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771840037, 12) }
Si el fragmento no se vacía por completo, el comando devuelve un error.