Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Cree una Arquitectura Multiinquilino para la Búsqueda en MongoDB

Puedes implementar multi-tenencia con MongoDB Search para que una sola instancia de una aplicación sirva a varios inquilinos. Esta página describe las recomendaciones de diseño que se aplican específicamente a MongoDB Search para estructurar los datos y los índices de MongoDB Search, con el fin de escalar de forma segura y mantener el aislamiento de los inquilinos.

Importante

Esta orientación asume que puedes ubicar inquilinos dentro de un solo VPC. Si se requiere un aislamiento estricto de la red, debes mantener proyectos separados para cada inquilino.

Selecciona una estrategia basada en tus necesidades de aislamiento, objetivos de escalado y requerimientos de carga de escritura. Las estrategias más comunes son:

  • Una única colección para todos los inquilinos: esta estrategia se recomienda para la mayoría de las cargas de trabajo.

  • Una base de datos por inquilino: esta estrategia ofrece un alto nivel de aislamiento, pero aumenta el número de índices.

  • Una colección por inquilino: esta estrategia no se recomienda para cargas de trabajo de búsqueda de MongoDB.

Recomendamos aplicar la estrategia de una colección para todos los tenants. En esta arquitectura, se almacena toda la información de los arrendatarios en una sola colección dentro de una única base de datos. Puedes distinguir entre inquilinos incluyendo un campo tenant_id dentro de cada documento. Este campo puede ser cualquier identificador único para el inquilino, como un UUID o un nombre de inquilino.

Este enfoque centralizado ofrece los siguientes beneficios:

  • Reduce el número de índices

    Como todos los datos del arrendatario se almacenan en una sola colección, solo necesitas un índice único que sirva documentos para todos los arrendatarios. Evita llegar a los límites de recursos del clúster. Por ejemplo, puedes incluir el tenant_id y otros campos compartidos o específicos del inquilino en un único índice.

  • Simplifica las operaciones de mantenimiento

    Al tener solo una única colección que almacena todos los datos, no tienes que mantener varias colecciones ni escalar recursos entre varias bases de datos. También simplificas las operaciones de copia de seguridad, particionado y replicación, ya que solo necesitas dirigirte a una única colección en una única base de datos.

  • Procesa las consultas eficientemente

    Proporciones el campo tenant_id en tus consultas como un filtro utilizando el operador igual dentro de la cláusula $search.compound.filter.

    Nota

    Tus resultados de query solo incluirán documentos del inquilino coincidente, lo que previene que los datos se filtren entre inquilinos.

Si los inquilinos que co-localizas comparten patrones de acceso y tamaños de recursos similares, esta estrategia también mantiene bajo el recuento de campos del índice Lucene.

Importante

Cuando cada inquilino tiene una alta carga de escritura, colocarlos todos en una sola colección puede crear una contención de escritura. En ese escenario, considera dividir los tenants con mayores escrituras en colecciones separadas para que puedas distribuir la carga de escritura entre más recursos subyacentes.

Si tienes inquilinos grandes con requisitos de recursos o indexación únicos, usa una Vista:

  1. Aísle un inquilino. Crea una vista utilizando una $match con una operación $expr para filtrar solo los documentos del inquilino.

  2. Indexar por separado. Crear un índice de búsqueda de MongoDB en la Vista.

    Esto te permite personalizar la definición de índice para el gran inquilino sin afectar el índice compartido utilizado por otros. Todos los demás inquilinos pueden utilizar un único índice.

    Un conteo alto de índices genera una carga significativa en el clúster base y podría interrumpir tu carga de trabajo. El límite estricto para los índices de búsqueda en un solo clúster es 2,500. Sin embargo, el número de índices que puede admitir tu clúster depende del nivel de tu clúster y de la carga de trabajo. Niveles de clúster más pequeños, como M10, podrían experimentar una degradación del rendimiento o errores de falta de memoria con muchos menos índices. Empieza con un pequeño número de índices y supervisa el uso de recursos de tu clúster a medida que escalas.

Si actualmente aplica la estrategia de una colección por inquilino, le recomendamos aumentar la escala del nivel base para evitar un incremento en el retraso de replicación o errores de memoria insuficiente (OOM) debido a la contención de recursos por un elevado número de índices. También le recomendamos migrar a la estrategia de una colección para todos los inquilinos.

Si ciertos inquilinos tienen cargas de guardar masivas, podrían causar conflictos en una colección compartida. Recomendamos que solo se cambie a los inquilinos de mayor volumen a colecciones separadas para repartir la carga de E/S.

Si un arrendatario requiere indexación única o es significativamente más grande que otros, utiliza una Vista de MongoDB:

  • Crear una vista usando

  • $match para filtrar únicamente los documentos de ese inquilino.

  • Crea un índice de búsqueda de MongoDB en esa Vista. Esto permite la personalización para inquilinos atípicos sin interrumpir el índice compartido utilizado por la mayoría.

En una configuración de base de datos por inquilino, cada inquilino contiene su propia base de datos. Esta configuración aísla los datos de los arrendatarios, pero también multiplica la cantidad de índices en el clúster. Si hay más de 2,500 bases de datos dando soporte a todos los inquilinos, el clúster podría llegar al límite de índice de 2,500.

Advertencia

Un conteo alto de índices genera una carga significativa en el clúster base y podría interrumpir tu carga de trabajo. El límite estricto para los índices de búsqueda en un solo clúster es 2,500. Sin embargo, el número de índices que puede admitir tu clúster depende del nivel de tu clúster y de la carga de trabajo. Niveles de clúster más pequeños, como M10, podrían experimentar una degradación del rendimiento o errores de falta de memoria con muchos menos índices. Empieza con un pequeño número de índices y supervisa el uso de recursos de tu clúster a medida que escalas.

La estrategia de colección por inquilino asigna a cada inquilino su propia colección dentro de una base de datos compartida. Los gastos en general de mantener un índice por colección podría causar:

  • Aumento del atraso de la replicación

  • Errores de OOM debido a la contención de recursos

  • Inestabilidad en el nivel base

No recomendamos esta estrategia para MongoDB Search a menos que los inquilinos tengan cargas de trabajo muy predecibles y ligeras. Si actualmente utiliza esta estrategia, migre a la estrategia de una sola colección para todos los inquilinos.

Considera las siguientes recomendaciones para gestionar campos indexados:

Utilice mapeos dinámicos para indexar campos desconocidos.

Las aplicaciones multicliente a menudo requieren campos personalizados por inquilino que se puedan buscar, clasificar, facetar y filtrar. Usa un typeSet para indizar dinámicamente subcampos de un path para que MongoDB Search detecte nuevos campos automáticamente sin una reconstrucción completa del índice. Evite indexar estos campos de forma estática, ya que hacerlo provoca una reconstrucción que aumenta la presión en la CPU y puede consumir hasta 2veces el espacio en disco del índice.

Nota

Riesgo Demasiados campos

El rendimiento del índice Lucene puede degradarse si hay más de 1000 campos distintos. Puedes supervisar la cantidad de campos únicos en el índice de MongoDB Search en las métricas de MongoDB Search. Si necesitas soportar mil o más campos, se recomienda lo siguiente:

  • Separar un subconjunto de inquilinos en un índice separado mediante View, de modo que el número distinto de campos existentes en un único índice Lucene siga siendo inferior a mil.

  • Limitar el número de campos que un solo inquilino puede añadir.

Evitar usar documentos incrustados para almacenar valores diferentes.

Si utilizas el patrón de atributo para almacenar diferentes claves por tenant, te recomendamos que hagas lo siguiente:

  1. Aplanar el arreglo incrustado de documentos usando una Vista.

  2. Crea un índice de búsqueda de MongoDB en la vista, que se almacena en el disco.

Si no se aplana el arreglo de documentos, será necesario utilizar de operadores embeddedDocuments (similares a $elemMatch) para consultar los atributos, lo cual es menos eficiente que consultar una estructura aplanada.