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 cómo eliminar un fragmento.
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 que usan mongoshLuego, utilice la secuencia de tareas de este documento para remover 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 balanceo 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.
Determinar el nombre del fragmento a eliminar
Para determinar el nombre del fragmento, conéctese a una mongos instancia con mongosh y:
Utiliza el comando
listShards, como se muestra a continuación:db.adminCommand( { listShards: 1 } ) Ejecute
sh.status()el métododb.printShardingStatus()o.
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 del fragmento mongodb0 a otros fragmentos del clúster. Estas migraciones se realizan lentamente para evitar una carga excesiva en el clúster. 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.
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, vuelva a ejecutar desde removeShard la admin base de datos. Por ejemplo, para un fragmento mongodb0 llamado, ejecute:
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 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 sin problemas, consulte las consideraciones en la movePrimary documentación del comando antes de movePrimary ejecutar.
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 regresa hasta que MongoDB complete la transferencia de todos los datos. La respuesta de este comando será similar a la 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".
Al finalizar aparece un mensaje de éxito:
{ "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.