Implementazione della multi-tenancy in Cloud Spanner

In questo documento vengono descritti vari modi per implementare la multi-tenancy in Cloud Spanner. Illustra anche i pattern di gestione dei dati e la gestione del ciclo di vita dei tenant.

Multi-tenant è quando una o alcune istanze di un'applicazione software servono più tenant o clienti. Questo pattern software può scalare da un singolo tenant o cliente a centinaia o migliaia. Questo approccio è fondamentale per le piattaforme di cloud computing in cui l'infrastruttura sottostante è condivisa tra più organizzazioni.

Pensare alla multi-tenancy come a una forma di partizionamento basata su risorse di calcolo condivise, come i database. Un'analogia è il tenant in un condominio: infrastruttura condivisa, ma spazio tenant dedicato. La multi-tenancy fa parte della maggior parte delle applicazioni Software-as-a-Service (SaaS), se non tutte.

Questo documento è destinato agli architetti di database, data engineer e a tecnici che implementano applicazioni multi-tenant in Spanner come database relazionale. In questo contesto, delinea vari approcci per archiviare i dati multi-tenant. I termini "tenant" e "cliente" e "organizzazione" vengono utilizzati in modo intercambiabile nell'intero articolo per indicare l'entità che accede all'applicazione multi-tenant.

Questo articolo utilizza un provider SaaS delle risorse umane (HR) che implementa la sua applicazione multi-tenant su Google Cloud come esempio. Nell'esempio, diversi clienti del provider HR SaaS devono accedere all'applicazione multi-tenant. Questi clienti vengono chiamati tenant.

SPANer è il database completamente gestito, di livello aziendale, distribuito e coerente di Google Cloud, che combina i vantaggi del modello di database relazionale con la scalabilità orizzontale non relazionale. Spanner ha una semantica relazionale con schemi, tipi di dati applicati, elevata coerenza, transazioni ACID con più dichiarazioni e un linguaggio di query SQL che implementa ANSI 2011 SQL.

Spanner offre un tempo di inattività zero per la manutenzione pianificata o guasti regionali, con uno SLA di disponibilità del 99,999%. Supporta applicazioni moderne e multi-tenant offrendo disponibilità elevata e scalabilità. Questo articolo illustra i diversi approcci all'architettura per implementare la multi-tenancy con Spanner.

Criteri per la mappatura dei dati del tenant

In un'applicazione multi-tenant, i dati di ogni tenant sono isolati in uno dei vari approcci di architettura nel database Spanner sottostante. Il seguente elenco illustra i diversi approcci di architettura utilizzati per mappare i dati di un tenant a Spanner:

  • Istanza: un tenant si trova esclusivamente in un'istanza Spanner, con esattamente un database per quel tenant.
  • Database: un tenant si trova in un database in un'unica istanza Spanner che contiene più database.
  • Schema: un tenant si trova in tabelle esclusive all'interno di un database, mentre diversi tenant possono trovarsi nello stesso database.
  • Tabella: i dati tenant sono righe nelle tabelle di database. Le tabelle sono condivise con altri tenant.

I criteri precedenti sono chiamati pattern di gestione dei dati e sono illustrati in dettaglio nella sezione Pattern di gestione dei dati multi-tenancy. Tale discussione si basa sui seguenti criteri:

  • Isolamento: il grado di isolamento dei dati tra più tenant è un fattore determinante per la multi-tenancy. L'isolamento è determinato dalle scelte effettuate per i criteri in altre categorie, ad esempio determinati requisiti normativi e di conformità possono stabilire un grado di isolamento più elevato.
  • Agilità: la facilità di onboarding e di onboarding di un tenant in relazione alla creazione di un'istanza, un database o una tabella.
  • Operazioni: la disponibilità o la complessità dell'implementazione di attività gestionali e di amministrazione tipiche specifiche del tenant, ad esempio manutenzione regolare, logging, backup o operazioni di ripristino di emergenza.
  • Scalabilità: la capacità di scalare senza interruzioni per consentire una crescita futura. La descrizione di ogni pattern contiene il numero di tenant che può essere supportato dal pattern.
  • Prestazioni: la capacità di allocare risorse esclusive a ogni tenant, risolvere il fenomeno del vicino rumoroso nelle vicinanze e abilitare prestazioni prevedibili di lettura e scrittura per ogni tenant.
  • Normative e conformità: la possibilità di soddisfare i requisiti di settori e paesi altamente regolamentati che richiedono l'isolamento completo delle risorse e le operazioni di manutenzione, ad esempio i requisiti per la residenza dei dati per la Francia, richiedono che le informazioni personali siano archiviate esclusivamente in Francia.

Ogni modello di gestione dei dati in relazione a questi criteri è descritto in dettaglio nella sezione successiva. Utilizza gli stessi criteri quando selezioni un pattern di gestione dei dati per un insieme specifico di tenant.

Pattern di gestione dei dati multi-tenancy

Le seguenti sezioni descrivono i quattro principali pattern di gestione dei dati: istanza, database, schema e tabella.

Istanza

Per fornire l'isolamento completo, il pattern di gestione dei dati dell'istanza archivia i dati di ogni tenant in una propria istanza e database di Spanner. Un'istanza di Spanner può avere uno o più database. In questo pattern viene creato un solo database. Per l'applicazione HR descritta in precedenza, viene creata un'istanza Separatore con un database per ogni organizzazione del cliente.

Come mostrato nel diagramma seguente, il pattern di gestione dei dati ha un tenant per istanza.

Il modello di gestione dei dati dell'istanza ospita un singolo tenant per istanza.

Avere istanze distinte per ogni tenant consente l'utilizzo di progetti Google Cloud separati per raggiungere limiti di attendibilità separati per i diversi tenant. Un vantaggio aggiuntivo è che la configurazione di ogni istanza può essere scelta in base alla località di ogni tenant (a livello di area geografica o a livello di più aree geografiche), ottimizzando la flessibilità e le prestazioni della località.

L'architettura è facilmente scalabile in qualsiasi numero di tenant. I provider di servizi SaaS possono creare qualsiasi numero di istanze nelle aree geografiche desiderate, senza limiti rigidi.

La tabella seguente illustra in che modo il pattern di gestione dei dati dell'istanza influisce su criteri diversi.

Criteri Istanza: un tenant per pattern di gestione dei dati per istanza
Isolamento
  • Massimo livello di isolamento
  • Nessuna risorsa di database condivisa
Agilità
  • L'onboarding e l'offboarding richiedono una configurazione o un ritiro considerevoli per:
    • L'istanza di Spanner
    • Sicurezza specifica dell'istanza
    • Connettività specifica per l'istanza
  • L'onboarding e l'onboarding possono essere automatizzati tramite Infrastructure as Code (IaC)
Suite operativa
  • Backup indipendenti per ogni tenant
  • Pianificazioni di backup separate e flessibili
  • Overhead operativo più elevato
    • Numero elevato di istanze da gestire e da gestire (scalabilità, monitoraggio, logging e ottimizzazione delle prestazioni)
Scalabilità
  • Database a scalabilità elevata
  • Crescita illimitata aggiungendo nodi
  • Numero illimitato di inquilini
  • Istanza di Spanner disponibile per ogni tenant
Prestazioni
  • Ogni tenant in un'istanza separata
  • Nessuna menzione delle risorse
  • Perfezionamento delle prestazioni e risoluzione dei problemi su misura per ogni tenant
Requisiti normativi e di conformità
  • Archiviare i dati in un'area geografica specifica
  • Implementa processi di sicurezza, backup o controllo specifici, in base alle esigenze di aziende o governi

In breve, i concetti chiave sono:

  • Vantaggio: il massimo livello di isolamento
  • Svantaggio: sovraccarico operativo massimo

Il pattern di gestione dei dati dell'istanza è più adatto per i seguenti scenari:

  • Diversi inquilini sono distribuiti in una vasta gamma di aree geografiche e hanno bisogno di una soluzione localizzata.
  • I requisiti normativi e di conformità per alcuni tenant richiedono livelli più elevati di protocolli di sicurezza e di controllo.
  • Le dimensioni dei tenant variano notevolmente, in modo tale che la condivisione delle risorse tra tenant ad alto volume e traffico elevato potrebbe causare contese e deterioramento reciproco.

Database

Nel pattern di gestione dei dati del database, ogni tenant si trova in un database all'interno di una singola istanza Spanner. Più database possono risiedere in una singola istanza. Se un'istanza è insufficiente per il numero di tenant, crea più istanze. Questo pattern presuppone che una singola istanza di Spanner sia condivisa tra più tenant.

Spanner ha un limite fisso di 100 database per istanza. Questo limite significa che, se il provider SaaS deve scalare oltre 100 clienti, deve creare e utilizzare più istanze Spanner.

Per l'applicazione HR, il provider SaaS crea e gestisce ogni tenant con un database separato in un'istanza Spanner.

Come mostrato nel diagramma seguente, il pattern di gestione dei dati ha un tenant per database.

Il pattern di gestione dei dati del database ospita un tenant per database.

Il pattern di gestione dei dati del database raggiunge un isolamento logico a livello di database per dati diversi di tenant. Tuttavia, poiché si tratta di una singola istanza di Spanner, tutti i database tenant condividono la stessa configurazione a livello di area geografica e la configurazione di calcolo e archiviazione sottostante.

La tabella seguente illustra in che modo il pattern di gestione dei dati del database influisce su criteri diversi.

Criteri Database: un tenant per pattern di gestione dei dati del database
Isolamento
  • Completare l'isolamento logico a livello di database
  • Risorse dell'infrastruttura sottostante condivise
Agilità
  • Richiede uno sforzo per creare o eliminare il database ed eventuali controlli di sicurezza specifici
  • L'automazione per le operazioni preliminari e offboarding avviene tramite IaC
Suite operativa
  • Backup indipendenti per ogni tenant
  • Programmazione flessibile
  • Overhead operativo inferiore al modello di istanza
    • Un'istanza per monitorare fino a 100 database
Scalabilità
  • Database a scalabilità elevata
  • Istanze illimitate
  • Consente migliaia di nodi
  • Limite di 100 database per istanza
    • Per ogni 100 tenant, crea una nuova istanza di Spanner
Prestazioni
  • Contestazione delle risorse tra più database
    • Database distribuiti tra i nodi delle istanze Spanner
    • I database condividono l'infrastruttura
  • I vicini rumorosi influiscono sulle prestazioni
Requisiti normativi e di conformità
  • L'area geografica della località deve corrispondere all'area geografica dell'istanza per soddisfare eventuali requisiti normativi specifici per la residenza dei dati

In breve, i concetti chiave sono:

  • Vantaggio: livello di isolamento più elevato
  • Contro: numero limitato di tenant per istanza; flessibilità di località

Il pattern di gestione dei dati del database è più adatto per i seguenti scenari:

  • Più clienti risiedono nella stessa residenza dei dati, ad esempio in Francia o nel Regno Unito, e/o sono sotto la stessa autorità di regolamentazione.
  • I tenant richiedono la separazione dei dati basata sul sistema e il backup/ripristino, ma sono compatibili con la condivisione delle risorse dell'infrastruttura.

Schema

Nel pattern di gestione dei dati dello schema, per più tenant viene utilizzato un singolo database, che implementa uno schema singolo, e un set di tabelle separato per ogni dato del tenant. Puoi distinguere queste tabelle includendo tenant ID nei nomi delle tabelle come prefisso o suffisso.

Questo pattern di gestione dei dati dell'utilizzo di un set separato di tabelle per ogni tenant fornisce un livello di isolamento molto più basso rispetto alle opzioni precedenti (i pattern di gestione di istanze e database). Il pattern semplifica anche le operazioni preliminari, prevede la creazione di nuove tabelle e l'integrità referenziale e gli indici associati.

Un'importante avvertenza è che le autorizzazioni di accesso per Spanner mediante Identity and Access Management (IAM) vengono fornite solo a livello di istanza o di database. Non è possibile fornire autorizzazioni di accesso a livello di tabella. Esiste anche un limite di 5000 tabelle per database. Per molti clienti questo limite limita l'utilizzo dell'applicazione.

Inoltre, l'uso di tabelle separate per ogni cliente può comportare un elevato backlog di operazioni di aggiornamento dello schema. Un backlog così lungo richiede un lungo tempo di risoluzione.

Per l'applicazione HR, il provider SaaS può creare un set di tabelle per ogni cliente con tenant ID come prefisso nei nomi delle tabelle, ad esempio customer1_employee, customer1_payroll, customer1_department.

Come mostrato nel diagramma seguente, il pattern di gestione dei dati dello schema ha un set di tabelle per ogni tenant.

Il pattern di gestione dei dati dello schema ha un set di tabelle per ogni tenant.

La tabella seguente illustra in che modo il pattern di gestione dei dati dello schema influisce sui diversi criteri.

Criteri Schema: un set di tabelle per ogni pattern di gestione dei dati in tenant
Isolamento
  • Livello di isolamento basso
  • Nessuna sicurezza a livello di tabella
Agilità
  • Accogliere un cliente è banale
    • Creazione nuove tabelle
    • Crea chiavi e indici associati
  • L'offboarding di un cliente comporta l'eliminazione delle tabelle
    • Può avere un impatto temporaneo e negativo sulle prestazioni di altri tenant all'interno del database
Suite operativa
  • Nessuna operazione separata per i tenant
  • Backup, monitoraggio e logging devono essere implementati come funzioni applicative separate o come script di utilità
Scalabilità
  • Migliaia di nodi
  • Crescita illimitato del tenant
  • Un singolo database può avere solo 5000 tabelle
    • Solo numeri minimi (5000/<numero per tenant>) in ogni database
    • Quando il database supera le 5000 tabelle, aggiungi un nuovo database per i tenant aggiuntivi
Prestazioni
  • È possibile un livello elevato di conflitto di risorse
  • Assicurati un buon rendimento progettando separatamente gli indici per ogni set di tabelle
Requisiti normativi e di conformità
  • L'area geografica deve corrispondere per soddisfare i requisiti normativi specifici per la residenza dei dati
  • L'implementazione di controlli di sicurezza e controllo specifici interessa tutti i tenant che risiedono nello stesso database

In breve, i concetti chiave sono:

  • Vantaggio: l'onboarding è banale
  • Svantaggio: sovraccarico operativo maggiore, nessun controllo di sicurezza a livello di tabella

Il pattern di gestione dei dati dello schema è più adatto per i seguenti scenari:

  • Applicazioni interne adatte a diversi reparti in cui il rigoroso isolamento della sicurezza dei dati non è un problema rilevante rispetto alla facilità di manutenzione.
  • Applicazioni multi-tenant in cui i dati non richiedono una rigida separazione in base a requisiti legali o normativi.

Sebbene sia possibile creare più set di tabelle (ogni set che rappresenta un tenant) in un database, è il pattern meno ideale dal punto di vista del database. Il motivo principale è che le tabelle devono seguire le convenzioni di denominazione. L'applicazione e gli strumenti di database (ad esempio gli IDE e gli strumenti di migrazione dello schema) devono comprendere la convenzione di denominazione. Inoltre, se il numero di tabelle è abbastanza grande per tenant, il pattern di gestione dei dati dello schema non fornisce scalabilità significativa.

Un approccio migliore consiste nel passare a un database per tenant e aumentare il numero di istanze, oppure passare al pattern di gestione dei dati della tabella.

Tabella

Il pattern finale di gestione dei dati gestisce più tenant con un set comune di tabelle. Ogni tabella contiene i dati di diversi tenant. Questo pattern di gestione dei dati rappresenta un livello estremo di multi-tenancy, in cui tutto, dall'infrastruttura allo schema al modello dei dati, viene condiviso tra più tenant. All'interno di una tabella, le righe sono partizionate in base alle chiavi primarie, con tenant ID come primo elemento della chiave. Per quanto riguarda la scalabilità, Spanner supporta meglio questo pattern perché è in grado di scalare le tabelle senza limitazioni.

Per l'applicazione HR, la chiave primaria della tabella dei libri paga può essere una combinazione di customerID e payrollID.

Come mostrato nel diagramma seguente, il pattern di gestione dei dati della tabella ha una tabella per diversi tenant.

Il pattern di gestione dei dati della tabella utilizza una tabella per diversi tenant.

Analogamente al pattern schema, l'accesso ai dati nel pattern della tabella non può essere controllato separatamente per tenant diversi. Se utilizzi meno tabelle, le operazioni di aggiornamento dello schema vengono completate più velocemente quando ogni tenant ha le proprie tabelle di database. In larga misura, questo approccio semplifica le operazioni preliminari, offboarding e operazioni.

La tabella seguente illustra in che modo il pattern di gestione dei dati della tabella influisce su criteri diversi.

Criteri Tabella: una tabella per lo schema di gestione dei dati di più tenant
Isolamento
  • Livello di isolamento più basso
  • Nessun livello di sicurezza del tenant
Agilità
  • Nessuna configurazione richiesta sul database durante l'onboarding
    • L'applicazione può scrivere direttamente i dati nelle tabelle esistenti
  • Offboarding significa eliminare le righe del cliente nella tabella
Suite operativa
  • Nessuna operazione separata per i tenant, inclusi backup, monitoraggio e logging
  • Poco o nessun overhead, con l'aumento del numero di inquilini
Scalabilità
  • Scalabilità in migliaia di nodi
  • Può gestire qualsiasi livello di crescita degli inquilini
  • Supporta un numero illimitato di tenant
Prestazioni
  • Pattern funziona bene nel contesto di Spanner
  • L'archiviazione distribuita interna, l'elaborazione e il bilanciamento del carico possono facilmente funzionare con questo pattern
  • Se gli spazi della chiave primaria non sono progettati con attenzione, è possibile un elevato livello di conflitto di risorse (vicino al rumore).
    • Può impedire la contemporaneità e la distribuzione
  • Seguire le best practice è importante
  • L'eliminazione dei dati di un tenant può avere un impatto temporaneo sul carico
Requisiti normativi e di conformità
  • La località deve corrispondere a eventuali requisiti normativi specifici per la residenza dei dati
  • Il pattern non può fornire il partizionamento a livello di sistema (rispetto all'istanza o al pattern del database).
  • L'implementazione di controlli di sicurezza e controllo specifici influisce su tutti i tenant

In breve, i concetti chiave sono:

  • Vantaggio: scalabilità elevata; costi operativi ridotti
  • Svantaggio: livello elevato di risorse, mancanza di controlli di sicurezza per ogni tenant

Questo pattern è più adatto per i seguenti scenari:

  • Applicazioni interne destinate a reparti diversi, in cui la massima isolamento dei dati non è di per sé importante rispetto alla facilità di manutenzione.
  • Condivisione massima delle risorse per i tenant che utilizzano la funzionalità dell'applicazione di livello gratuito riducendo contemporaneamente il provisioning delle risorse.

Pattern di gestione dei dati e gestione del ciclo di vita dei tenant

La tabella seguente mette a confronto i vari modelli di gestione dei dati di tutti i criteri a un livello generale.

Istanza Database Schema Tabella
Isolamento Completata Completata Basse Più bassa
Agilità Basse Moderata Moderata Posizione più alta
Facilità operative Alte Alte Basse Basse
Scala Alte Limitata Potenzialmente molto limitato Alte
Prestazioni* Alte Moderata Moderata Potenzialmente alto
Norme e conformità Posizione più alta Alte Basse Basse

* Le prestazioni dipendono fortemente dalla progettazione dello schema e dalle best practice per le query. I valori riportati sono solo un'aspettativa media.

I pattern di gestione dei dati migliori per un'applicazione multi-tenant specifica sono quelli che soddisfano la maggior parte dei suoi requisiti in base ai criteri. Se non è richiesto un criterio particolare, puoi ignorare la riga in cui è inserito.

Pattern di gestione dei dati combinati

Spesso, è sufficiente un singolo pattern di gestione dei dati per soddisfare i requisiti di un'applicazione multi-tenant. In questo caso, la progettazione può assumere un singolo pattern di gestione dei dati.

Alcune applicazioni multi-tenant richiedono, invece, diversi pattern di gestione dei dati contemporaneamente, ad esempio un'applicazione multi-tenant che supporta un livello gratuito, un livello normale e un livello aziendale.

  • Livello gratuito:

    • Deve essere conveniente
    • Deve avere un limite superiore per il volume di dati
    • Di solito supporta funzionalità limitate
    • Il modello di gestione dei dati della tabella è un buon candidato di livello gratuito
      • La gestione dell'inquilino è semplice
      • Non è necessario creare risorse tenant specifiche o esclusive
  • Livello normale:

    • Utile per i clienti paganti che non hanno requisiti di scalabilità o isolamento specifici
    • Il pattern di gestione dei dati dello schema o il pattern di gestione dei dati del database è un buon candidato di livello regolare
      • Tabelle e indici sono esclusivi per il tenant
      • Il backup è facile nel pattern di gestione dei dati del database
      • Il backup non è supportato per il pattern di gestione dei dati dello schema
        • Il backup del tenant deve essere implementato come utilità al di fuori di Spanner
  • Livello Enterprise:

    • Solitamente un livello esclusivo con completa autonomia sotto tutti gli aspetti
    • Lo tenant ha risorse dedicate che includono scalabilità dedicata e isolamento completo
    • Il pattern di gestione dei dati dell'istanza è adatto al livello aziendale

Una best practice consiste nel mantenere pattern di gestione dei dati diversi in database diversi. Sebbene sia possibile combinare diversi modelli di gestione dei dati in un database Spanner, rendendo difficile l'implementazione della logica di accesso e delle operazioni del ciclo di vita dell'applicazione.

La sezione Progettazione applicazione illustra alcune considerazioni sulla progettazione di applicazioni multi-tenant che si applicano quando si utilizza un singolo pattern di gestione dei dati o più pattern di gestione dei dati.

Gestisci il ciclo di vita del tenant

Gli inquilini hanno un ciclo di vita. Di conseguenza, devi implementare le operazioni di gestione corrispondenti all'interno dell'applicazione multi-tenant. Oltre alle operazioni di base per la creazione, l'aggiornamento e l'eliminazione dei tenant, prendi in considerazione le seguenti operazioni aggiuntive relative ai dati:

  • Esporta i dati del tenant:

    • Quando elimini un tenant, è buona norma esportare prima i dati e rendere disponibile il set di dati.
    • Quando utilizzi il pattern di gestione dei dati della tabella o dello schema, il sistema multi-tenant deve implementare l'esportazione o mapparlo alla funzionalità di database (esportazione del database).
  • Backup dei dati del tenant:

    • Quando utilizzi i pattern di gestione dei dati dell'istanza o del database e il backup dei dati per i singoli tenant, utilizza le funzioni di esportazione o backup del database.
    • Quando utilizzi il pattern di gestione dei dati di schema o tabella e il backup dei dati per singoli tenant, l'applicazione multi-tenant deve implementare questa operazione. Il database di Spanner non può determinare quali dati appartengono a quale tenant.
  • Sposta dati tenant:

    • Lo spostamento di un tenant da un pattern di gestione dei dati a un altro (o lo spostamento di un tenant all'interno dello stesso pattern di gestione dei dati tra istanze o database) richiede l'estrazione dei dati dal pattern di gestione dei dati della tabella e l'inserimento di tali dati nel pattern di gestione dei dati del database.

    • La mitigazione di una situazione di rumore nelle vicinanze è un altro motivo per spostare gli inquilini.

Progettazione di applicazioni

Quando progetti un'applicazione multi-tenant, implementa la logica di business sensibile al tenant. Ciò significa che ogni volta che l'applicazione esegue la logica di business, deve sempre essere nel contesto di un tenant noto.

Dal punto di vista del database, la progettazione di applicazioni significa che ogni query deve essere eseguita in base al pattern di gestione dei dati in cui risiede il tenant. Le seguenti sezioni evidenziano alcuni dei concetti principali della progettazione di applicazioni multi-tenant.

Connessione dinamica tenant e configurazione delle query

Per la mappatura dinamica dei dati tenant alle richieste di applicazioni tenant, viene utilizzata una configurazione di mappatura:

  • Per i pattern di gestione dei dati del database o i pattern di gestione dei dati delle istanze, una stringa di connessione è sufficiente per accedere ai dati di un tenant.
  • Per i pattern di gestione dei dati degli schemi, è necessario determinare i nomi delle tabelle corretti.
  • Per i pattern di gestione dei dati della tabella, le query devono essere eseguite sul database. Utilizza i predicati appropriati per recuperare i dati di un tenant specifico.

Un tenant può risiedere in uno qualsiasi dei quattro pattern di gestione dei dati. La seguente implementazione della mappatura risolve una configurazione di connessione per il caso generico di un'applicazione multi-tenant che utilizza contemporaneamente tutti i pattern di gestione dei dati. Quando un determinato tenant risiede in un pattern, alcune applicazioni multi-tenant utilizzano un pattern di gestione dati per tutti i tenant. Questa richiesta viene coperta implicitamente dalla seguente mappatura.

Se un tenant esegue la logica di business (ad esempio, un dipendente che accede con il proprio ID tenant), la logica dell'applicazione deve determinare il pattern di gestione dei dati del tenant, la posizione dei dati per un determinato ID tenant e, facoltativamente, la convenzione di denominazione della tabella (per il pattern schema).

Questa logica dell'applicazione richiede la mappatura dei pattern da tenant a gestione dei dati. Nel seguente esempio di codice, connection string fa riferimento al database in cui si trovano i dati del tenant. L'esempio identifica l'istanza di Spanner e il database. Per l'istanza e il database per lo schema di gestione dei dati, il seguente codice è sufficiente per consentire all'applicazione di connettersi ed eseguire query:

tenant id -> (data management pattern,
             database connection string,
             [table_prefix])

Per gli schemi di gestione dei dati di schema e tabella è richiesta una progettazione aggiuntiva.

Pattern di gestione dei dati dello schema

Per lo schema di gestione dei dati dello schema, esistono diversi tenant nello stesso database. Ogni tenant ha il proprio set di tabelle. Le tabelle sono distinte dal nome. Quale tabella appartiene a quale tenant è deterministico.

Un approccio consiste nell'anteporre i nomi delle tabelle con l'ID tenant, ad esempio la tabella EMPLOYEE è chiamata T356_EMPLOYEE per il tenant con ID 356. L'applicazione deve anteporre a ogni tabella il prefisso Ttenant ID prima di inviare la query al database restituito.

Un altro approccio è anteporre un table_prefix alla mappatura utilizzata dalla query in modo che trovi le tabelle corrette per un tenant.

È possibile anche utilizzare un approccio misto: se il pattern di gestione dei dati è il pattern dello schema e il prefisso della tabella è vuoto, viene applicata la mappatura predefinita (anteponi i nomi delle tabelle con ID tenant).

Pattern di gestione dei dati della tabella

Un pattern simile è obbligatorio per il pattern di gestione dei dati della tabella. In questo motivo, c'è un unico schema. I dati degli inquilini vengono archiviati come righe. Per accedere correttamente ai dati, aggiungi un predicato a ogni query per selezionare il tenant appropriato.

Un approccio per trovare il tenant appropriato è quello di avere una colonna chiamata TENANT in ogni tabella. Il valore della colonna è tenant ID. Ogni query deve aggiungere un predicato AND TENANT = tenant ID a una clausola WHERE esistente o aggiungere una clausola WHERE con il predicato AND TENANT = tenant ID.

Per connettersi al database e creare le query appropriate, l'identificatore tenant deve essere disponibile nella logica dell'applicazione. Può essere trasmessa come parametro o archiviata come contesto del thread.

Alcune operazioni del ciclo di vita richiedono la modifica della configurazione della mappatura "tenant-to-data-management-pattern", ad esempio quando si sposta un tenant tra i pattern di gestione dei dati, è necessario aggiornare il pattern di gestione dei dati e la stringa di connessione del database. Potrebbe anche essere necessario aggiornare il prefisso della tabella.

Generazione di query e attribuzione

Un principio fondamentale delle applicazioni multi-tenant è che diversi tenant possono condividere una singola risorsa cloud. I pattern di gestione dei dati precedenti rientrano in questa categoria, tranne nel caso in cui un singolo tenant sia assegnato a una singola istanza di Spanner.

La condivisione delle risorse va oltre la condivisione dei dati. Vengono inoltre condivisi monitoraggio e logging, ad esempio nel modello di gestione dei dati della tabella e nel modello di gestione dei dati dello schema, tutte le query per tutti i tenant vengono registrate nello stesso log di controllo.

Se una query viene registrata, il testo della query deve essere esaminato per determinare per quale tenant è stata eseguita la query. Nel pattern di gestione dei dati della tabella, devi analizzare il predicato. Nel pattern di gestione dei dati dello schema, devi analizzare uno dei nomi della tabella.

Nel pattern di gestione dei dati del database o nel modello di gestione dei dati dell'istanza, il testo della query non contiene informazioni del tenant. Per ottenere informazioni sul tenant per questi pattern, devi eseguire una query sulla tabella di mappatura tenant-to-data-management-pattern.

Sarebbe più semplice analizzare log e query determinando il tenant per una determinata query senza analizzare il testo della query. Un modo per identificare uniformemente un tenant per una query in tutti i pattern di gestione dei dati consiste nell'aggiungere un commento al testo della query con tenant ID e, facoltativamente, un label.

La query seguente seleziona tutti i dati dei dipendenti per il tenant identificato da TENANT 356. Per evitare di analizzare la sintassi SQL e di estrarre l'ID tenant dal predicato, l'ID tenant viene aggiunto come commento. Un commento può essere estratto senza dover analizzare la sintassi SQL.

select * from EMPLOYEE
  -- TENANT 356
  where TENANT = 'T356';

o

select * from T356_EMPLOYEE;
  -- TENANT 356

Con questo progetto, ogni query eseguita per un tenant è attribuita a quel tenant indipendentemente dal pattern di gestione dei dati. Se un tenant è spostato da un pattern di gestione dati a un altro, il testo della query potrebbe cambiare, ma l'attribuzione rimane invariata.

L'esempio di codice precedente è un solo metodo. Un altro metodo è inserire un oggetto JSON come commento anziché un'etichetta e un valore:

select * from T356_EMPLOYEE;
  -- {"TENANT": 356}

Operazioni del ciclo di vita dell'accesso inquilini

A seconda della tua filosofia di progettazione, un'applicazione multi-tenant può implementare direttamente le operazioni del ciclo di vita dei dati descritte in precedenza o creare uno strumento di amministrazione tenant separato.

Indipendentemente dalla strategia di implementazione, le operazioni del ciclo di vita potrebbero dover essere eseguite senza la logica dell'applicazione in esecuzione, ad esempio durante lo spostamento di un tenant da un pattern di gestione dei dati a un altro, la logica dell'applicazione non può essere eseguita perché i dati non sono in un unico database. Quando i dati non sono in un unico database, sono necessarie due operazioni aggiuntive dal punto di vista dell'applicazione:

  • Arresto di un tenant: disabilita tutti gli accessi alla logica dell'applicazione mentre consente l'esecuzione delle operazioni del ciclo di vita dei dati.
  • Avvio di un tenant: la logica dell'applicazione può accedere ai dati di un tenant mentre le operazioni del ciclo di vita che interferisce con la logica dell'applicazione sono disabilitate.

Sebbene non vengano utilizzati spesso, la chiusura di un tenant di emergenza potrebbe essere un'altra operazione importante del ciclo di vita. Utilizza questa disattivazione quando sospetti una violazione e devi vietare ogni accesso ai dati di un tenant, non solo la logica dell'applicazione, ma anche le operazioni del ciclo di vita. Una violazione può provenire dall'interno o dall'esterno del database.

Deve essere disponibile anche un'operazione del ciclo di vita corrispondente che rimuove lo stato di emergenza. Questa operazione può richiedere che due o più amministratori accedano contemporaneamente per implementare il controllo reciproco.

Isolamento delle applicazioni

I vari pattern di gestione dei dati supportano gradi diversi di isolamento dei dati tenant. Dal livello più isolato (istanza) al livello meno isolato (tabella) sono possibili diversi livelli di isolamento.

Nel contesto di un'applicazione multi-tenant, è necessario prendere una decisione di deployment simile: tutti i tenant accedono ai propri dati (in potenziali modelli di gestione dei dati) utilizzando lo stesso deployment di applicazioni? Ad esempio, un singolo cluster Kubernetes potrebbe supportare tutti i tenant e, quando un tenant accede ai propri dati, lo stesso cluster esegue la logica di business.

In alternativa, come per i pattern di gestione dei dati, i tenant diversi possono essere indirizzati a deployment di applicazioni differenti. I tenant di grandi dimensioni potrebbero avere accesso a un deployment di applicazioni esclusivo, mentre i tenant più piccoli o di livello inferiore condividono il deployment di un'applicazione.

Anziché utilizzare direttamente i pattern di gestione dei dati illustrati in questo articolo con i pattern di gestione dei dati dell'applicazione equivalenti, puoi utilizzare il pattern di gestione dei dati del database in modo che tutti i tenant condividano una singola implementazione dell'applicazione. È possibile che il pattern di gestione dei dati del database sia condiviso da tutti i tenant.

La multi-tenancy è un modello di gestione dei dati per la progettazione e l'applicazione importante, soprattutto quando l'efficienza delle risorse svolge un ruolo fondamentale. Spanner supporta diversi modelli di gestione dei dati, lo utilizza per implementare applicazioni multi-tenant. Grazie all'estrema scalabilità e agli SLA (accordi sul livello del servizio) di Spanner, è un database ideale per i deployment di applicazioni multi-tenant di grandi dimensioni.

Passaggi successivi

  • Esplora architetture di riferimento, diagrammi, tutorial e best practice su Google Cloud. Dai un'occhiata al nostro Cloud Architecture Center.