Estoy pensando en crear una aplicación multiinquilino usando MongoDB. No tengo ninguna suposición en términos de cuántos inquilinos tendría todavía, pero me gustaría poder escalar a miles.
Puedo pensar en tres estrategias:
- Todos los inquilinos de la misma colección, utilizando campos específicos de inquilinos para la seguridad
- 1 colección por inquilino en una única base de datos compartida
- 1 base de datos por inquilino
La voz en mi cabeza sugiere que opte por la opción 2.
Pensamientos e implicaciones, ¿alguien?
mongodb
multi-tenant
Braintapper
fuente
fuente
Respuestas:
Tengo el mismo problema por resolver y también considerando variantes. Como tengo años de experiencia en la creación de aplicaciones SaaS multiinquilino, también iba a seleccionar la segunda opción en base a mi experiencia previa con las bases de datos relacionales.
Mientras investigaba, encontré este artículo en el sitio de soporte de mongodb (se agregó mucho desde que desapareció): https://web.archive.org/web/20140812091703/http://support.mongohq.com/use-cases/multi -tenant.html
Los chicos declararon evitar las segundas opciones a toda costa, lo que, según tengo entendido, no es particularmente específico de mongodb. Mi impresión es que esto es aplicable a la mayoría de las bases de datos NoSQL que investigué (CoachDB, Cassandra, CouchBase Server, etc.) debido a las características específicas del diseño de la base de datos.
Las colecciones (o cubos o como lo llamen en diferentes bases de datos) no son lo mismo que los esquemas de seguridad en RDBMS a pesar de que se comportan como contenedores de documentos, son inútiles para aplicar una buena separación de inquilinos. No pude encontrar una base de datos NoSQL que pueda aplicar restricciones de seguridad basadas en colecciones.
Por supuesto, puede usar la seguridad basada en roles de mongodb para restringir el acceso a nivel de base de datos / servidor. ( http://docs.mongodb.org/manual/core/authorization/ )
Recomendaría la primera opción cuando:
Elegiría la variante 3 si:
Si publica detalles adicionales sobre su solicitud, tal vez pueda darle un consejo más detallado.
fuente
Encontré una buena respuesta en los comentarios de este enlace:
http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/
Básicamente, la opción 2 parece ser la mejor manera de hacerlo.
Cita del comentario de David Mytton:
fuente
Hay un artículo razonable en MSDN sobre la arquitectura de datos de múltiples inquilinos al que quizás desee consultar. Algunos temas clave tratados en este artículo:
También se mencionan algunos patrones para la configuración de software como servicio (SaaS).
Además, vale la pena echar un vistazo a un interesante artículo de los chicos de SQL Anywhere .
Mi propia opinión personal: a menos que esté seguro de la seguridad / confianza impuesta, optaría por la opción 3, o si las preocupaciones de escalabilidad prohíben el retorno a la opción 2 como mínimo. Dicho esto ... no soy un profesional con MongoDB. Me pongo bastante nervioso al usar un "esquema" compartido, pero felizmente lo cediré a practicantes más experimentados.
fuente
Yo optaría por la opción 2.
Sin embargo, puede configurar la opción de línea de comando mongod.exe --smallfiles. Esto significa que el tamaño de archivo más grande de una extensión será de 0,5 gigabytes y no de 2 gigabytes. Probé esto con mongo 1.42. Entonces, la opción 3 no es imposible.
fuente
Según mi investigación en MongoDB. Trucos y consejos. Aplicaciones multiusuario. esa opción no es recomendable si no sabes cuántos inquilinos puedes tener, podrían ser miles y sería complicado a la hora de fragmentar, también imagina tener miles de colecciones en una sola base de datos ... Así que en tu caso se recomienda utilizar la opción uno. Ahora bien, si vas a tener un número limitado de usuarios, ya es diferente y sí, podrías usar la opción dos como pensabas.
fuente
Si bien la discusión aquí es sobre NoSQL y principalmente MongoDB, en Citus estamos usando PostgreSQL y construyendo una base de datos de múltiples inquilinos distribuida / fragmentada.
Nuestra guía de casos de uso recorre una aplicación de ejemplo, que cubre el esquema y varias características específicas de múltiples inquilinos.
Para datos más no estructurados, usamos la columna JSONB de PostgreSQL para almacenar dichos datos y los específicos del inquilino.
fuente