Académique Documents
Professionnel Documents
Culture Documents
(TENANT)
PARTIE I : THEORIE
Modèles de multi-locataire pour la base de données SaaS (Software as a Service)
Lors de la conception d'une application SaaS multi-locataire, il est essentiel de choisir avec soin le
modèle de locataire qui correspond le mieux aux besoins de votre application. Un modèle de locataire
détermine comment les données de chaque locataire sont associées au stockage (base de données).
Votre choix de modèle de locataire influence la conception et la gestion de l'application. Changer
ultérieurement pour un modèle différent peut parfois être coûteux.
Dans le modèle de Software as a Service (SaaS), votre entreprise ne vend pas de licences
pour votre logiciel. Au lieu de cela, chaque client effectue des paiements de location à
votre entreprise, faisant de chaque client un locataire de votre entreprise.
Le terme modèle de locataire se réfère à la manière dont les données des locataires sont
organisées :
- Locataire unique : Chaque base de données stocke les données d'un seul locataire.
Scalabilité :
- Nombre de locataires.
- Stockage par locataire.
- Stockage global.
- Charge de travail (Workload).
Isolation des locataires : Isolation des données et performance (si la charge de travail d'un
locataire impacte les autres).
Complexité de développement :
- Modifications du schéma.
- Modifications des requêtes (requises par le modèle).
Complexité opérationnelle :
La discussion sur la locataire est axée sur la couche de données. Mais considérez un instant
la couche d'application. La couche d'application est traitée comme une entité
monolithique. Si vous divisez l'application en de nombreux petits composants, votre choix
de modèle de locataire pourrait changer. Vous pourriez traiter certains composants
différemment des autres en ce qui concerne à la fois la locataire et la technologie ou la
plateforme de stockage utilisée.
Dans ce modèle, l'ensemble de l'application est installé de manière répétée, une fois
pour chaque locataire. Chaque instance de l'application est une instance autonome,
elle n'interagit donc jamais avec une autre instance autonome. Chaque instance de
l'application n'a qu'un seul locataire et n'a donc besoin que d'une seule base de
données. Le locataire a la base de données entièrement pour lui-même.
Chaque instance de l'application est installée dans un groupe de ressources distinct.
Le groupe de ressources peut appartenir à un abonnement détenu soit par le
fournisseur de logiciels, soit par le locataire. Dans les deux cas, le fournisseur peut
gérer le logiciel pour le locataire. Chaque instance de l'application est configurée pour
se connecter à sa base de données correspondante.
Chaque base de données locataire est déployée en tant que base de données unique.
Ce modèle offre la plus grande isolation de base de données. Cependant, cette
isolation nécessite l'allocation de ressources suffisantes à chaque base de données
pour gérer ses charges maximales. Il est important de noter que les pools élastiques
ne peuvent pas être utilisés pour les bases de données déployées dans des groupes
de ressources différents ou dans des abonnements différents. Cette limitation rend
ce modèle d'application autonome à locataire unique la solution la plus coûteuse du
point de vue global des coûts de base de données.
2- Gestion du fournisseur
Le fournisseur peut accéder à toutes les bases de données de toutes les instances
autonomes de l'application, même si les instances de l'application sont installées dans
différents abonnements locataires. L'accès est réalisé via des connexions SQL. Cet
accès inter-instances peut permettre au fournisseur de centraliser la gestion du
schéma et les requêtes interbases de données à des fins de reporting ou d'analyse. Si
ce type de gestion centralisée est souhaité, un catalogue doit être déployé pour faire
correspondre les identifiants de locataire aux URI de base de données.
2- Pools élastiques
Lorsque les bases de données sont déployées dans le même groupe de ressources,
elles peuvent être regroupées dans des pools élastiques. Les pools offrent une
manière rentable de partager des ressources entre de nombreuses bases de données.
Cette option de pool est moins coûteuse que d'exiger que chaque base de données
soit suffisamment grande pour accueillir les pics d'utilisation qu'elle connaît. Même si
les bases de données regroupées partagent l'accès aux ressources, elles peuvent
toujours atteindre un haut degré d'isolation des performances.
V- Application multi-locataire avec des bases de données multi-
locataires
Un autre modèle disponible consiste à stocker de nombreux locataires dans une base de
données multi-locataire. L'instance de l'application peut avoir un nombre quelconque de
bases de données multi-locataires. Le schéma d'une base de données multi-locataire doit
avoir une ou plusieurs colonnes d'identifiant de locataire afin que les données de
n'importe quel locataire donné puissent être récupérées sélectivement. De plus, le
schéma peut nécessiter quelques tables ou colonnes utilisées uniquement par un sous-
ensemble de locataires. Cependant, le code statique et les données de référence ne sont
stockés qu'une seule fois et sont partagés par tous les locataires.
2- Coût inférieur
En général, les bases de données multi-locataires ont le coût par locataire le plus bas.
Les coûts des ressources pour une seule base de données sont inférieurs à ceux d'un
pool élastique de taille équivalente. De plus, pour les scénarios où les locataires n'ont
besoin que d'un espace de stockage limité, potentiellement des millions de locataires
pourraient être stockés dans une seule base de données. Aucun pool élastique ne
peut contenir des millions de bases de données. Cependant, une solution contenant
1000 bases de données par pool, avec 1000 pools, pourrait atteindre l'échelle des
millions au risque de devenir difficile à gérer.
Deux variations d'un modèle de base de données multi-locataires sont discutées ci-
dessous, le modèle multi-locataire fragmenté étant le plus flexible et évolutif.
Le modèle de base de données multi-locataire le plus simple utilise une seule base de
données pour héberger les données de tous les locataires. À mesure que davantage de
locataires sont ajoutés, la base de données est mise à l'échelle avec plus de ressources de
stockage et de calcul. Cette mise à l'échelle pourrait être tout ce qui est nécessaire, bien
qu'il y ait toujours une limite ultime d'échelle. Cependant, bien avant d'atteindre cette
limite, la base de données devient difficile à gérer.
Les opérations de gestion axées sur des locataires individuels sont plus complexes à
mettre en œuvre dans une base de données multi-locataire. Et à grande échelle, ces
opérations pourraient devenir inacceptablement lentes. Un exemple est une restauration
à un moment donné des données pour un seul locataire.
La plupart des applications SaaS accèdent aux données d'un seul locataire à la fois. Ce
modèle d'accès permet de distribuer les données des locataires sur plusieurs bases de
données ou fragments, où toutes les données d'un locataire donné sont contenues dans
un fragment. Associé à un modèle de base de données multi-locataire, un modèle
fragmenté permet une échelle presque illimitée.
Les bases de données multi-locataires fragmentées peuvent être placées dans des
pools élastiques. En général, avoir de nombreuses bases de données dédiées à un seul
locataire dans un pool est aussi rentable que d'avoir de nombreux locataires dans
quelques bases de données multi-locataires. Les bases de données multi-locataires
sont avantageuses lorsqu'il y a un grand nombre de locataires relativement inactifs.
Dans le modèle hybride, toutes les bases de données ont l'identifiant du locataire dans
leur schéma. Les bases de données sont toutes capables de stocker plus d'un locataire, et
les bases de données peuvent être fragmentées. Ainsi, dans le sens du schéma, ce sont
toutes des bases de données multi-locataires. Cependant, en pratique, certaines de ces
bases de données ne contiennent qu'un seul locataire. Quoi qu'il en soit, la quantité de
locataires stockés dans une base de données donnée n'a aucun effet sur le schéma de la
base de données.
À tout moment, vous pouvez déplacer un locataire particulier vers sa propre base de
données multi-locataire. Et à tout moment, vous pouvez changer d'avis et déplacer le
locataire vers une base de données qui contient plusieurs locataires. Vous pouvez
également attribuer un locataire à une nouvelle base de données dédiée à un seul
locataire lors de la provision de la nouvelle base de données.
Le modèle hybride se distingue lorsque des différences importantes existent entre les
besoins en ressources de groupes de locataires identifiables. Par exemple, supposons
que les locataires participant à un essai gratuit ne bénéficient pas du même niveau
élevé de performances que les locataires abonnés. La politique pourrait être que les
locataires en phase d'essai gratuit soient stockés dans une base de données multi-
locataire partagée entre tous les locataires en essai gratuit. Lorsqu'un locataire en
essai gratuit s'abonne au niveau de service de base, le locataire peut être déplacé vers
une autre base de données multi-locataire qui pourrait avoir moins de locataires. Un
abonné payant pour le niveau de service Premium pourrait être déplacé vers sa
propre nouvelle base de données dédiée à un seul locataire.
Dans ce modèle hybride, les bases de données dédiées à un seul locataire pour les
locataires abonnés peuvent être placées dans des pools de ressources pour réduire
les coûts de base de données par locataire. Cela est également fait dans le modèle de
base de données par locataire.
PARTIE II : PRATIQUE
https://django-tenants.readthedocs.io/en/latest/index.html
Django tenant : Cette application permet aux sites web alimentés par Django d'avoir plusieurs
locataires via les schémas PostgreSQL. Une fonctionnalité essentielle pour chaque application web
en tant que service logiciel.
Django ne propose actuellement aucune manière simple de prendre en charge plusieurs locataires
en utilisant la même instance de projet, même lorsque seules les données diffèrent. Comme nous ne
voulons pas que vous exécutiez de nombreuses copies de votre projet, vous pourrez avoir :
Un schéma peut être envisagé comme un répertoire dans un système d'exploitation, chaque
répertoire (schéma) ayant son propre ensemble de fichiers (tables et objets). Cela permet
d'utiliser le même nom de table et les mêmes objets dans différents schémas sans conflit.
Cette bibliothèque met en œuvre la deuxième approche, qui, selon nous, représente le
compromis idéal entre simplicité et performance.
Simplicité : apporte à peine des modifications à votre code actuel pour prendre en charge la
multi-locataire. De plus, vous ne gérez qu'une seule base de données.
3- Fonctionnement
Les locataires sont identifiés via leur nom d'hôte (c'est-à-dire locataire.domaine.com). Cette
information est stockée dans une table sur le schéma public. Chaque fois qu'une requête est
effectuée, le nom d'hôte est utilisé pour trouver un locataire dans la base de données. S'il y a
correspondance, le chemin de recherche est mis à jour pour utiliser le schéma de ce locataire.
Ainsi, à partir de maintenant, toutes les requêtes auront lieu dans le schéma du locataire. Par
exemple, supposez que vous ayez un locataire "client1" à http://client1.example.com. Toute
requête entrante à client1.example.com utilisera automatiquement le schéma du client et
rendra le locataire disponible pour la requête. Si aucun locataire n'est trouvé, une erreur 404
est générée. Cela signifie également que vous devriez avoir un locataire pour votre domaine
principal, utilisant généralement le schéma public.
Important
Attention
Les règles de validation des noms de schéma et des noms de domaine sont différentes. Les
traits de soulignement (_) et les lettres majuscules sont autorisés dans les noms de schéma,
mais ils sont interdits pour les noms de domaine ! En revanche, les noms de domaine peuvent
contenir un tiret (-), ce qui est interdit pour les noms de schéma !
Vous devez être prudent si vous utilisez indifféremment les noms de schéma et les noms de
domaine dans vos applications multi-locataires ! Les classes de modèle pour les locataires et
les domaines, la création et la validation des données d'entrée sont des aspects que vous
devez gérer vous-même, imposant éventuellement des contraintes supplémentaires aux
valeurs acceptables !
2- Applications partagées
Une application est considérée comme partagée lorsque ses tables se trouvent dans le schéma
public.
Certaines applications ont du sens à être partagées. Supposons que vous ayez un ensemble
de données publiques, par exemple, une table contenant des données de recensement. Vous
voulez que chaque locataire puisse la consulter. Cette application contenant cette table sera
dans le schéma public au chemin de recherche, rendant ainsi ces applications toujours
disponibles pour tous locataires.
5- Installation et configuration
SHARED_APPS = (
'django_tenants', # mandatory
'clients', # you must list the app where your tenant model resides in
'django.contrib.contenttypes',
TENANT_APPS = (
# your tenant-specific apps
'courses',
)
class Client(TenantMixin):
name = models.CharField(max_length=100)
on_trial = models.BooleanField()
created_on = models.DateField(auto_now_add=True)
class Domain(DomainMixin):
pass
MIDDLEWARE = [
'django_tenants.middleware.main.TenantMainMiddleware',
PUBLIC_SCHEMA_URLCONF = 'chemin_ici'
DATABASE_ROUTERS = (
'django_tenants.routers.TenantSyncRouter'
)
Migrations
python manage.py makemigrations $$ python manage.py migrate_schemas --shared
@admin.register(Client)
class ClientAdmin(TenantAdminMixin, admin.ModelAdmin):
list_display = ('name', 'on_trial’)