Un número excesivo de bases de datos y colecciones en su instancia de MongoDB puede degradar el rendimiento de la base de datos y provocar otros problemas.
Los términos base de datos y tabla, utilizados en las bases de datos tradicionales, corresponden a database y collection en MongoDB, respectivamente.
En MongoDB, el motor de almacenamiento WiredTiger crea un archivo de disco correspondiente para cada colección. Cada índice también genera un nuevo archivo de disco. Para cada recurso abierto, como un objeto del sistema de archivos, el motor WiredTiger mantiene una estructura de datos dhandle. Esta estructura almacena información como detalles de puntos de control, recuentos de referencias de sesión, punteros a estructuras de árbol B+ en memoria y datos estadísticos.
Por lo tanto, cuantas más bases de datos y colecciones tenga una instancia de MongoDB, más objetos del sistema de archivos deberá mantener abiertos el motor WiredTiger. Esto incrementa la cantidad de estructuras de datos dhandle en memoria. Cuando se retiene una gran cantidad de estas estructuras dhandle en memoria, puede producirse contención de bloqueos, lo que degrada el rendimiento de la instancia.
Problemas potenciales
-
**Consultas lentas y mayor latencia de solicitudes debido a
handleLockoschemaLock.**Un exceso de bases de datos y colecciones puede causar consultas lentas, las cuales generan registros similares al siguiente ejemplo:
2024-03-07T15:59:16.856+0800 I COMMAND [conn4175155] command db.collections command: count { count: "xxxxxx", query: { A: 1, B: 1 }, $readPreference: { mode: "secondaryPreferred" }, $db: "db" } planSummary: COLLSCAN keysExamined:0 keysExaminedBySizeInBytes:0 docsExamined:1 docsExaminedBySizeInBytes:208 numYields:1 queryHash:916BD9E3 planCacheKey:916BD9E3 reslen:185 locks:{ ReplicationStateTransition: { acquireCount: { w: 2 } }, Global: { acquireCount: { r: 2 } }, Database: { acquireCount: { r: 2 } }, Collection: { acquireCount: { r: 2 } }, Mutex: { acquireCount: { r: 1 } } } storage:{ data: { bytesRead: 304, timeReadingMicros: 4 }, timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268msEl registro de consulta lenta anterior muestra que una operación de conteo simple en una colección con un solo documento tuvo un tiempo de ejecución prolongado. La parte del registro
timeWaitingMicros: { handleLock: 40, schemaLock: 134101710 } } protocol:op_query 134268msindica que la solicitud de lectura pasó demasiado tiempo esperando para adquirir los bloqueoshandleLockyschemaLockdel motor de almacenamiento subyacente debido a la gran cantidad de colecciones. Errores de falta de memoria (OOM) durante la fase de sincronización inicial al agregar un nuevo nodo.
Aumento en el tiempo de inicio de la instancia.
Incremento en el tiempo de sincronización de datos.
Mayor tiempo para realizar copias de seguridad y restaurar datos.
Aumento en la tasa de fallos de las copias de seguridad físicas.
Mayor tiempo de recuperación ante fallos.
Una gran cantidad de bases de datos y colecciones no necesariamente causa problemas. El impacto real depende de factores como el modelo de datos de la aplicación y la carga de trabajo. Por ejemplo, considere dos escenarios donde bases de datos de la misma especificación tienen cada una 10,000 colecciones y 100,000 archivos en total. Los desafíos que enfrentan son completamente diferentes:
Sistema de software contable: Los patrones de acceso están altamente concentrados. La mayoría de las colecciones se usan para almacenamiento de datos fríos, y solo un subconjunto pequeño y reciente de colecciones se accede con frecuencia.
Sistema de gestión multiinquilino: Los inquilinos se aíslan mediante colecciones separadas, y casi todas las colecciones se acceden o utilizan activamente.
Métodos de optimización
Eliminar colecciones innecesarias
Identifique las colecciones en la base de datos que se pueden eliminar, como aquellas que han caducado o ya no están en uso. Utilice el comando dropCollection para quitarlas. Para obtener más información, consulte dropCollection().
Antes de realizar cualquier operación de eliminación, asegúrese de contar con una copia de seguridad completa disponible.
Utilice los siguientes comandos para consultar la información de bases de datos y colecciones:
-
Ejecute el siguiente comando para ver la cantidad de colecciones en una base de datos.
db.getSiblingDB(<dbName>).getCollectionNames().length -
Ejecute el siguiente comando para ver información detallada sobre una base de datos, incluida la cantidad de colecciones, índices y documentos, así como el tamaño total de los datos.
// View statistics for a specific database. db.getSiblingDB(<dbName>).stats() -
Ejecute el siguiente comando para ver información detallada sobre una colección específica.
// View statistics for a specific collection. db.getSiblingDB(<dbName>).<collectionName>.stats()
Eliminar índices innecesarios
Reducir la cantidad de índices también disminuye el número de archivos de disco y las estructuras dhandle correspondientes mantenidas por el motor de almacenamiento WiredTiger, lo que ayuda a mitigar este problema.
Siga estos principios básicos para la optimización de índices:
-
Evite índices no utilizados
Si una consulta nunca accede a un campo específico, cualquier índice en ese campo no se utilizará. Dichos índices se consideran no utilizados y se pueden eliminar.
-
Siga las reglas de prefijo de índice
Por ejemplo, si tiene tanto los índices
{a:1}como{a:1,b:1}, el primer índice es un prefijo redundante del segundo y se puede eliminar. -
Considere el orden de los campos del índice para consultas de igualdad
Para coincidencias de igualdad, el orden de los campos en un índice compuesto no importa. Por ejemplo, para consultas en los campos a y b, los índices
{a:1,b:1}y{b:1,a:1}son funcionalmente equivalentes. Puede eliminar el que se utilice con menor frecuencia. -
Utilice la regla ESR para consultas de rango
Para crear un índice compuesto óptimo para sus consultas, organice los campos en el orden de
Equality, Sort, Range. Para obtener más información, consulte The ESR (Equality, Sort, Range) Rule. -
Revise índices con bajos recuentos de aciertos
Un índice con un bajo recuento de aciertos a menudo se superpone con un índice más eficiente. Analice todos los patrones de consulta relevantes para determinar si puede eliminarlo de forma segura.
Puede utilizar la etapa de agregación $indexStats de MongoDB para ver estadísticas de todos los índices en una colección. Asegúrese de tener los permisos necesarios antes de ejecutar el siguiente comando.
// View index statistics for a specific collection.
db.getSiblingDB(<dbName>).<collectionName>.aggregate({"$indexStats":{}})
El comando devuelve una salida similar al siguiente ejemplo.
{
"name" : "item_1_quantity_1",
"key" : { "item" : 1, "quantity" : 1 },
"host" : "examplehost.local:27018",
"accesses" : {
"ops" : NumberLong(1),
"since" : ISODate("2020-02-10T21:11:23.059Z")
}
}
La siguiente tabla describe los parámetros en la información devuelta.
|
Parámetro |
Descripción |
|
name |
El nombre del índice. |
|
key |
Detalles de la clave del índice. |
|
accesses.ops |
El número de operaciones que han utilizado este índice, lo cual equivale al recuento de aciertos del índice. |
|
accesses.since |
El momento a partir del cual comenzó la recopilación de estadísticas. Este campo y el campo |
Si observa que un índice tiene un recuento de aciertos muy bajo, por ejemplo, si accesses.ops es 1, es probable que sea un índice redundante o no utilizado que puede considerar eliminar. Si su instancia de MongoDB es versión 4.4 o posterior, puede usar el comando hideIndex para ocultar el índice antes de eliminarlo. Esto le permite confirmar que no hay un impacto negativo en su aplicación durante un período de tiempo, reduciendo el riesgo de la eliminación del índice.
Ejemplo
Suponga que tiene una colección de jugadores con una regla: "Cada vez que un jugador recolecta 20 coins, se convierten en 1 star." Un documento en la colección tiene el siguiente aspecto:
// players collection
{
"_id": "ObjectId(123)",
"first_name": "John",
"last_name": "Doe",
"coins": 11,
"stars": 2
}
Actualmente, la colección tiene los siguientes cinco índices, que cubren todos los campos:
_id(índice predeterminado){ last_name: 1 }{ last_name: 1, first_name: 1 }{ coins: -1 }{ stars: -1 }
La lógica de optimización de índices es la siguiente:
Las consultas de la aplicación no acceden al campo
coins, por lo que{ coins: -1 }es un índice no utilizado.Según la regla de prefijo de índice mencionada anteriormente, el índice
{ last_name: 1, first_name: 1 }cubre el índice{ last_name: 1 }. Por lo tanto, puede eliminar el índice{ last_name: 1 }.Al usar el comando
$indexStats, observa que el recuento de aciertos para{ stars: -1 }es bajo. Sin embargo, al final de una ronda de juego, la aplicación requiere ordenar a los jugadores por el número destarsen orden descendente para una tabla de clasificación. Por lo tanto, aunque no se use con frecuencia, el índice{ stars: -1 }debe conservarse para evitar un escaneo completo de la colección.
Después de la optimización, permanecen tres índices en la colección:
_id{ last_name: 1, first_name: 1 }{ stars: -1 }
Los beneficios de esta optimización incluyen:
Reducción del espacio de almacenamiento.
Mejora en el rendimiento de escritura.
Si tiene más preguntas sobre la optimización de índices, envíe un ticket para ponerse en contacto con el soporte técnico de Alibaba Cloud y obtener asistencia.
Consolidar datos de varias colecciones
Consolide los datos de varias colecciones en una sola colección para reducir el recuento total de colecciones.
Por ejemplo, una base de datos llamada temperatures almacena datos de temperatura de sensores. Un sensor opera de 10:00 AM a 10:00 PM, leyendo y almacenando datos de temperatura cada media hora. Almacena los datos de temperatura de cada día en una colección separada nombrada según la fecha.
Los siguientes fragmentos muestran datos parciales de dos colecciones, temperatures.march-09-2020 y temperatures.march-10-2020.
-
Colección
temperatures.march-09-2020{ "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } -
Colección
temperatures.march-10-2020{ "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
Con el tiempo, aumenta la cantidad de colecciones en la base de datos. Dado que MongoDB no impone un límite estricto en la cantidad de colecciones y este modelo carece de una política clara de ciclo de vida de los datos, el número de colecciones y sus índices correspondientes crece indefinidamente.
Además del problema de un número de colecciones en constante crecimiento, este modelo de datos dificulta la realización de consultas que abarcan varios días. Para consultar datos a lo largo de varios días y analizar tendencias de temperatura a largo plazo, necesitaría usar consultas $lookup, las cuales tienen un rendimiento inferior al de las consultas dentro de una sola colección.
Un mejor modelo de datos consiste en almacenar todas las lecturas de temperatura en una sola colección, con los datos de cada día almacenados en un único documento. Este enfoque es un ejemplo del Patrón de Bucket. El siguiente ejemplo muestra el modelo optimizado.
// temperatures.readings
{
"_id": ISODate("2020-03-09"),
"readings": [
{
"timestamp": "2020-03-09T010:00:00Z",
"temperature": 29
},
{
"timestamp": "2020-03-09T010:30:00Z",
"temperature": 30
},
...
{
"timestamp": "2020-03-09T022:00:00Z",
"temperature": 26
}
]
}
{
"_id": ISODate("2020-03-10"),
"readings": [
{
"timestamp": "2020-03-10T010:00:00Z",
"temperature": 30
},
{
"timestamp": "2020-03-10T010:30:00Z",
"temperature": 32
},
...
{
"timestamp": "2020-03-10T022:00:00Z",
"temperature": 28
}
]
}
El modelo optimizado consume muchos menos recursos que el modelo original. Ya no necesita crear índices basados en la hora del día, y el índice predeterminado _id en la colección facilita las consultas por fecha. Esto también resuelve el problema de un número ilimitado de colecciones.
Para datos de series temporales, también puede considerar el uso de colecciones de series temporales para abordar este problema.
La función de colección de series temporales solo es compatible con MongoDB 5.0 y versiones posteriores.
Dividir la instancia
Si no puede reducir el número total de bases de datos y colecciones dentro de una sola instancia de MongoDB, considere una división lógica de la instancia de base de datos junto con los cambios correspondientes en su aplicación.
Puede abordar esto en dos escenarios:
|
Escenario |
Solución de división |
Consideraciones |
|
Las colecciones están distribuidas en varias bases de datos |
Si la lógica de negocio entre bases de datos no está estrechamente relacionada (por ejemplo, varias aplicaciones o servicios comparten una sola instancia de base de datos), utilice DTS (Data Transmission Service) to migrate some databases to a new ApsaraDB for MongoDB replica set or sharded cluster instance. Antes de completar la migración, también debe dividir la lógica de la aplicación y los métodos de acceso en consecuencia. Si la lógica de negocio entre bases de datos está estrechamente relacionada, consulte la solución de división para el escenario de base de datos única. |
|
|
Las colecciones están concentradas en una sola base de datos |
Su equipo de negocio debe determinar primero si todas las colecciones se pueden dividir en función de una dimensión específica, como región, ciudad, prioridad o cualquier otro atributo de negocio significativo. Luego, utilice DTS para migrar algunas colecciones a una o más instancias nuevas de MongoDB, dividiendo efectivamente una instancia en N instancias. Antes de completar la migración, debe dividir la lógica de la aplicación y los métodos de acceso en consecuencia. |
|
Ejemplo
Una plataforma de gestión multiinquilino utiliza una base de datos MongoDB. En el modelo de datos inicial, cada inquilino tenía una colección separada. A medida que creció el negocio, la cantidad de inquilinos superó los cien mil y el tamaño total de la base de datos alcanzó el nivel de terabytes. La instancia experimentaba frecuentemente accesos lentos a la base de datos y alta latencia.
El equipo de negocio decidió dividir los inquilinos por región geográfica, dividiendo a los inquilinos nacionales en Norte, Noreste, Este, Centro, Sur, Suroeste y Noroeste de China. Crearon nuevas instancias de MongoDB en las zonas de disponibilidad correspondientes para cada región y realizaron múltiples rondas de migración utilizando DTS. Para satisfacer la necesidad del negocio de análisis agregado, también configuraron la sincronización desde las instancias de MongoDB hacia un almacén de datos.
La división redujo significativamente la cantidad de bases de datos y colecciones en cada instancia de MongoDB, y el equipo redujo las especificaciones de las instancias en consecuencia. Al adoptar un principio de acceso a la región más cercana, la aplicación redujo la latencia de las solicitudes al nivel de milisegundos, mejorando enormemente la experiencia del producto. El mantenimiento posterior de las instancias también se volvió mucho más sencillo.
Migrar a un clúster fragmentado con etiquetas de fragmento
Si todas sus colecciones están en una sola base de datos y desea gestionarlas como una única instancia lógica, considere migrar sus datos a una arquitectura de clúster fragmentado y utilizar etiquetas de fragmento para su gestión. El método de gestión de etiquetas de fragmento es ligeramente más complejo y requiere pasos operativos adicionales (usando sh.addShardTag y sh.addTagRange). Sin embargo, una sola instancia de MongoDB sigue gestionando todas las colecciones, lo que requiere cambios mínimos en su aplicación. Solo necesita reemplazar la cadena de conexión por la de la nueva instancia de clúster fragmentado.
Por ejemplo, si su instancia tiene 100,000 colecciones activas, puede adquirir una nueva instancia de clúster fragmentado de 10 fragmentos. Siga el proceso a continuación para configurar la instancia y migrar datos, lo que resultará en 10,000 colecciones activas por fragmento. El procedimiento es el siguiente:
Adquiera una nueva instancia de clúster fragmentado. Este ejemplo utiliza una instancia de 2 fragmentos. Para obtener instrucciones sobre cómo crear un clúster fragmentado, consulte Create a sharded cluster instance.
Conéctese al nodo mongos de la instancia de clúster fragmentado. Para obtener más información, consulte Connect to an ApsaraDB for MongoDB sharded cluster instance by using the mongo shell.
-
Ejecute los siguientes comandos para agregar una etiqueta de fragmento a cada fragmento.
sh.addShardTag("d-xxxxxxxxx1", "shard_tag1") sh.addShardTag("d-xxxxxxxxx2", "shard_tag2")NotaAntes de ejecutar estos comandos, asegúrese de que la cuenta que está utilizando tenga los permisos necesarios.
DMS (Data Management) actualmente no admite el comando
sh.addShardTag. Se recomienda conectarse a la instancia con mongo shell o mongosh para ejecutar estos comandos.
-
Preconfigure las reglas de distribución de rangos basadas en etiquetas para todas las colecciones fragmentadas.
use <dbName> sh.enableSharding("<dbName>") sh.addTagRange("<dbName>.test", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag1") sh.addTagRange("<dbName>.test1", {"_id":MinKey}, {"_id":MaxKey}, "shard_tag2")Este ejemplo utiliza
_idcomo clave de fragmentación. Elija una clave de fragmentación que se adapte a su carga de trabajo y asegúrese de que todas las operaciones de consulta incluyan el campo de clave de fragmentación. La clave de fragmentación debe ser coherente con el campo utilizado en el siguiente paso. También debe utilizar los límites[MinKey,MaxKey]para garantizar que todos los datos de una sola colección residan en un único fragmento. -
Ejecute la operación shardCollection para todas las colecciones que se van a migrar.
sh.shardCollection("<dbName>.test", {"_id":1}) sh.shardCollection("<dbName>.test1", {"_id":1}) -
Ejecute el comando
sh.status()para confirmar que las reglas están vigentes.zhongli.test shard key: { "_id" : 1 } unique: false balancing: true chunks: d-xxx 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0) tag: shard_tag1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } zhongli.test1 shard key: { "_id" : 1 } unique: false balancing: true chunks: d-xxx 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx Timestamp(1, 0) tag: shard_tag2 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } -
Migrate data from a replica set instance to a sharded cluster instance.
NotaDado que ya ha prefragmentado las colecciones en la instancia de destino, toda la información de bases de datos y colecciones ya existe. Por lo tanto, debe establecer el Processing Mode of Conflicting Tables en Ignore Errors and Proceed en su tarea de DTS.
Después de verificar la consistencia de los datos, cambie sus aplicaciones para acceder a la nueva instancia de clúster fragmentado.
Si necesita agregar más fragmentos a la instancia, debe repetir el Paso 3 para agregar etiquetas a todos los nuevos fragmentos.
Si se agregarán continuamente nuevas colecciones a la base de datos, debe repetir los Pasos 4 y 5 para ellas. Si no realiza estos pasos, las nuevas colecciones se crearán solo en el fragmento principal, lo que provocará que aumente la cantidad de colecciones en ese fragmento y podría generar nuevamente inestabilidad en el rendimiento.
Migrar a un clúster fragmentado con zonas
Este método es similar al uso de etiquetas de fragmento, pero utiliza la función Zones de MongoDB en su lugar. Requiere pasos operativos adicionales, específicamente sh.addShardToZone() y sh.updateZoneKeyRange().
El procedimiento es el siguiente:
Adquiera una nueva instancia de clúster fragmentado. Este ejemplo utiliza una instancia de 2 fragmentos. Para obtener instrucciones sobre cómo crear un clúster fragmentado, consulte Create a sharded cluster instance.
Conéctese al nodo mongos de la instancia de clúster fragmentado. Para obtener más información, consulte Connect to an ApsaraDB for MongoDB sharded cluster instance by using the mongo shell.
-
Ejecute los siguientes comandos para asignar cada fragmento a una zona.
sh.addShardToZone("d-xxxxxxxxx1", "ZoneA") sh.addShardToZone("d-xxxxxxxxx2", "ZoneB")NotaAntes de ejecutar estos comandos, asegúrese de que la cuenta que está utilizando tenga los permisos necesarios.
DMS actualmente no admite el comando
sh.addShardToZone. Se recomienda conectarse a la instancia con mongo shell o mongosh para ejecutar estos comandos.
-
Preconfigure las reglas de distribución de rangos basadas en zonas para todas las colecciones.
use <dbName> sh.enableSharding("<dbName>") sh.updateZoneKeyRange("<dbName>.test", { "_id": MinKey }, { "_id": MaxKey }, "ZoneA") sh.updateZoneKeyRange("<dbName>.test1", { "_id": MinKey }, { "_id": MaxKey }, "ZoneB")Este ejemplo utiliza
_idcomo clave de fragmentación. Elija una clave de fragmentación que se adapte a su carga de trabajo y asegúrese de que todas las operaciones de consulta incluyan el campo de clave de fragmentación. La clave de fragmentación debe ser coherente con el campo utilizado en el siguiente paso. También debe utilizar los límites[MinKey,MaxKey]para garantizar que todos los datos de una sola colección residan en un único fragmento. -
Ejecute la operación shardCollection para todas las colecciones que se van a migrar.
sh.shardCollection("<dbName>.test", { "_id": 1 }) sh.shardCollection("<dbName>.test1", { "_id": 1 }) -
Ejecute el comando
sh.status()para ver la distribución de fragmentación y confirmar que la configuración de zona está vigente. La salida de ejemplo es la siguiente:{ "_id" : "shardDistributionDB", "primary" : "d-xxx24", "partitioned" : false, "version" : { "uuid" : UUID("1dc635xxx"), "lastMod" : 1 } } shardDistributionDB.test shard key: { "_id" : "hashed" } unique: false balancing: true chunks: d-2ze9797089ef3704 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx04 Timestamp(1, 0) tag: ZoneA { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } shardDistributionDB.test1 shard key: { "_id" : "hashed" } unique: false balancing: true chunks: d-2zed2e752c35af24 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : d-xxx24 Timestamp(1, 0) tag: ZoneB { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } -
Migrate data from a replica set instance to a sharded cluster instance.
NotaDado que ya ha prefragmentado las colecciones en la instancia de destino, toda la información de bases de datos y colecciones ya existe. Por lo tanto, debe establecer el Processing Mode of Conflicting Tables en Ignore Errors and Proceed en su tarea de DTS.
Después de verificar la consistencia de los datos, cambie sus aplicaciones para acceder a la nueva instancia de clúster fragmentado.
Si necesita agregar más fragmentos a la instancia, debe repetir el Paso 3 para asignar zonas a todos los nuevos fragmentos.
Si se agregarán continuamente nuevas colecciones a la base de datos, debe repetir los Pasos 4 y 5 para ellas. Si no realiza estos pasos, las nuevas colecciones se crearán solo en el fragmento principal, lo que provocará que aumente la cantidad de colecciones en ese fragmento y podría generar nuevamente inestabilidad en el rendimiento.
Advertencia de riesgo
Desaconsejamos encarecidamente utilizar el comando dropDatabase para eliminar directamente una base de datos que contiene una gran cantidad de colecciones.
Después de ejecutar el comando dropDatabase, el motor WiredTiger realiza una operación de limpieza asíncrona, eliminando secuencialmente los metadatos y archivos físicos de todas las colecciones marcadas para su eliminación. Esta operación puede interferir con la replicación en nodos secundarios, causando un aumento en la latencia de replicación. Esto, a su vez, puede activar el mecanismo de control de flujo o afectar todas las operaciones de escritura que utilizan {writeConcern:majority}.
Considere los siguientes enfoques para mitigar este riesgo:
Elimine colecciones en lotes con un intervalo razonable entre ellos. Después de eliminar todas las colecciones, ejecute el comando final
dropDatabase.Utilice DTS u otras herramientas de migración para mover las bases de datos y colecciones que desea conservar a una nueva instancia. Una vez completada la migración y el cambio, elimine la instancia antigua.
En todos los casos, debe configurar alertas de latencia de replicación adecuadas para su instancia. Si su instancia encuentra este problema, envíe un ticket para obtener asistencia técnica.
Resumen
Como regla general, intente mantener el número total de colecciones dentro de un solo conjunto de réplicas por debajo de 10,000. Este número debería ser menor si las colecciones individuales tienen una gran cantidad de índices (por ejemplo, más de 15).
Si los requisitos de su aplicación exigen una gran cantidad de colecciones, como en un sistema multiinquilino que utiliza aislamiento basado en colecciones, considere dividir la lógica de su aplicación y utilizar instancias de clúster fragmentado.
Si su base de datos ya está afectada por demasiadas colecciones y no está seguro de cómo modificar el modelo de datos de su aplicación, puede enviar un ticket para ponerse en contacto con el soporte técnico y obtener asistencia.