web-dev-qa-db-fra.com

Quelle est l'approche recommandée pour les bases de données multi-locataires dans MongoDB?

Je songe à créer une application multi-locataires à l'aide de MongoDB. Je ne peux pas deviner le nombre de locataires, mais j'aimerais pouvoir compter sur des milliers de locataires.

Je peux penser à trois stratégies:

  1. Tous les clients hébergés dans la même collection, à l'aide de champs spécifiques à l'utilisateur pour la sécurité
  2. 1 collecte par locataire dans une seule base de données partagée
  3. 1 base de données par locataire

La voix dans ma tête me suggère de choisir l'option 2. 

Pensées et implications, quelqu'un?

77
Braintapper

J'ai trouvé une bonne réponse dans les commentaires sur ce lien:

http://blog.boxedice.com/2010/02/28/notes-from-a-production-mongodb-deployment/

En gros, l'option n ° 2 semble être la meilleure voie à suivre.

Citation du commentaire de David Mytton:

Nous avons décidé de ne pas avoir de base de données par client à cause de la manière MongoDB alloue ses fichiers de données. Chaque La base de données utilise son propre ensemble de fichiers:

Le premier fichier pour une base de données est nombase.0, puis nombase.1, etc. nombase.0 64 Mo, nom_base.1 128 Mo, etc., en hausse à 2 Go. Une fois que les fichiers atteignent 2 Go taille, chaque fichier successif est également 2 Go.

Ainsi, si le dernier fichier de données présent est disons, 1 Go, ce fichier peut être vide à 90% si cela a été récemment atteint.

du manuel.

En tant qu'utilisateur, inscrivez-vous à l'essai et donnez les choses en partant, nous en aurions de plus en plus bases de données d'au moins 2 Go taille, même si l’ensemble des données le fichier n’a pas été utilisé. Nous avons trouvé cela utilisé un quantité massive d'espace disque comparée d'avoir plusieurs bases de données pour tous clients où l’espace disque peut être utilisé à l'efficacité maximale.

L’éclatement se fera par collection base comme standard qui présente un problème où la collection ne jamais atteint la taille minimale pour commencer le sharding, comme c'est le cas pour pas mal de quelques-uns d’entre nous (par exemple, des collections.... stockant les informations de connexion de l’utilisateur). Toutefois, nous avons demandé que cela soit également pouvoir être fait sur une base de données niveau. Voir http://jira.mongodb.org/browse/SHARDING-41

Il n'y a pas de compromis de performance en utilisant beaucoup de collections. Voir http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections

8
Braintapper

Il existe un article raisonnable sur MSDN concernant l’architecture de données multi-locataires auquel vous pouvez vous reporter. Quelques sujets clés abordés dans cet article:

  • Considérations économiques
  • Sécurité
  • Considérations locataires
  • Réglementation (juridique)
  • Ensemble de compétences

Nous avons également abordé certains modèles de configuration SaaS (Software as a Service).

En outre, il vaut la peine de consulter un article intéressant rédigé par les gars de SQL Anywhere .

Mon point de vue personnel - sauf si vous êtes certain de la sécurité/confiance forcée, j'opterais pour l'option 3, ou si les problèmes d'évolutivité interdisaient le recours à l'option 2 au minimum. Cela dit ... je ne suis pas un pro avec MongoDB. Je suis assez nerveux en utilisant un "schéma" commun - mais je me tournerai volontiers vers des praticiens plus expérimentés.

2
AJ.

Je choisirais l'option 2. 

Cependant, vous pouvez définir l'option de ligne de commande mongod.exe --smallfiles. Cela signifie que la taille de fichier la plus grande d'une extension sera de 0,5 gigaoctet et non de 2 gigaoctets. J'ai testé cela avec Mongo 1.42. Donc l'option 3 n'est pas impossible. 

1
TTT

Bien que la discussion ici porte sur NoSQL et principalement sur MongoDB, nous, chez Citus , utilisons PostgreSQL et construisons une base de données multi-locataires distribuée/partagée.

Notre guide de cas d'utilisation présente un exemple d'application, couvrant le schéma et diverses fonctionnalités spécifiques à plusieurs locataires.

Pour les données plus non structurées, nous utilisons la colonne JSONB de PostgreSQL pour stocker de telles données et des données propres à un locataire.

0
Sumedh

Selon mes recherches dans MongoDB. Trucos y consejos. Aplicaciones multitenant. Cette option n'est pas recommandée si vous ne savez pas combien de locataires vous pouvez avoir, cela pourrait être des milliers et ce serait compliqué quand il s'agit de sharding, imaginez aussi d'avoir des milliers de collections dans une seule base de données ... Donc, dans votre cas, il est recommandé d'utiliser la première option. Maintenant, si vous allez avoir un nombre limité d'utilisateurs, c'est déjà différent et oui, vous pouvez utiliser l'option deux comme vous le pensiez.