Este tutorial describe cómo convertir un clúster a un set de réplicas no particionado. Para convertir un set de réplicas en un clúster, consulta Convertir un set de réplicas autogestionado en un clúster. Consulta la documentación de particionado para obtener más información sobre los clústeres.
Este tutorial te guía a través de las siguientes tareas:
Desactive el equilibrador.
Convierta el clúster en un conjunto de réplicas.
Desbloquea el clúster (solo para clústeres multi-fragmento).
Antes de comenzar
Compatibilidad de versiones
Los pasos de este tutorial requieren MongoDB 6.0 o posterior.
Autorización
La Los comandos fsync y fsyncUnlock requieren la acción de autorización fsync, la cual puede ser asignada a través del rol hostManager o un rol 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.
Pasos
En el caso de un cluster fragmentado con solo una partición, esa partición contiene el conjunto completo de datos. Para convertir ese clúster en un set de réplicas no fragmentado:
Convierta el clúster en un conjunto de réplicas.
Detener todas las
mongosinstancias.Reconfigure la aplicación para que se conecte directamente a los miembros del conjunto de réplicas del fragmento que se convertirá en el nuevo conjunto de réplicas.
Realice un reinicio gradual de los miembros del conjunto de réplicas para eliminar la
--shardsvropciónmongodde.Tip
Cambiar la opción cambia
--shardsvrmongodel puerto en el que escucha las conexiones entrantes.
El clúster de una sola partición ahora es un conjunto de réplicas sin particiones que acepta operaciones de lectura y escritura en el conjunto de datos. Puede desactivar los servidores de configuración según sea necesario.
Siga el siguiente procedimiento para pasar de un clúster con más de una partición a un set de réplicascompletamente nuevo.
Desactive el balanceador y bloquee el clúster
Para deshabilitar el equilibrador y bloquear el clúster:
Conecte
mongosha una instanciamongosen el clúster particionado.Para detener el balanceador, ejecute:
sh.stopBalancer() Para verificar que el balanceador está desactivado, 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, ejecuta:
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úrate de que la salida muestre que
fsyncLockedestrue, lo que significa que el clúster está bloqueado:[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
Convierta el clúster en un conjunto de réplicas.
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
mongosinstancias. Si detiene todas lasmongosinstancias, las aplicaciones no podrán leer de la base de datos. Si detiene todas lasmongosinstancias, inicie unamongosinstancia temporal a la que las aplicaciones no podrán 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.
Reconfigura la aplicación para usar el set de réplicas no particionado en lugar de la instancia
mongos.Después de convertir el clúster en un set de réplicas, actualice la cadena de conexión utilizada por sus aplicaciones a la cadena de conexión del set de réplicas. Luego, reinicia tus aplicaciones.
La aplicación ahora utiliza el conjunto de réplicas no fragmentadas para las operaciones de lectura y escritura. Ya puede desactivar la infraestructura de clúster fragmentada restante que no se utilice.
Desbloquea el clúster
Después de convertir el clúster fragmentado en un conjunto de réplicas, desbloquee el clúster:
Para desbloquear el clúster y permitir que las escrituras en la base de datos se reanuden, ejecuta:
db.getSiblingDB( "admin" ).fsyncUnlock() 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 } ]