Multi-tenancy e Azure Cosmos DB
Questo articolo descrive le funzionalità di Azure Cosmos DB che è possibile usare per i sistemi multi-tenant. Fornisce indicazioni ed esempi su come usare Azure Cosmos DB in una soluzione multi-tenant.
Requisiti di multi-tenancy
Quando si pianifica una soluzione multi-tenant, si hanno due requisiti chiave:
- Garantire un isolamento sicuro tra i tenant e soddisfare requisiti di sicurezza rigorosi per gli utenti che ne hanno bisogno.
- Mantenere un costo basso per tenant. Poiché il provider garantisce che il costo per l'esecuzione dell'applicazione rimanga sostenibile man mano che viene ridimensionato.
Queste due esigenze possono spesso entrare in conflitto e introdurre un compromesso in cui è necessario classificare una priorità rispetto all'altra. Le linee guida contenute in questo articolo consentono di comprendere meglio i compromessi che è necessario apportare per soddisfare queste esigenze. Questo articolo consente di esplorare queste considerazioni in modo da poter prendere decisioni informate quando si progetta la soluzione multi-tenant.
Modalità di isolamento
Determinare il livello di isolamento necessario tra i tenant. Azure Cosmos DB supporta una gamma di modelli di isolamento, ma per la maggior parte delle soluzioni è consigliabile usare una delle strategie seguenti:
- Una chiave di partizione per tenant viene spesso usata per soluzioni completamente multi-tenant, ad esempio soluzioni SaaS (SaaS) da business a consumer.
- Un account di database per tenant viene spesso usato per soluzioni SaaS business-to-business (B2B).
Per scegliere il modello di isolamento più appropriato, prendere in considerazione il modello aziendale e i requisiti dei tenant. Ad esempio, un forte isolamento delle prestazioni potrebbe non essere una priorità per alcuni modelli B2C in cui un'azienda vende un prodotto o un servizio direttamente a un singolo cliente. Tuttavia, i modelli B2B potrebbero classificare in ordine di priorità l'isolamento avanzato della sicurezza e delle prestazioni e potrebbero richiedere che i tenant dispongano del proprio account di database di cui è stato effettuato il provisioning.
È anche possibile combinare più modelli in base alle diverse esigenze dei clienti. Si supponga, ad esempio, di creare una soluzione SaaS B2B che si vende ai clienti aziendali e di fornire una versione di valutazione gratuita per i nuovi clienti potenziali. È possibile distribuire un account di database separato per tenant aziendali a pagamento che necessitano di garanzie di sicurezza e isolamento avanzate. È anche possibile condividere un account di database e usare le chiavi di partizione per isolare i clienti della versione di valutazione.
Modelli di isolamento consigliati
Il modello partition-key-per-tenant e il modello database-account-per-tenant sono i modelli di isolamento più comuni per le soluzioni multi-tenant. Questi modelli offrono il miglior equilibrio tra l'isolamento del tenant e l'efficienza dei costi.
Modello partition-key-per-tenant
Se si isolano i tenant in base alla chiave di partizione, la velocità effettiva viene condivisa tra tenant e gestita all'interno dello stesso contenitore.
Nota
Un'unità richiesta (UR) è un'astrazione logica del costo di un'operazione o di una query di database. In genere, viene effettuato il provisioning di un numero definito di unità richiesta al secondo (UR/sec) per il carico di lavoro, detto velocità effettiva.
Vantaggi
Efficienza dei costi: tutti i tenant vengono inseriti in un unico contenitore, partizionato dall'ID tenant. Questo approccio ha una sola risorsa fatturabile che effettua il provisioning e condivide le UR tra più tenant. Questo modello è in genere più conveniente e più semplice da gestire rispetto alla presenza di account separati per ogni tenant.
Gestione semplificata: sono disponibili meno account Azure Cosmos DB da gestire.
Compromessi
Contesa di risorse: la velocità effettiva condivisa (UR/sec) tra i tenant che si trovano nello stesso contenitore può causare conflitti durante il picco di utilizzo. Questa contesa può creare problemi adiacente rumorosi e problemi di prestazioni se i tenant hanno carichi di lavoro elevati o sovrapposti. Usare questo modello di isolamento per i carichi di lavoro che necessitano di UR garantite in un singolo tenant e possono condividere la velocità effettiva.
Isolamento limitato: questo approccio fornisce l'isolamento logico, non l'isolamento fisico. Potrebbe non soddisfare requisiti di isolamento rigorosi dal punto di vista delle prestazioni o della sicurezza.
Minore flessibilità: non è possibile personalizzare le funzionalità a livello di account, ad esempio la replica geografica, il ripristino temporizzato e le chiavi gestite dal cliente, per ogni tenant se si isola per chiave di partizione o per database o contenitore.
Funzionalità di Azure Cosmos DB per la multi-tenancy
Controllare la velocità effettiva: esplorare le funzionalità che consentono di controllare il problema del vicino rumoroso quando si usa una chiave di partizione per isolare i tenant. Usare funzionalità come la riallocazione della velocità effettiva, la capacità burst e il controllo della velocità effettiva in Java SDK.
Chiavi di partizione gerarchiche: usare Azure Cosmos DB in modo che ogni partizione logica possa aumentare le dimensioni fino a 20 GB. Se si ha un singolo tenant che deve archiviare più di 20 GB di dati, è consigliabile distribuire i dati tra più partizioni logiche. Ad esempio, anziché avere una singola chiave di partizione di , è possibile distribuire le chiavi di
Contoso
partizione creando più chiavi di partizione per un tenant, ad esempioContoso1
eContoso2
.Quando si eseguono query sui dati per un tenant, è possibile usare la
WHERE IN
clausola per corrispondere a tutte le chiavi di partizione. È anche possibile usare chiavi di partizione gerarchiche per fornire tenant di grandi dimensioni con spazio di archiviazione maggiore di 20 GB se si ha una cardinalità elevata dei tenant. Non è necessario usare chiavi di partizione sintetiche o più valori di chiave di partizione per ogni tenant per questo metodo.Si supponga di avere un carico di lavoro che isola i tenant in base alla chiave di partizione. Un tenant, Contoso, è più grande e più pesante da scrivere rispetto ad altri e continua a crescere di dimensioni. Per evitare il rischio di non poter inserire più dati per questo tenant, è possibile usare chiavi di partizione gerarchica. Specificare
TenantID
come chiave di primo livello e quindi aggiungere un secondo livello, ad esempioUserId
. Se si prevede laTenantID
combinazione eUserID
per produrre partizioni logiche che superano il limite di 20 GB, è possibile partizionare ulteriormente fino a un altro livello, ad esempioSessionID
. Le query che specificanoTenantID
o entrambeTenantID
eUserID
vengono instradate in modo efficace solo al subset di partizioni fisiche che contengono i dati pertinenti, evitando così una query full fan-out. Se il contenitore ha 1.000 partizioni fisiche, ma un valore specificoTenantId
è solo su cinque partizioni fisiche, la query viene instradata al numero inferiore di partizioni fisiche pertinenti.Se il primo livello non ha cardinalità sufficientemente elevata e si raggiunge il limite di partizione logica di 20 GB sulla chiave di partizione, è consigliabile usare una chiave di partizione sintetica anziché una chiave di partizione gerarchica.
Modello database-account-per-tenant
Se si isolano i tenant in base all'account del database, ogni tenant ha una propria velocità effettiva di cui è stato effettuato il provisioning a livello di database o contenitore.
Vantaggi
Isolamento elevato: questo approccio evita contese o interferenze a causa di account e contenitori di Azure Cosmos DB dedicati che hanno effettuato il provisioning di UR per ogni tenant univoco.
Contratti di servizio personalizzati: ogni tenant ha un proprio account, in modo da poter fornire risorse personalizzate specifiche, contratti di servizio per i clienti e garanzie, perché è possibile ottimizzare l'account di database di ogni tenant in modo indipendente per la velocità effettiva.
Sicurezza avanzata: l'isolamento dei dati fisici garantisce una sicurezza affidabile perché i clienti possono abilitare chiavi gestite dal cliente a livello di account per tenant. I dati di ogni tenant sono isolati dall'account, anziché trovarsi nello stesso contenitore.
Flessibilità: i tenant possono abilitare funzionalità a livello di account come la replica geografica, il ripristino temporizzato e le chiavi gestite dal cliente in base alle esigenze.
Compromessi
Maggiore gestione: questo approccio è più complesso perché si gestiscono più account Azure Cosmos DB.
Costi più elevati: più account indicano che è necessario effettuare il provisioning della velocità effettiva in ogni risorsa, ad esempio database o contenitori, all'interno dell'account per ogni tenant. Ogni volta che una risorsa effettua il provisioning delle UR, i costi di Azure Cosmos DB aumentano.
Limitazioni delle query: tutti i tenant si trovano in account diversi, quindi le applicazioni che eseguono query su più tenant richiedono più chiamate all'interno della logica dell'applicazione.
Funzionalità di Azure Cosmos DB per la multi-tenancy
Funzionalità di sicurezza: questo modello offre un maggiore isolamento della sicurezza dell'accesso ai dati tramite il controllo degli accessi in base al ruolo di Azure. Questo modello fornisce anche l'isolamento della sicurezza della crittografia del database a livello di tenant tramite chiavi gestite dal cliente.
Configurazione personalizzata: è possibile configurare il percorso dell'account del database in base ai requisiti del tenant. È anche possibile ottimizzare la configurazione delle funzionalità di Azure Cosmos DB, ad esempio la replica geografica e le chiavi di crittografia gestite dal cliente, in base ai requisiti di ogni tenant.
Quando si usa un account Azure Cosmos DB dedicato per tenant, prendere in considerazione il numero massimo di account Azure Cosmos DB per ogni sottoscrizione di Azure.
Elenco completo dei modelli di isolamento
Esigenze del carico di lavoro | Chiave di partizione per tenant (scelta consigliata) | Contenitore per tenant (velocità effettiva condivisa) | Contenitore per tenant (velocità effettiva dedicata) | Database per tenant | Account di database per tenant (scelta consigliata) |
---|---|---|---|---|---|
Query tra tenant | Facile (il contenitore funge da limite per le query) | Difficile | Difficile | Difficile | Difficile |
Densità del tenant | Alto (costo minimo per tenant) | Medio | Basso | Basso | Basso |
Eliminazione dei dati del tenant | Facile | Facile (rilascio del contenitore quando il tenant esce) | Facile (rilascio del contenitore quando il tenant esce) | Facile (rilascio del database quando il tenant esce) | Facile (rilascio del database quando il tenant esce) |
Isolamento della sicurezza dell'accesso ai dati | È necessario implementare all'interno dell'applicazione | Controllo degli accessi in base al ruolo del contenitore | Controllo degli accessi in base al ruolo del contenitore | Controllo degli accessi in base al ruolo del database | RBAC |
Replica geografica | Replica geografica per tenant non possibile | Raggruppare i tenant all'interno degli account di database in base ai requisiti | Raggruppare i tenant all'interno degli account di database in base ai requisiti | Raggruppare i tenant all'interno degli account di database in base ai requisiti | Raggruppare i tenant all'interno degli account di database in base ai requisiti |
Prevenzione dei vicini rumorosi | No | No | Sì | Sì | Sì |
Latenza di creazione del nuovo tenant | Immediate | Veloce | Veloce | Medio | Lente |
Vantaggi della modellazione dei dati | None | Condivisione delle entità | Condivisione delle entità | Più contenitori per modellare le entità tenant | Più contenitori e database per modellare i tenant |
Encryption key | Uguale per tutti i tenant | Uguale per tutti i tenant | Uguale per tutti i tenant | Uguale per tutti i tenant | Chiave gestita dal cliente per tenant |
Requisiti di velocità effettiva | >0 UR per tenant | >100 UR per tenant | >100 UR per tenant (con scalabilità automatica solo, altrimenti >400 UR per tenant) | >400 UR per tenant | >400 UR per tenant |
Esempio di caso d'uso | App B2C | Offerta Standard per le app B2B | Offerta Premium per le app B2B | Offerta Premium per le app B2B | Offerta Premium per le app B2B |
Modello contenitore per tenant
È possibile effettuare il provisioning di contenitori dedicati per ogni tenant. I contenitori dedicati funzionano bene quando è possibile combinare i dati archiviati per il tenant in un singolo contenitore. Questo modello offre un isolamento delle prestazioni maggiore rispetto al modello partition-key-per-tenant. Offre anche un maggiore isolamento della sicurezza dell'accesso ai dati tramite il controllo degli accessi in base al ruolo di Azure.
Quando si usa un contenitore per ogni tenant, è consigliabile condividere la velocità effettiva con altri tenant effettuando il provisioning della velocità effettiva a livello di database. Prendere in considerazione le restrizioni e i limiti per il numero minimo di UR per il database e il numero massimo di contenitori nel database. Valutare anche se i tenant richiedono un livello di prestazioni garantito e se sono soggetti al problema dei vicini rumorosi. Quando si condivide la velocità effettiva a livello di database, il carico di lavoro o l'archiviazione in tutti i contenitori deve essere relativamente uniforme. In caso contrario, se si dispone di uno o più tenant di grandi dimensioni, è possibile che si verifichi un problema con un vicino rumoroso. Se necessario, pianificare il raggruppamento di questi tenant in database diversi basati su modelli di carico di lavoro.
In alternativa, è possibile effettuare il provisioning della velocità effettiva dedicata per ogni contenitore. Questo approccio funziona bene per i tenant di dimensioni maggiori e per i tenant che sono a rischio del problema dei vicini rumorosi. Tuttavia, la velocità effettiva di base per ogni tenant è superiore, quindi considerare i requisiti minimi e le implicazioni sui costi di questo modello.
Se il modello di dati del tenant richiede più di un'entità e se tutte le entità possono condividere la stessa chiave di partizione, è possibile suddividerle nello stesso contenitore. Tuttavia, se il modello di dati del tenant è più complesso e richiede entità che non possono condividere la stessa chiave di partizione, prendere in considerazione i modelli database-per-tenant o database-account-per-tenant. Per altre informazioni, vedere Modellare e partizionare i dati in Azure Cosmos DB.
La gestione del ciclo di vita è in genere più semplice quando si dedicano contenitori ai tenant. È possibile spostare facilmente i tenant tra modelli di velocità effettiva condivisi e dedicati. Quando si esegue il deprovisioning di un tenant, è possibile eliminare rapidamente il contenitore.
Modello di database per tenant
È possibile effettuare il provisioning dei database per ogni tenant nello stesso account di database. Analogamente al modello container-per-tenant, questo modello offre un isolamento delle prestazioni maggiore rispetto al modello partition-key-per-tenant. Offre anche un maggiore isolamento della sicurezza dell'accesso ai dati tramite il controllo degli accessi in base al ruolo di Azure.
Analogamente al modello account-per-tenant, questo approccio offre il livello di isolamento delle prestazioni più elevato, ma offre la densità del tenant più bassa. Usare questa opzione se ogni tenant richiede un modello di dati più complesso di quanto sia fattibile nel modello contenitore per tenant. In alternativa, seguire questo approccio se la creazione di un nuovo tenant deve essere veloce o senza sovraccarichi iniziali. Per alcuni framework di sviluppo software, il modello di database per tenant potrebbe essere l'unico livello di isolamento delle prestazioni supportato dal framework. Questi framework in genere non supportano l'isolamento a livello di entità (contenitore) e la condivisione delle entità.
Funzionalità di Azure Cosmos DB che supportano la multi-tenancy
Partizionamento
Usare le partizioni con i contenitori di Azure Cosmos DB per creare contenitori condivisi da più tenant. In genere si usa l'identificatore del tenant come chiave di partizione, ma è anche consigliabile usare più chiavi di partizione per un singolo tenant. Una strategia di partizionamento ben pianificata implementa efficacemente il modello di partizionamento orizzontale. Quando si hanno contenitori di grandi dimensioni, Azure Cosmos DB distribuisce i tenant in più nodi fisici per ottenere un livello elevato di scalabilità.
Prendere in considerazione le chiavi di partizione gerarchica per migliorare le prestazioni della soluzione multi-tenant. Usare chiavi di partizione gerarchica per creare una chiave di partizione che include più valori. Ad esempio, è possibile usare una chiave di partizione gerarchica che include l'identificatore del tenant, ad esempio un GUID con cardinalità elevata, per consentire una scalabilità quasi illimitata. In alternativa, è possibile specificare una chiave di partizione gerarchica che include una proprietà che esegue query di frequente. Questo approccio consente di evitare query tra partizioni. Usare chiavi di partizione gerarchiche per superare il limite di partizione logica di 20 GB per valore della chiave di partizione e limitare query di fanout costose.
Per ulteriori informazioni, vedi le seguenti risorse:
Gestire le UR
Il modello di determinazione prezzi di Azure Cosmos DB si basa sul numero di UR/sec di cui si effettua il provisioning o l'utilizzo. Azure Cosmos DB offre diverse opzioni per effettuare il provisioning della velocità effettiva. In un ambiente multi-tenant, la selezione influisce sulle prestazioni e sul prezzo delle risorse di Azure Cosmos DB.
Per i tenant che richiedono un isolamento garantito delle prestazioni e della sicurezza, è consigliabile isolare i tenant in base all'account del database e allocare ur al tenant. Per i tenant con requisiti meno rigorosi, è consigliabile isolare i tenant in base alla chiave di partizione. Usare questo modello per condividere le UR tra i tenant e ottimizzare il costo per tenant.
Un modello di tenancy alternativo per Azure Cosmos DB prevede la distribuzione di contenitori separati per ogni tenant all'interno di un database condiviso. Usare Azure Cosmos DB per effettuare il provisioning di UR per un database in modo che tutti i contenitori convidano le UR. Se i carichi di lavoro del tenant non si sovrappongono in genere, questo approccio può contribuire a ridurre i costi operativi. Tuttavia, questo approccio è soggetto al problema del vicino rumoroso perché il contenitore di un singolo tenant potrebbe utilizzare una quantità sproporzionata delle UR di cui è stato effettuato il provisioning condiviso. Per attenuare questo problema, identificare prima di tutto i tenant rumorosi. È quindi possibile impostare facoltativamente la velocità effettiva con provisioning in un contenitore specifico. Gli altri contenitori nel database continuano a condividere la velocità effettiva, ma il tenant rumoroso usa la propria velocità effettiva dedicata.
Azure Cosmos DB offre anche un livello serverless, adatto ai carichi di lavoro con traffico intermittente o imprevedibile. In alternativa, è possibile usare la scalabilità automatica per configurare i criteri che specificano il ridimensionamento della velocità effettiva con provisioning. È anche possibile sfruttare la capacità burst di Azure Cosmos DB per ottimizzare l'utilizzo della capacità di velocità effettiva con provisioning, altrimenti limitata dai limiti di velocità. In una soluzione multi-tenant, è possibile combinare tutti questi approcci per supportare diversi tipi di tenant.
Nota
Quando si pianifica la configurazione di Azure Cosmos DB, prendere in considerazione le quote e i limiti del servizio.
Per monitorare e gestire i costi associati a ogni tenant, tenere presente che ogni operazione che usa l'API di Azure Cosmos DB include le UR usate. È possibile usare queste informazioni per aggregare e confrontare le UR effettive utilizzate da ogni tenant. È quindi possibile identificare i tenant con caratteristiche di prestazioni diverse.
Per ulteriori informazioni, vedi le seguenti risorse:
- Provisioning velocità effettiva
- Scalabilità automatica
- Senza server
- Misurare l'addebito ur di una richiesta
- Quote del servizio Azure Cosmos DB
- Capacità burst
Chiavi gestite dal cliente
Alcuni tenant potrebbero richiedere l'uso delle proprie chiavi di crittografia. Azure Cosmos DB offre una funzionalità chiave gestita dal cliente. Questa funzionalità viene applicata al livello di un account Azure Cosmos DB. Pertanto, se i tenant richiedono chiavi di crittografia personalizzate, è necessario usare account Azure Cosmos DB dedicati per distribuire i tenant.
Per altre informazioni, vedere Configurare chiavi gestite dal cliente per l'account Azure Cosmos DB con Azure Key Vault.
Collaboratori
Questo articolo viene gestito da Microsoft. Originariamente è stato scritto dai seguenti contributori.
Autori principali:
- Tara Bhatia | Program Manager, Azure Cosmos DB
- Paul Burpo | Principal Customer Engineer, FastTrack per Azure
- John Downs | Principal Software Engineer
Altri contributori:
- Mark Brown | Principal PM Manager, Azure Cosmos DB
- Deborah Chen | Principal Program Manager
- Theo van Kraay | Senior Program Manager, Azure Cosmos DB
- Arsen Vladimirintune | Principal Customer Engineer, FastTrack per Azure
- Thomas Weiss | Principal Program Manager
- Vic Perdana | Cloud Solution Architect, Azure ISV
Per visualizzare i profili LinkedIn non pubblici, accedere a LinkedIn.
Passaggi successivi
Altre informazioni sulla multi-tenancy e Azure Cosmos DB:
- Progettare e creare app SaaS multi-tenant su larga scala con Azure Cosmos DB: una sessione alla build 2024 che illustra come progettare per la multi-tenancy in Azure Cosmos DB e apprendere le procedure consigliate da un fornitore di software indipendente reale.
- Azure Cosmos DB e sistemi multi-tenant: post di blog che illustra come creare un sistema multi-tenant che usa Azure Cosmos DB.
- Video: Applicazioni multi-tenant con Azure Cosmos DB
- Video: Creare un saaS multi-tenant con Azure Cosmos DB e Azure: un case study reale su come Whally, un'avvio SaaS multi-tenant, crea una piattaforma moderna da zero in Azure Cosmos DB e Azure. Whally mostra le decisioni di progettazione e implementazione prese in relazione al partizionamento, alla modellazione dei dati, alla multitenancy sicura, alle prestazioni e allo streaming in tempo reale dal feed di modifiche a SignalR. Tutte queste soluzioni usano ASP.NET Core nel servizio app Azure.
Risorse correlate
Fare riferimento ad alcuni degli altri scenari architetturali di Azure Cosmos DB: