Este tutorial describe cómo convertir un Clúster fragmentado en un conjunto de réplicas no fragmentado. Para convertir un conjunto de réplicas en un clúster fragmentado, consulte "Convertir un conjunto de réplicas autoadministrado en un clúster fragmentado". Consulte la documentación sobre fragmentación para obtener más información sobre los clústeres fragmentados.
Antes de comenzar
Compatibilidad de versiones
Los pasos de este tutorial requieren MongoDB 6.0 o posterior.
Autorización
La fsyncLos fsyncUnlock comandos y requieren la fsync acción de autorización, que se puede asignar a través del rol o un rol hostManager personalizado.
Programar la conversión del clúster
Convierta el clúster cuando las migraciones de fragmentos, el resharding y las transformaciones de esquemas no se realicen normalmente.
Deshabilitar el balanceador y bloquear el clúster
Para deshabilitar el equilibrador y bloquear el clúster:
Conecte
mongosha una instancia en el clústermongosfragmentado.Para detener el balanceador, ejecute:
sh.stopBalancer() Para verificar que el balanceador esté deshabilitado, ejecute el siguiente comando y asegúrese de que la salida sea
false:sh.getBalancerState() Para bloquear el clúster fragmentado, lo que impide la escritura en la base de datos, ejecute:
db.getSiblingDB( "admin" ).fsyncLock() Para confirmar el bloqueo, ejecute:
db.getSiblingDB( "admin" ).aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } } ] } } ], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] ) Asegúrese de que la salida muestre que
fsyncLockedestrue, lo que significa que el clúster está bloqueado:[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
Convertir un clúster con un solo fragmento en un conjunto de réplicas
En el caso de un cluster fragmentado con solo una partición, esa partición contiene el conjunto completo de datos. Utiliza el siguiente procedimiento para convertir ese clúster en un set de réplicas no particionado:
Reconfigurar la aplicación para conectarse con el miembro primario del set de réplicas que aloja la única partición; ese sistema será el nuevo set de réplicas.
Elimina la opción
--shardsvrdemongodtu.Tip
Cambiar la opción cambiará
--shardsvrmongodel puerto en el que escucha las conexiones entrantes.
El clúster de réplica única ahora es un conjunto de réplicas no particionado que aceptará operaciones de lectura y escritura en el conjunto de datos.
Convertir un clúster fragmentado en un conjunto de réplicas
Utilice el siguiente procedimiento para realizar la transición de un clúster fragmentado con más de un fragmento a un conjunto de réplicas completamente nuevo.
Con el clúster bloqueado y el balanceador deshabilitado, implementa un nuevo set de réplicas además de tu clúster. El set de réplicas debe tener la capacidad suficiente para alojar todos los archivos de datos de todas las particiones actuales combinadas. No configures la aplicación para conectarse al nuevo set de réplicas hasta que se complete la transferencia de datos.
Reconfigure su aplicación o detenga todas las instancias de
mongos. Si detiene todas las instancias demongos, las aplicaciones no podrán leer desde la base de datos. Si detiene todas las instanciasmongos, inicie una instancia temporalmongosa la que las aplicaciones no pueden acceder para el procedimiento de migración de datos.Utiliza mongodump y mongorestore para migrar los datos de la
mongosinstancia al nuevo conjunto de réplicas.Excluya la base de datos
configcuando ejecutemongorestore. Usa la opción--nsExcludecomo se muestra en este ejemplo:mongorestore --nsExclude="config.*" <connection-string> /data/backup Nota
No todas las colecciones en todas las bases de datos están necesariamente particionadas. No migres únicamente las colecciones particionadas. Asegúrese de que todas las bases de datos y todas las colecciones se migren correctamente.
Reconfigure la aplicación para utilizar el conjunto de réplicas no fragmentadas en lugar de la
mongosinstancia.
La aplicación ahora utilizará el conjunto de réplicas sin particiones para las operaciones de lectura y escritura. Ahora puedes retirar la infraestructura restante sin usar del clúster particionado.
Próximos pasos
Después de convertir el clúster fragmentado en un conjunto de réplicas, realice los siguientes pasos para desbloquear el clúster:
Para desbloquear el clúster y permitir que se reanuden las escrituras en la base de datos, ejecute:
db.getSiblingDB( "admin" ).fsyncLock() Para confirmar el desbloqueo, ejecuta:
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } } ] } } ], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] ) Asegúrese de que la salida muestre que
fsyncLockedesfalse, lo que significa que el clúster está desbloqueado:[ { fsyncLocked: false }, { fsyncUnlocked: true } ]