Para remover un partición debes asegurarte de que los datos de esa partición se hayan migrado a las particiones restantes en el clúster. Este procedimiento describe cómo migrar datos de forma segura y cómo remover una partición.
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.
Este procedimiento describe cómo remover una partición de un clúster. No utilizes este procedimiento para migrar un clúster completo a un hardware nuevo. Para migrar, consulte Migrar un clúster de fragmentación autogestionado a otro hardware en su lugar.
Para remover una partición, primero debe conectarse a uno de los clúster
mongos instancias usando mongosh. Luego, utiliza la secuencia de tareas en este documento para eliminar una partición del clúster.
Considerations
La eliminación de una partición puede causar que un cursor de flujo de cambios abierto se cierre, y es posible que el cursor de flujo de cambios cerrado no se pueda reanudar completamente.
Puedes reiniciar un clúster con seguridad durante un proceso de eliminación de particiones. Si reinicias un clúster durante un proceso de drenaje en curso, el drenaje continúa automáticamente una vez que los componentes del clúster se reinician. MongoDB registra el estado de drenado de la partición en la colección
config.shards.
Asegúrese de que el proceso de balanceador esté habilitado
Para migrar datos correctamente de una partición, el proceso de balanceador debe estar habilitado. Verifica el estado del balanceador usando el asistente sh.getBalancerState() en mongosh. Para obtener más información, consulta la sección sobre operaciones del balanceador.
Determina el Nombre de la partición a remover
Para determinar el nombre de la partición, conectarse a una instancia de mongos con mongosh y realizar una de las siguientes opciones:
Utiliza el comando
listShards, como se muestra a continuación:db.adminCommand( { listShards: 1 } ) Ejecutar el método
sh.status()o el métododb.printShardingStatus().
El campo shards._id lista el nombre de cada partición.
Remover fragmentos de la partición
Desde la base de datos admin, ejecuta el comando removeShard. Esto inicia el "drenaje" de fragmentos de la partición que está eliminando hacia otras particiones en el clúster. Por ejemplo, para una partición llamada mongodb0, ejecute:
db.adminCommand( { removeShard: "mongodb0" } )
mongos convierte el nivel de confirmación de escritura (write concern) del comando removeShard en "majority".
Esta operación retorna con la siguiente respuesta:
{ "msg" : "draining started successfully", "state" : "started", "shard" : "mongodb0", "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ "fiz", "buzz" ], "ok" : 1, "operationTime" : Timestamp(1575398919, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575398919, 2), "signature" : { "hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="), "keyId" : Long("6766255701040824328") } } }
El balanceador comienza a migrar fragmentos desde la partición denominada mongodb0 hacia otras particiones en el clúster. Estas migraciones ocurren lentamente para evitar sobrecargar el clúster en su conjunto. Dependiendo de la capacidad de tu red y de la cantidad de datos, esta operación puede tardar desde unos minutos hasta varios días en completarse.
Nota
La salida incluye el campo dbsToMove que indica las bases de datos, si las hay, para las cuales la partición es la partición primaria. Después de que todos los fragmentos se hayan extraído del shard, se debe realizar una de las siguientes acciones para la(s) base(s) de datos: movePrimary o, alternativamente, descartar las bases de datos (lo que borra los archivos de datos asociados).
Verifica el estado de la migración
Para comprobar el progreso de la migración en cualquier etapa del proceso, ejecute removeShard nuevamente desde la base de datos admin. Por ejemplo, para una partición llamada mongodb0, ejecuta:
db.adminCommand( { removeShard: "mongodb0" } )
mongos convierte el nivel de confirmación de escritura (write concern) del comando removeShard en "majority".
El comando devuelve una salida similar a la siguiente:
{ "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : NumberLong(2), "dbs" : NumberLong(2), "jumboChunks" : NumberLong(0) }, "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ "fizz", "buzz" ], "ok" : 1, "operationTime" : Timestamp(1575399086, 1655), "$clusterTime" : { "clusterTime" : Timestamp(1575399086, 1655), "signature" : { "hash" : BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), "keyId" : NumberLong("6766255701040824328") } } }
En la salida, el campo remaining incluye los siguientes campos:
Campo | Descripción |
|---|---|
| Número total de fragmentos que quedan actualmente en la partición. |
| Número total de bases de datos cuya partición primaria es la partición. Estas bases de datos se especifican en el campo de salida |
| Del número total de Si el Después de que la bandera |
Continúa comprobando el estado del comando removeShard hasta que el número de fragmentos restantes sea 0.
db.adminCommand( { removeShard: "mongodb0" } )
Mover bases de datos a otra partición primaria
Si la partición es la partición primaria de una o más bases de datos del clúster, entonces debes hacer que esa base de datos utilice una partición diferente como su partición primaria. removeShard enumera cualquier base de datos que debas mover en el campo dbsToMove en la salida del comando. Si la partición no es la partición primaria de ninguna base de datos, sáltate la siguiente tarea, finaliza la migración.
Para mover una base de datos a otra partición, utilice el comando movePrimary.
Importante
Para garantizar una migración fluida, consulte las consideraciones en la documentación del comando movePrimary antes de ejecutar movePrimary.
Para migrar la base de datos fizz de mongodb0 a mongodb1, emite el siguiente comando:
db.adminCommand( { movePrimary: "fizz", to: "mongodb1" })
mongos utiliza "majority" nivel de confirmación de escritura (write concern) para movePrimary.
Este comando no retorna hasta que MongoDB termine de trasladar todos los datos. La respuesta de este comando se parecerá a lo siguiente:
{ "ok" : 1, "operationTime" : Timestamp(1575400369, 9), "$clusterTime" : { "clusterTime" : Timestamp(1575400369, 9), "signature" : { "hash" : BinData(0,"2Nz8QCcVXB0LJLm1hsXfpTCaM0M="), "keyId" : NumberLong("6766255701040824328") } } }
Finalizar la migración
Para limpiar toda la información de metadatos y finalizar la eliminación, ejecuta removeShard nuevamente. Por ejemplo, para una partición llamada mongodb0, ejecuta:
db.adminCommand( { removeShard: "mongodb0" } )
mongos convierte el nivel de confirmación de escritura (write concern) del comando removeShard en "majority".
Aparece un mensaje de éxito al completar:
{ "msg" : "removeshard completed successfully", "state" : "completed", "shard" : "mongodb0", "ok" : 1, "operationTime" : Timestamp(1575400370, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575400370, 2), "signature" : { "hash" : BinData(0,"JjSRciHECXDBXo0e5nJv9mdRG8M="), "keyId" : NumberLong("6766255701040824328") } } }
Una vez que el valor del campo state sea "completado", puede detener de forma segura las instancias que conforman el fragmento mongodb0.