Creare database distribuiti globalmente con Azure Cosmos DB

Azure Cosmos DB è un database NoSQL (Not Only SQL) completamente gestito e relazionale per lo sviluppo di app moderne. I tempi di risposta di pochi millisecondi e la scalabilità automatica e istantanea garantiscono la velocità ottimale anche su larga scala. La continuità aziendale è garantita dalla disponibilità supportata dal contratto di servizio e dalla sicurezza di livello aziendale.

Le applicazioni moderne devono garantire velocità di risposta elevate ed essere sempre online. Per ottenere bassa latenza e disponibilità elevata, è necessario che le istanze di queste applicazioni siano distribuite in data center vicini agli utenti. Le applicazioni devono rispondere in tempo reale alle importanti modifiche nell’utilizzo negli orari di punta, archiviare volumi sempre maggiori di dati e renderli disponibili agli utenti in millisecondi.

Azure Cosmos DB solleva gli utenti dalle attività di amministrazione dei database occupandosi automaticamente della gestione, degli aggiornamenti e dell’applicazione di patch, nonché della gestione della capacità con opzioni di scalabilità automatica e serverless convenienti che rispondono alle esigenze dell’applicazione in termini di capacità per soddisfare la richiesta.

Vi invito a leggere l’articolo Informazioni sulle differenze tra Database NoSQL e relazionali di Azure Cosmos DB | Microsoft Learn per avere un’idea delle differenze tra i database NoSQL rispetto ai database relazionali.

Vantaggi principali

  • Velocità garantita su qualsiasi scala: Accesso in tempo reale con latenze di lettura e scrittura veloci a livello globale, velocità effettiva e coerenza supportati da contratti di servizio
  • Sviluppo di applicazioni semplificato: Possibilità di scegliere tra più API di database, tra cui l’API nativa per NoSQL, MongoDB, PostgreSQL, Apache Cassandra, Apache Gremlin e Table. Il servizio senza schema di Azure Cosmos DB indicizza automaticamente tutti i dati, indipendentemente dal modello di dati, per offrire query veloci.
  • Supporto di carichi di lavoro cruciali: Garanzia della continuità aziendale, della disponibilità del 99,999% e della sicurezza a livello aziendale per ogni applicazione. Distribuzione semplificata dei dati in qualsiasi area di Azure con la replica automatica dei dati. Nessun tempo di inattività grazie alle scritture in più aree o l’obiettivo del punto di ripristino pari a 0 con la coerenza assoluta.
  • Completamente gestito: Servizio di database completamente gestito. Automatico, nessun intervento, manutenzione, applicazione di patch e aggiornamenti, per consentire agli sviluppatori di risparmiare tempo e denaro. Scalabilità automatica della velocità effettiva di cui è stato effettuato il provisioning e dimensionamento istantaneo della capacità per carichi di lavoro imprevedibili.

Per un’introduzione ad Azure Cosmos DB, fate riferimento alle seguenti guide:

Creazione di un Azure Cosmos DB account

In questa guida vi mostrerò come creare database, contenitori ed elementi all’interno dell’account di Azure Cosmos DB.

Dal portale di Azure cercate la voce Cosmos DB e create un nuovo Cosmos DB account

Figura 1: creazione di un nuovo Cosmos DB account

In questa guida ho deciso di creare Azure Cosmos DB per NoSQL. Azure Cosmos DB offre più API di database, che includono NoSQL, MongoDB, PostgreSQL Cassandra, Gremlin e Table. Usando queste API è possibile modellare i dati reali usando documenti, coppie chiave-valore, grafi e modelli di dati. Queste API consentono alle applicazioni di considerare il Azure Cosmos DB come se fosse costituito da diverse altre tecnologie di database, senza il sovraccarico della gestione e con approcci di scalabilità.

Tutte le API offrono la scalabilità automatica di archiviazione e velocità, flessibilità e garanzie di prestazioni. Non esiste alcuna API migliore e è possibile scegliere una delle API per compilare l’applicazione.

Figura 2: Scelta della API Azure Cosmos DB per NoSQL, nativa per Cosmos DB

Nella scheda Basics inserite le informazioni richieste. Immettete un nome per identificare l’account Azure Cosmos DB. Il nome verrà usato come parte di un nome di dominio completo (FQDN) con un suffisso di documents.azure.com, pertanto il nome deve essere univoco a livello globale.

È anche possibile abilitare il piano gratuito di Azure Cosmos DB. Con il livello gratuito di Azure Cosmos DB si otterranno i primi 1000 UR/s e 25 GB di archiviazione gratuitamente in un account.

Figura 3: Scheda Basics del wizard di creazione di un nuovo Azure Cosmos DB account

Nella scheda Global Distribution potete decidere di abilitare la geo-ridondanza, possibilità di scrivere i dati in più zone e di mettere il database in una availability zone. Queste operazioni possono essere effettuate anche dopo la creazione dell’Azure Cosmos DB account.

Figura 4: Scheda Global Distribution del wizard di creazione di un nuovo Azure Cosmos DB account

È possibile configurare l’account Azure Cosmos DB per consentire l’accesso solo da una subnet specifica di una rete virtuale oppure abilitare un private endpoint in una subnet all’interno di una rete virtuale per controllare l’accesso ad Azure Cosmos DB.

Figura 5: Scheda Networking del wizard di creazione di un nuovo Azure Cosmos DB account

Nella scheda Backup Policy potete configurare i criteri di backup periodici o continui.. Azure Cosmos DB esegue automaticamente il backup dei dati ad intervalli regolari. I backup automatici vengono eseguiti senza impatto sulle prestazioni o sulla disponibilità delle operazioni del database. Tutti i backup sono archiviati separatamente in un servizio di archiviazione e replicati a livello globale per garantire la resilienza in caso di emergenze a livello di area di Azure.

Azure Cosmos DB esegue automaticamente un backup completo del database ogni 4 ore e in qualsiasi momento, solo i due backup più recenti vengono archiviati per impostazione predefinita. È possibile modificare la configurazione del backup durante o dopo la creazione dell’account Azure Cosmos. Se il contenitore o il database viene eliminato, Azure Cosmos DB mantiene gli snapshot esistenti di un determinato contenitore o database per 30 giorni.

Figura 6: Scheda Backup policy del wizard di creazione di un nuovo Azure Cosmos DB account

Nella scheda Encryption potete configurare una chiave gestita dal servizio o una chiave gestita dal cliente. I dati archiviati nell’account Azure Cosmos vengono crittografati automaticamente e facilmente con le chiavi gestite da Microsoft (chiavi gestite dal servizio). Facoltativamente, è possibile scegliere di aggiungere un secondo livello di crittografia con chiavi gestite dal cliente (chiavi gestite dal cliente o chiave gestita dal cliente).

È necessario archiviare le chiavi gestite dal cliente in Azure Key Vault e fornire una chiave per ogni account Azure Cosmos DB abilitato con chiavi gestite dal cliente. Questa chiave viene usata per crittografare tutti i dati archiviati nell’account.

Figura 7: Scheda Encryption del wizard di creazione di un nuovo Azure Cosmos DB account

 I tag sono coppie nome-valore che consentono di classificare le risorse e visualizzare dati di fatturazione consolidati tramite l’applicazione dello stesso tag a più risorse e gruppi di risorse. Inserite nella scheda Tags i valori che ritenete opportuni.

Figura 8: Scheda Tags del wizard di creazione di un nuovo Azure Cosmos DB account

Esaminate le impostazioni dell’account e quindi selezionare Create. La creazione dell’account richiede alcuni minuti.

Figura 9: Schermata finale del wizard di creazione di un nuovo Azure Cosmos DB account

Nel giro di qualche minuto il database sarà creato e operativo.

Figura 10: Creazione dell’Azure Cosmos DB account completata

Aggiungere un database e un contenitore all’Azure Cosmos DB account

È possibile utilizzare il portale di Azure per creare un database e un contenitore. Dalla scheda Overview (o dalla scheda Data Explorer) cliccate su + Add Container.

Figura 11: Creazione di un nuovo contenitore di dati nell’Azure Cosmos DB account

Nel riquadro New Container immettete le impostazioni per il nuovo contenitore. Create un nuovo database, stabilite la velocità effettiva scegliendola tra scalabilità automatica o manuale, inserite il nome del nuovo contenitore e la nuova chiave di partizione, come mostrato nella figura sotto:

Figura 12: Creazione di un nuovo database e di un nuovo contenitore nell’Azure Cosmos DB account

Come si può vedere dalla figura sotto, in Data Explorer sono visibili gli oggetti appena creati (Database e Container).

Figura 13: Database e contenitore creati nell’Azure Cosmos DB account

Aggiungere dati al database

Da Data Explorer è possibile aggiungere nuovi dati al database all’interno del contenitore creato. Utilizzare il pulsante New Item per procedere all’inserimento dei dati. I dati verranno inseriti in formato JSON.

Figura 14: Inserimento di dati nel database creato nell’Azure Cosmos DB account

Qui di seguito un esempio di inserimento di un nuovo Item in formato JSON. L’elemento da inserire deve avere un id univoco  e qualsiasi altra proprietà e valori desiderati. I documenti possono avere qualsiasi struttura perché Azure Cosmos DB non impone alcuno schema ai dati.

Figura 15: Inserimento del primo Item nel database

Inserite un secondo Item con la stessa procedura vista prima.

Figura 16: Inserimento del secondo Item nel database

Figura 17: Dati inseriti nel database

Eseguire query sui dati

I dati in un contenitore di Azure Cosmos DB vengono indicizzati automaticamente al momento dell’inserimento. L’indicizzazione automatica consente agli utenti di eseguire query sui dati senza problemi di gestione degli schemi o degli indici, in particolare in una configurazione distribuita a livello globale.

È possibile usare le query in Data Explorer per recuperare e filtrare i dati. È possibile eseguire query sui dati scrivendo query usando il Structured Query Language (SQL) come linguaggio di query JSON.

Qui di seguito una semplice query da inserire nel portale di Azure dopo aver cliccato sul pulsante New SQL Query, come mostrato in figura.

Figura 18: Esecuzione di una nuova SQL query per visualizzare i dati

Figura 19: Risultato della query SQL

I dati possono essere anche filtrati e ordinati. Se si ha familiarità con la sintassi SQL, è possibile immettere qualsiasi query SQL supportata nella casella del predicato della query.

Qui di seguito un esempio di query che ho eseguito

Figura 20: Esecuzione di una query con ordinamento

È anche possibile usare Data Explorer per creare stored procedure, funzioni definite dall’utente e trigger per eseguire la logica di business lato server. Una stored procedure in SQL è un gruppo di una o più istruzioni Transact-SQL oppure un riferimento a un metodo CLR (Common Runtime Language) di Microsoft .NET Framework. Le stored procedure assomigliano ai costrutti di altri linguaggi di programmazione perché possono essere utilizzate per:

  • Accettare parametri di input e restituire più valori sotto forma di parametri di output al programma che esegue la chiamata.
  • Includere istruzioni di programmazione che eseguono operazioni nel database, tra cui la chiamata di altre stored procedure.
  • Restituire un valore di stato a un programma che esegue la chiamata per indicare l’esito positivo o negativo (e il motivo dell’esito negativo).

Cliccate sul pulsante New Stored Procedure per crearne una.

Figura 21: Creazione di una nuova stored procedure in Data Explorer

Qui di seguito la sintassi che ho utilizzato per la mia stored procedure.

Figura 22: Salvataggio della stored procedure

Eseguite la stored procedure per verificarne il funzionamento.

Figura 23: Esecuzione della stored procedure per la verifica di funzionamento

Figura 24: Inserimento dei dati richiesti dalla stored procedure

Come si può vedere dalla figura sotto, la stored procedure ha creato un nuovo Item nel container Clothing del database.

Figura 25: Creazione di un nuovo Item eseguita dalla stored procedure

Creazione di una funzione definita dall’utente

Esattamente come le stored procedure è possibile usare Data Explorer per creare funzioni definite dall’utente. Cliccate sul pulsante New
UDF per far partire il wizard di creazione della nuova User Defined Function (UDF).

Figura 26: Creazione di una nuova User Defined Function (UDF)

Qui di seguito un esempio di funzione personalizzata che modifica i valori degli Item.

Figura 27: Creazione e salvataggio della nuova funzione definita dall’utente

Figura 28: Nuova funzione definita dall’utente creata con successo

A questo punto potete ricavare delle informazioni eseguendo una query SQL che richiama la vostra funzione. Qui di seguito un esempio:

Figura 29: Esecuzione di una query SQL che richiama la funziona definita dall’utente

Distribuire i dati a livello globale con Azure Cosmos DB

Come già scritto prima, le applicazioni moderne devono garantire velocità di risposta elevate ed essere sempre online. Per ottenere bassa latenza e disponibilità elevata, è necessario che le istanze di queste applicazioni siano distribuite in data center vicini agli utenti. Queste applicazioni vengono in genere distribuite in più data center e vengono definite distribuite a livello globale.

Azure Cosmos DB è un sistema di database distribuito a livello globale che consente di leggere e scrivere dati dalle repliche locali del database e che replica in modo trasparente i dati in tutte le aree associate all’account Cosmos. È un servizio di database distribuito a livello globale e progettato per garantire bassa latenza, scalabilità elastica della velocità effettiva, semantica ben definita per la coerenza dei dati e disponibilità elevata. In breve, se l’applicazione necessita di tempi di risposta rapidi in qualsiasi punto del mondo, se è necessario essere sempre online e necessita di scalabilità illimitata ed elastica della velocità effettiva e dell’archiviazione, è necessario creare l’applicazione in Azure Cosmos DB.

Con Azure Cosmos DB è possibile aggiungere o rimuovere le aree associate all’account in qualsiasi momento. Non è necessario sospendere l’esecuzione o ridistribuire l’applicazione per aggiungere o rimuovere un’area.

Dopo aver selezionato l’Azure Cosmos DB account dal portale di Azure e cliccate sul nodo Replicate Data globally. Abilitate i Multi.region writes e scegliete la regione o le regioni di Azure dove volete che il vostro account venga replicato. L’esecuzione di un database in più aree del mondo ne aumenta la disponibilità. Se un’area non è disponibile, le richieste dell’applicazione vengono gestite automaticamente dalle altre aree. Azure Cosmos DB offre disponibilità del 99,999% in lettura e scrittura per i database in più aree.

Se avete abilitato il free tier (come ho fatto) sarà però necessario gestire il Cost Management. Un banner vi avviserà che sarà prima necessario aumentare il total throughput.

Figura 30: Abilitazione della replica dei dati globale per l’Azure Cosmos DB account

Figura 31: Modifica del Cost Management per la gestione dei limiti di throughput

Figura 32: Abilitazione e salvataggio della replica globale dell’Azure Cosmos DB account

Dopo qualche minuto, la replica sarà abilitata e potrete anche effettuare un Manual Failover di test, per verificarne il funzionamento.

Figura 33: Esecuzione del Manual Failover sull’Azure Cosmos DB account

Figura 34: Scelta della region su cui effettuare il Manual Failover sull’Azure Cosmos DB account

Attendete un paio di minuti e verificate che il failover sia avvenuto correttamente.

Figura 35: Esecuzione del Manual Failover sull’Azure Cosmos DB account completata con successo

A livello generale, i dati del contenitore di Azure Cosmos DB vengono partizionati orizzontalmente in molti set di repliche, che replicano le scritture, in ogni area. I set di repliche eseguono il commit permanente usando un quorum di maggioranza.

Ogni area contiene tutte le partizioni di dati di un contenitore di Azure Cosmos e può gestire le letture e gestire le scritture quando è abilitata la scrittura in più aree. Se l’account Azure Cosmos viene distribuito tra le aree di Azure N , saranno presenti almeno N x 4 copie di tutti i dati.

Figura 36:
Azure Cosmos DB global distribution system topology

I dati all’interno di un contenitore vengono distribuiti lungo due dimensioni, all’interno di un’area e tra aree geografiche, in tutto il mondo. Trovate maggiori informazioni alla pagina https://learn.microsoft.com/it-it/azure/cosmos-db/global-dist-under-the-hood

Figura 37: i dati all’interno di un contenitore vengono distribuiti lungo due dimensioni, all’interno di un’area e tra aree geografiche, in tutto il mondo

Conclusioni

Azure Cosmos DB è un sistema di database distribuito a livello globale che consente di leggere e scrivere dati dalle repliche locali del database e che replica in modo trasparente i dati in tutte le aree associate all’account Cosmos. È un servizio di database distribuito a livello globale e progettato per garantire bassa latenza, scalabilità elastica della velocità effettiva, semantica ben definita per la coerenza dei dati e disponibilità elevata. In breve, se l’applicazione necessita di tempi di risposta rapidi in qualsiasi punto del mondo, se è necessario essere sempre online e necessita di scalabilità illimitata ed elastica della velocità effettiva e dell’archiviazione, è necessario creare l’applicazione in Azure Cosmos DB.