Aller au contenu

Stack & technique · 10 min de lecture

Architecture multi-tenant : base partagée ou instance par client

Les trois modèles, le coût de chacun selon le nombre de clients, et les quatre opérations du quotidien qui tranchent vraiment.

James DumaineFondateur · TikupMedia
LES REPÈRES TIKUPMEDIA

Comprendre.
Comparer.
Décider.

Explorer un dossier de démonstration
Sommaire· 11 sections
  1. 01À retenir
  2. 02Les trois modèles
  3. 03Pourquoi l instance par client semble simple et ne l est pas
  4. 04Comment garantir l étanchéité sans y penser
  5. 05Les quatre opérations qui tranchent
  6. 06Comment choisir, en trois questions
  7. 07Questions fréquentes
  8. 08Glossaire
  9. 09Sources
  10. 10À lire aussi sur le blog
  11. 11Aller plus loin avec nous

TL;DR : réponse rapide

Trois architectures multi-tenant existent : une base partagée avec un identifiant de client sur chaque ligne, un schéma par client, ou une instance complète par client. La base partagée est le bon choix dans la très grande majorité des cas : l’instance par client paraît plus simple au début et devient ingérable au-delà de cinq ou six clients. Ce choix se fait au premier jour et ne se rattrape pas.

Pour qui cet article

Vous construisez un logiciel que plusieurs entreprises clientes vont utiliser. Vous vous demandez s’il faut une base de données par client ou une seule base pour tout le monde, et ce que ce choix coûte dans six mois.

À retenir

  • Base partagée : une seule base, un identifiant de client sur chaque ligne. Le moins cher à exploiter, le plus simple à faire évoluer, et celui qui demande le plus de rigueur sur l’étanchéité.
  • Schéma par client : une base, un espace de nommage par client. Isolation plus lisible, migrations plus lourdes, plafond autour de quelques centaines de clients.
  • Instance par client : tout en double. Isolation maximale, coût maximal, et chaque mise à jour doit être déployée autant de fois qu’il y a de clients.
  • L’étanchéité se garantit au niveau de l’accès aux données, pas dans le code applicatif. Un filtre que chaque développeur doit penser à écrire est un filtre qui sera oublié un jour.
  • Le test qui compte n’est pas « est-ce que ça marche », c’est « est-ce qu’un client voit un autre client ». Il s’automatise, et il doit tourner à chaque livraison.
  • Quatre opérations décident du modèle : restaurer un seul client, supprimer un seul client, migrer le schéma, et chiffrer les données d’un client en particulier.
  • Passer d’un modèle à l’autre coûte entre 15 et 40 jours selon la taille de l’application. C’est pour cela que le choix se fait au cadrage : voir le prix d’un SaaS B2B.

C’est la première décision d’architecture d’un logiciel vendu à plusieurs entreprises, et c’est aussi celle qu’on prend le plus souvent par défaut. « On fera une base par client, c’est plus propre » est la phrase la plus coûteuse qu’on puisse prononcer au démarrage d’un SaaS.

Voici les trois modèles, ce qu’ils coûtent, et les quatre opérations qui tranchent réellement entre eux.

Les trois modèles

ModèleComment ça marcheIsolationCoût d’exploitation
Base partagéeUne base, un identifiant de client sur chaque ligneLogique, garantie par le filtrage d’accèsLe plus faible
Schéma par clientUne base, un espace de nommage par clientStructurelle à l’intérieur d’une même baseMoyen, croît avec le nombre de clients
Instance par clientApplication et base dupliquées pour chaque clientPhysique, totaleLe plus élevé, linéaire
Coût d'exploitation relatif : base partagée 40 à 10 clients et 100 à 50 clients, schéma par client 70 puis 220, instance par client 180 puis 850.
Le coût de la base partagée croît très lentement avec le nombre de clients, celui de l’instance par client croît en ligne droite. À cinquante clients, l’écart décide de la rentabilité du produit.

Le graphique dit l’essentiel : le coût de la base partagée croît très lentement avec le nombre de clients, celui de l’instance par client croît en ligne droite. À dix clients, l’écart se voit. À cinquante, il décide de la rentabilité du produit.

Pourquoi l’instance par client semble simple et ne l’est pas

L’argument est séduisant : aucune donnée partagée, donc aucun risque de fuite entre clients, et un client difficile peut être isolé sur une infrastructure dédiée. Tout cela est vrai. Ce qui est tu, c’est le reste.

  • Chaque mise à jour se déploie autant de fois qu’il y a de clients. À trois clients c’est un détail, à trente c’est un métier, et le jour où une migration échoue sur le client vingt-trois, vous avez deux versions du logiciel en production.
  • Les coûts fixes se multiplient. Chaque instance paie son serveur, sa base, ses sauvegardes et sa surveillance, même pour un client qui utilise le produit une heure par semaine.
  • Le support devient un travail d’enquête. Reproduire un problème suppose de savoir sur quelle instance, dans quelle version, avec quelle configuration.
  • Les évolutions transversales deviennent impossibles. Ajouter une fonctionnalité à tout le monde demande de la déployer partout, et donc d’avoir maintenu tout le monde sur la même version, ce qui ne se produit jamais spontanément.

L’instance par client reste le bon choix dans un cas précis : quand un client l’exige contractuellement, souvent pour une raison de localisation ou de certification. C’est alors une option payante du produit, pas son architecture par défaut.

Comment garantir l’étanchéité sans y penser

Avec une base partagée, tout repose sur une règle : aucune requête ne doit pouvoir lire les données d’un autre client. La question n’est pas de savoir si on l’écrit, c’est de savoir ce qui se passe le jour où un développeur l’oublie.

ApprocheCe qui se passe quand on oublie le filtreVerdict
Filtre écrit dans chaque requêteLa requête renvoie les données de tous les clientsÀ proscrire
Filtre centralisé dans la couche d’accèsImpossible d’écrire une requête sans filtreLe minimum acceptable
Filtre appliqué par la base elle-mêmeLa base refuse de renvoyer la ligne, quelle que soit la requêteLa garantie la plus forte

La troisième ligne est la seule qui transforme une discipline en garantie. Les bases de données modernes savent appliquer des règles de visibilité au niveau des lignes, en fonction du client pour lequel la session travaille. Le filtre n’est plus une convention d’équipe, c’est une propriété du système.

Et surtout, cela se teste. Un test automatisé qui ouvre une session au nom du client A et tente de lire une donnée du client B doit échouer. Ce test doit tourner à chaque livraison : c’est le seul qui protège contre la régression la plus grave d’un SaaS B2B.

Les quatre opérations qui tranchent

Le choix ne se fait pas sur l’élégance, il se fait sur ces quatre gestes du quotidien.

OpérationBase partagéeInstance par client
Restaurer un seul client au jour d’avantDifficile : il faut extraire ses lignes d’une sauvegarde globaleTrivial : on restaure son instance
Supprimer définitivement un clientDemande un balayage de toutes les tables, à outillerTrivial : on détruit l’instance
Migrer le schéma de donnéesUne seule migrationAutant de migrations que de clients
Isoler physiquement un client exigeantImpossible sans sortir du modèleNatif

Les deux premières lignes sont celles qu’on découvre trop tard. Restaurer un seul client sans toucher aux autres est une demande qui arrive toujours, et elle s’outille : des exports par client, programmés, et une procédure de réinjection. Quelques jours de travail, à prévoir au cadrage plutôt qu’en urgence.

La suppression définitive n’est pas qu’une question technique : c’est une obligation. Un client qui s’en va peut demander l’effacement de ses données, et le RGPD impose de pouvoir le faire. Une architecture où personne ne sait lister toutes les tables contenant des données d’un client est une architecture non conforme. Voir aussi la liste à vérifier avant mise en ligne.

Comment choisir, en trois questions

QuestionSi ouiSi non
Un client vous impose-t-il contractuellement une infrastructure dédiée ?Instance pour celui-là, base partagée pour les autresContinuez
Visez-vous plus de vingt clients à trois ans ?Base partagée, sans hésiterContinuez
Vos clients ont-ils des volumes de données très inégaux ?Base partagée, avec un découpage prévu pour les plus grosBase partagée

Dans presque tous les cas, la réponse est la base partagée. Le modèle hybride, base partagée pour la majorité et instance dédiée pour les deux ou trois clients qui la paient, est la configuration que nous rencontrons le plus souvent sur les produits matures. Elle n’a de sens que si elle a été prévue dès le départ, parce qu’elle suppose que le code fonctionne dans les deux situations.

Questions fréquentes

Peut-on changer de modèle plus tard ?

Oui, et cela coûte entre 15 et 40 jours selon la taille de l’application, parce que le changement touche chaque accès aux données. Le sens le plus coûteux est de passer d’instances séparées à une base partagée : il faut fusionner des données qui ont dérivé, avec des identifiants qui se télescopent. L’inverse est plus simple, et c’est une raison de plus de commencer partagé.

La base partagée est-elle moins sûre ?

Elle l’est si l’étanchéité repose sur la discipline des développeurs. Elle ne l’est pas si le filtrage est appliqué par la base elle-même et vérifié par un test automatisé à chaque livraison. La question n’est pas le modèle, c’est le niveau auquel la garantie est posée.

Que répondre à un client qui exige « sa » base de données ?

D’abord comprendre ce qu’il protège : c’est presque toujours une exigence de conformité ou de localisation, pas une préférence technique. Ensuite proposer une réponse à son besoin réel, chiffrement dédié, localisation garantie, ou instance dédiée facturée en option. Accepter d’emblée une instance par client pour un seul demandeur, c’est transformer son exigence en architecture pour tout le monde.

Et pour les sauvegardes ?

Avec une base partagée, la sauvegarde est globale : rapide, simple, peu coûteuse. Ce qui demande du travail, c’est la restauration partielle. On la prépare avec des exports par client programmés, qui servent aussi à la réversibilité et à la suppression définitive. Trois usages pour un seul outillage.

À partir de combien de clients le modèle compte-t-il vraiment ?

La bascule se sent vers cinq ou six clients pour le déploiement, et vers vingt pour le coût. En dessous, tous les modèles fonctionnent, ce qui explique que beaucoup de produits démarrent sur une architecture qui ne tiendra pas. Le choix doit être fait pour l’année trois, pas pour le premier client.

Le schéma par client est-il un bon compromis ?

C’est un compromis réel, avec un plafond. Il offre une isolation plus lisible qu’une base partagée et évite la multiplication des instances. En revanche chaque migration de schéma se répète pour chaque client, et au-delà de quelques centaines, les outils eux-mêmes commencent à peiner. C’est un bon choix pour un produit qui vise des dizaines de clients, pas des milliers.

Glossaire

  • Multi-tenant : une seule application sert plusieurs entreprises clientes, dont les données restent étanches. C’est la définition technique d’un SaaS.
  • Locataire : une entreprise cliente du produit, avec ses utilisateurs et ses données. À ne pas confondre avec un utilisateur.
  • Filtrage au niveau des lignes : règle appliquée par la base de données elle-même, qui limite les lignes visibles selon le locataire de la session.
  • Migration de schéma : modification de la structure de la base. Elle se joue une fois en base partagée, autant de fois qu’il y a de clients en instances séparées.
  • Modèle hybride : base partagée pour la majorité des clients, instance dédiée pour ceux qui l’exigent et la paient.

Sources

À lire aussi sur le blog

Aller plus loin avec nous