Passer au contenu principal
Sur une plateforme SaaS d’analyse de données, il est courant que plusieurs tenants, tels que des organisations, des clients ou des unités opérationnelles, partagent la même infrastructure de base de données tout en conservant une séparation logique de leurs données. Cela permet à différents utilisateurs d’accéder en toute sécurité à leurs propres données sur la même plateforme. Selon les besoins, il existe différentes façons de mettre en œuvre la multi-tenance. Vous trouverez ci-dessous un guide expliquant comment les mettre en œuvre avec ClickHouse Cloud.

Table partagée

Dans cette approche, les données de tous les tenants sont stockées dans une seule table partagée, avec un champ (ou un ensemble de champs) servant à identifier les données de chaque tenant. Pour maximiser les performances, ce champ doit être inclus dans la clé primaire. Pour garantir que vous ne puissiez accéder qu’aux données de vos tenants respectifs, nous utilisons le contrôle d’accès basé sur les rôles, mis en œuvre au moyen de politiques de lignes.
Nous recommandons cette approche car c’est la plus simple à gérer, en particulier lorsque tous les tenants partagent le même schéma de données et que les volumes de données restent modérés (< TBs)
En consolidant toutes les données des tenants dans une seule table, l’efficacité du stockage est améliorée grâce à une meilleure compression des données et à une réduction de la surcharge liée aux métadonnées. De plus, les mises à jour du schéma sont simplifiées puisque toutes les données sont gérées de façon centralisée. Cette méthode est particulièrement efficace pour gérer un grand nombre de tenants (potentiellement des millions). Cependant, d’autres approches peuvent être plus adaptées si les tenants ont des schémas de données différents ou sont susceptibles de diverger au fil du temps. Lorsqu’il existe un écart important de volume de données entre les tenants, les plus petits peuvent subir une dégradation inutile des performances des requêtes. Notez que ce problème est largement atténué en incluant le champ tenant dans la clé primaire.

Exemple

Voici un exemple d’implémentation d’un modèle de multi-tenance avec table partagée. Commençons par créer une table partagée avec un champ tenant_id inclus dans la clé primaire.
Insérons des données fictives.
Créons ensuite deux utilisateurs, user_1 et user_2.
Nous créons des politiques de lignes qui limitent user_1 et user_2 pour qu’ils n’accèdent qu’aux données de leurs tenants respectifs.
Accordez ensuite les privilèges GRANT SELECT sur la table partagée via un rôle commun.
Vous pouvez maintenant vous connecter en tant que user_1 et exécuter une simple requête SELECT. Seules les lignes du premier tenant sont renvoyées.

Tables séparées

Dans cette approche, les données de chaque tenant sont stockées dans une table distincte au sein de la même base de données, ce qui évite d’avoir à utiliser un champ spécifique pour identifier les tenants. L’accès des utilisateurs est contrôlé à l’aide d’une instruction GRANT, de sorte que chaque utilisateur ne puisse accéder qu’aux tables contenant les données de ses tenants.
L’utilisation de tables séparées est un bon choix lorsque les tenants ont des schémas de données différents.
Pour les scénarios impliquant un petit nombre de tenants avec de très grands jeux de données, où les performances des requêtes sont essentielles, cette approche peut être plus performante qu’un modèle à table partagée. Comme il n’est pas nécessaire de filtrer les données des autres tenants, les requêtes peuvent être plus efficaces. De plus, les clés primaires peuvent être davantage optimisées, puisqu’il n’est pas nécessaire d’inclure un champ supplémentaire (tel qu’un ID de tenant) dans la clé primaire. Notez que cette approche ne passe pas à l’échelle pour des milliers de tenants. Voir les limites d’utilisation.

Exemple

Voici un exemple d’implémentation d’un modèle de multi-tenancy à tables séparées. Commençons par créer deux tables : une pour les événements du tenant_1 et une pour les événements du tenant_2.
Insérons des données fictives.
Créons ensuite deux utilisateurs user_1 et user_2.
Accordez ensuite les privilèges GRANT SELECT sur la table correspondante.
Vous pouvez maintenant vous connecter en tant que user_1 et exécuter une simple sélection depuis la table correspondant à cet utilisateur. Seules les lignes du premier tenant sont renvoyées.

Bases de données séparées

Les données de chaque tenant sont stockées dans une base de données distincte au sein du même service ClickHouse.
Cette approche est utile si chaque tenant a besoin d’un grand nombre de tables et éventuellement de vues matérialisées, et dispose d’un schéma de données différent. Cependant, elle peut devenir difficile à gérer si le nombre de tenants est élevé.
L’implémentation est similaire à l’approche des tables séparées, mais au lieu d’accorder des privilèges au niveau de la table, les privilèges sont accordés au niveau de la base de données. Notez que cette approche ne passe pas à l’échelle pour des milliers de tenants. Consultez les limites d’utilisation.

Exemple

Voici un exemple d’implémentation d’un modèle de multi-tenance à bases de données séparées. Commençons par créer deux bases de données, une pour tenant_1 et une pour tenant_2.
Insérons des données fictives.
Créons maintenant deux utilisateurs : user_1 et user_2.
Ensuite, accordez les privilèges GRANT SELECT sur la table correspondante.
Vous pouvez maintenant vous connecter en tant que user_1 et exécuter une requête SELECT simple sur la table events de la base de données appropriée. Seules les lignes du premier tenant sont renvoyées.

Compute-compute separation

Les trois approches décrites ci-dessus peuvent également être davantage isolées en utilisant les Warehouses. Les données sont partagées via un stockage objet commun, mais chaque tenant peut disposer de son propre service de compute grâce à la compute-compute separation, avec un ratio CPU/mémoire différent. La gestion des utilisateurs est similaire aux approches décrites précédemment, puisque tous les services d’un warehouse partagent les mêmes contrôles d’accès. Notez que le nombre de services enfants dans un warehouse est limité. Voir les limitations des warehouses.

Service cloud séparé

L’approche la plus radicale consiste à utiliser un service ClickHouse distinct pour chaque tenant.
Cette méthode, moins courante, peut être une solution si les données des tenants doivent être stockées dans différentes régions, pour des raisons juridiques, de sécurité ou de proximité.
Un compte utilisateur doit être créé sur chaque service afin que l’utilisateur puisse accéder aux données de son tenant. Cette approche est plus difficile à gérer et entraîne un surcoût pour chaque service, car chacun nécessite sa propre infrastructure pour fonctionner. Les services peuvent être gérés via l’API ClickHouse Cloud, et l’orchestration est également possible via le provider Terraform officiel.

Exemple

Voici un exemple de mise en œuvre d’un modèle de multi-tenance avec des services distincts. Notez que cet exemple montre la création de tables et d’utilisateurs sur un service ClickHouse ; il faudra reproduire la même configuration sur tous les services. Commençons par créer la table events
Insérons des données factices.
Créons ensuite deux utilisateurs user_1
Accordez ensuite le privilège GRANT SELECT sur la table correspondante.
Vous pouvez maintenant vous connecter en tant que user_1 au service du tenant 1 et exécuter une simple requête SELECT. Seules les lignes du premier tenant sont renvoyées.
Dernière modification le 1 juillet 2026