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. 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.
user_1 et user_2.
user_1 et user_2 pour qu’ils n’accèdent qu’aux données de leurs tenants respectifs.
GRANT SELECT sur la table partagée via un rôle commun.
user_1 et exécuter une simple requête SELECT. Seules les lignes du premier tenant sont renvoyées.
Tables séparées
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. 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.
user_1 et user_2.
GRANT SELECT sur la table correspondante.
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
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. 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.
user_1 et user_2.
GRANT SELECT sur la table correspondante.
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
Service cloud séparé
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. 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
user_1
GRANT SELECT sur la table correspondante.
user_1 au service du tenant 1 et exécuter une simple requête SELECT. Seules les lignes du premier tenant sont renvoyées.