Suggerimenti per l'ottimizzazione del ridimensionamento e del partizionamento

Si applica a questa raccomandazione per l'efficienza delle prestazioni di Azure Well-Architected Framework:

PE:05 Ottimizzare il ridimensionamento e il partizionamento. Incorporare scalabilità e partizionamento affidabili e controllate. La progettazione dell'unità di scala del carico di lavoro è la base della strategia di ridimensionamento e partizionamento.

Questa guida descrive le raccomandazioni per il ridimensionamento e il partizionamento di un carico di lavoro. Il ridimensionamento è la possibilità di aumentare o ridurre le risorse allocate a un carico di lavoro in base alla richiesta. Il partizionamento comporta la suddivisione del carico di lavoro in unità più piccole e gestibili per distribuire i dati e l'elaborazione tra più risorse. Un carico di lavoro che non ridimensiona o partiziona potrebbe riscontrare prestazioni scarse in periodi di domanda elevata e capacità sottoutilizzata in periodi di bassa domanda.

Definizioni

Termine Definizione
Autoscale Funzionalità che regola automaticamente i limiti di capacità di un servizio in base alle configurazioni predefinite, consentendo di aumentare o ridurre le prestazioni in base alle esigenze.
Capacità Limite massimo o capacità massima di un determinato servizio o funzionalità.
Affinità client (affinità di sessione) Il routing intenzionale delle richieste da un singolo client a una singola istanza del server per garantire una gestione coerente delle sessioni.
Coerenza (database distribuito) Uniformità dei dati tra più nodi in un database distribuito, assicurandosi che tutte le repliche abbiano gli stessi dati in un determinato momento.
Coerenza (database relazionale) Proprietà di una transazione che porta un database da uno stato valido a un altro, mantenendo l'integrità dei dati.
Livello di coerenza Configurazione che definisce come e quando i dati vengono replicati in un sistema di database distribuito, determinando il compromesso tra coerenza e prestazioni.
Blocco dei dati Meccanismo utilizzato per impedire aggiornamenti simultanei agli stessi dati.
Scalabilità orizzontale Approccio di ridimensionamento che aggiunge istanze di un determinato tipo di risorsa.
Concorrenza ottimistica Approccio per l'aggiornamento di database che utilizza snapshot per eseguire aggiornamenti anziché i meccanismi di blocco tradizionali.
Partizionamento Processo di suddivisione fisica dei dati in archivi dati separati.
Scalabilità Possibilità di un carico di lavoro di modificare dinamicamente i limiti di capacità per soddisfare diversi livelli di domanda.
Unità di scala Un gruppo di risorse che scalano proporzionalmente insieme.
Affinità di stato L'archiviazione dei dati della sessione client in un singolo server in modo che lo stesso server gestisca le richieste successive dallo stesso client.
Scalabilità verticale Approccio di ridimensionamento che aggiunge capacità di calcolo alle risorse esistenti.

Strategie di progettazione chiave

Sia il ridimensionamento che il partizionamento contribuiscono all'efficienza delle prestazioni assicurandosi che le risorse vengano usate in modo efficace e che il carico di lavoro possa gestire carichi variabili. Queste procedure sono particolarmente importanti negli ambienti cloud in cui le applicazioni devono essere flessibili e adattabili alle esigenze mutevoli. Il ridimensionamento garantisce la possibilità di espandere la capacità del carico di lavoro per soddisfare esigenze crescenti. Il partizionamento consente di dividere le attività o i dati in modo efficiente per gestire queste esigenze crescenti. La base di entrambi questi processi è la progettazione dell'unità di scala del carico di lavoro. Determina il modo in cui il carico di lavoro deve crescere e distribuire le attività. Incorporando un approccio affidabile e controllato al ridimensionamento e al partizionamento, è possibile far fronte a potenziali inefficienze del carico di lavoro.

Ottimizzare il ridimensionamento

Ottimizzare il ridimensionamento è il processo di regolazione del numero di server, istanze o risorse per soddisfare le esigenze variabili di un carico di lavoro. Garantisce che il carico di lavoro possa gestire un aumento del traffico o delle richieste senza che si verifichino riduzioni delle prestazioni o tempi di inattività.

Scegliere una strategia di ridimensionamento

La scelta di una strategia di ridimensionamento comporta la scelta tra metodi verticali o orizzontali per migliorare la capacità di un carico di lavoro in base ai requisiti specifici. La selezione della strategia corretta garantisce che le risorse vengano modificate in modo efficiente per soddisfare le esigenze del carico di lavoro senza sovraccaricare o sprecare. Per scegliere la strategia di ridimensionamento corretta, è necessario comprendere i casi d'uso per la scalabilità verticale e orizzontale e come soddisfano le esigenze del carico di lavoro.

Informazioni sul ridimensionamento verticale. Usando il ridimensionamento verticale, è possibile aumentare la capacità di una singola risorsa, ad esempio l'aggiornamento a un server o a dimensioni di istanza maggiori. La scalabilità verticale è utile quando il carico di lavoro può trarre vantaggio da una maggiore potenza di elaborazione, memoria o altre risorse all'interno di una singola istanza. La scalabilità verticale è appropriata per i carichi di lavoro che non sono facilmente divisi in parti più piccole o quando l'architettura dell'applicazione non supporta il ridimensionamento orizzontale.

Informazioni sul ridimensionamento orizzontale. Usando il ridimensionamento orizzontale, è possibile aggiungere più istanze o risorse per distribuire il carico di lavoro tra più server. La scalabilità orizzontale offre vantaggi come una maggiore resilienza, una maggiore capacità e la possibilità di gestire un aumento del traffico o delle richieste del carico di lavoro. È efficace per le applicazioni native del cloud progettate per l'esecuzione in più nodi. La scalabilità orizzontale è appropriata per i carichi di lavoro che possono essere suddivisi in parti più piccole eseguite in modo indipendente.

Comprendere il carico di lavoro. L'idoneità della scalabilità verticale o orizzontale dipende dalle caratteristiche e dai requisiti specifici del carico di lavoro. I normali test e il monitoraggio delle prestazioni nelle aree seguenti possono aiutare a ottimizzare la strategia di ridimensionamento nel tempo:

  • Requisiti: comprendere i requisiti specifici del carico di lavoro considerando fattori quali richieste di risorse, esigenze di scalabilità e limitazioni del carico di lavoro.

  • Unità di scala: creare una progettazione di unità di scala per i componenti da ridimensionare insieme. Ad esempio, 100 macchine virtuali potrebbero richiedere due code e tre account di archiviazione per gestire il carico di lavoro aggiuntivo. L'unità di scala sarà 100 macchine virtuali, due code e tre account di archiviazione. È consigliabile ridimensionare in modo indipendente tutti i componenti che riscontrano la fluttuazione dell'utilizzo della capacità.

  • Architettura: valutare la progettazione dell'architettura dell'applicazione. Alcune applicazioni potrebbero essere intrinsecamente progettate per la scalabilità orizzontale, con componenti senza stato che possono essere facilmente distribuiti tra più istanze. Altre applicazioni possono avere componenti o dipendenze con stato che rendono il ridimensionamento verticale più appropriato. Valutare i requisiti di scalabilità ed elasticità del carico di lavoro.

Progettare l'infrastruttura per la scalabilità

La progettazione dell'infrastruttura da ridimensionare è il processo di creazione di un'architettura in grado di gestire richieste e carichi di lavoro crescenti aggiungendo o modificando le risorse in base alle esigenze. Prevede la pianificazione e l'implementazione di soluzioni che possono essere ridimensionate orizzontalmente o verticalmente per supportare la crescita. Le strategie includono l'evitare singleton che possono diventare colli di bottiglia e disaccoppiare i componenti dell'applicazione per garantire la scalabilità indipendente. Quando si progetta un carico di lavoro in modo che sia scalabile, può distribuire efficacemente il carico di lavoro tra più risorse, evitando colli di bottiglia e ottimizzando l'utilizzo delle risorse.

Evitare singleton. È consigliabile evitare l'uso di una singola risorsa centralizzata per l'intero carico di lavoro. Distribuire invece il carico di lavoro tra più risorse per migliorare la scalabilità, la tolleranza di errore e le prestazioni. Esplorare alcuni esempi specifici e considerazioni sulla progettazione per evitare singleton nelle risorse del carico di lavoro:

  • Livellamento del carico basato su coda: invece di basarsi su una singola coda per elaborare i messaggi, valutare la possibilità di partizionare il carico di lavoro tra più code per distribuire il carico di elaborazione. Offre una migliore scalabilità e elaborazione parallela.

  • Elaborazione dati: i modelli Singleton vengono spesso visualizzati negli scenari di elaborazione dei dati in cui l'elaborazione non viene visualizzata. Suddividere le attività a esecuzione prolungata in attività più piccole che possono essere ridimensionate meglio per distribuire il carico di lavoro tra più risorse e sfruttare il parallelismo.

  • Modelli di progettazione: modelli di progettazione come fan-out/fan-in o pipe e filtri possono aiutare a evitare singleton nei flussi di lavoro. Questi modelli consentono la distribuzione delle attività di elaborazione tra più risorse e promuovono scalabilità e flessibilità.

Separare i componenti. Il disaccoppiamento dei componenti dell'applicazione è un aspetto importante della progettazione per la scalabilità. Implica la suddivisione dell'applicazione in componenti più piccoli e indipendenti che possono funzionare e ridimensionare in modo indipendente in base a requisiti specifici del carico di lavoro. Ad esempio, se un componente richiede più risorse a causa di una maggiore domanda, è possibile ridimensionare tale componente senza influire sugli altri. Questa flessibilità garantisce un'allocazione efficiente delle risorse e impedisce colli di bottiglia. Separando i componenti, è possibile isolare gli errori e ridurre al minimo l'effetto sull'applicazione complessiva. Se un componente ha esito negativo, gli altri componenti possono continuare a funzionare in modo indipendente.

I componenti disaccoppiati sono più facili da gestire e aggiornare. È possibile apportare modifiche o aggiornamenti a un componente senza influire sugli altri perché sono indipendenti. Seguire queste linee guida per separare i componenti dell'applicazione per la scalabilità:

  • Separazione delle preoccupazioni: identificare le responsabilità e le funzionalità dell'applicazione. Dividere le responsabilità in componenti separati in base alle proprie attività specifiche. Ad esempio, potrebbero essere presenti componenti separati per l'autenticazione utente, l'elaborazione dei dati e l'interfaccia utente.

  • Accoppiamento libero: progettare i componenti per comunicare tra loro tramite interfacce e protocolli ben definiti. Questa progettazione riduce le dipendenze tra i componenti e consente di semplificare la sostituzione o la scalabilità dei singoli componenti.

  • Comunicazione asincrona: usare modelli di comunicazione asincroni, ad esempio code di messaggi o architetture basate su eventi per separare ulteriormente i componenti. Questi modelli consentono ai componenti di elaborare le attività in modo indipendente al proprio ritmo, migliorando la scalabilità complessiva.

  • Microservizi: prendere in considerazione l'implementazione di microservizi, che sono servizi piccoli e indipendenti che si concentrano su funzionalità aziendali specifiche. Ogni microservizio può essere sviluppato, distribuito e ridimensionato in modo indipendente, offrendo maggiore flessibilità e scalabilità.

Progettare un'applicazione per la scalabilità

Quando si ridimensiona un carico di lavoro, è necessario progettare l'applicazione per distribuire il carico. Solo perché è possibile aggiungere più repliche a livello di infrastruttura non significa che l'applicazione può usare le repliche. La progettazione di un'applicazione su larga scala riguarda la struttura di un'applicazione in modo che possa gestire maggiori richieste distribuendo il carico di lavoro tra le risorse. Evitare soluzioni che richiedono affinità client, blocco dei dati o affinità di stato per una singola istanza, se possibile. Si vuole instradare un client o un processo a una risorsa con capacità disponibile. Per progettare la scalabilità dell'applicazione, prendere in considerazione le strategie seguenti:

Eliminare lo stato della sessione lato server. È consigliabile progettare applicazioni senza stato, se possibile. Per le applicazioni con stato, è consigliabile usare un archivio stato esterno al server. Lo stato della sessione esterna è la procedura per archiviare i dati della sessione all'esterno del server applicazione o del contenitore. È possibile esternare lo stato della sessione per distribuire i dati della sessione in più server o servizi, consentendo la gestione della sessione senza problemi in un ambiente distribuito. Prendere in considerazione quanto segue quando si esterna lo stato della sessione:

  • Valutare i requisiti della sessione. Comprendere i dati della sessione che devono essere archiviati e gestiti. Prendere in considerazione attributi di sessione, timeout sessione e requisiti specifici per la replica o la persistenza della sessione. Determinare le dimensioni dello stato della sessione e la frequenza delle operazioni di lettura e scrittura.

  • Scegliere una soluzione. Selezionare una soluzione di archiviazione allineata alle esigenze di prestazioni e scalabilità. Le opzioni includono l'uso di una cache distribuita, un database o un servizio stato sessione. Prendere in considerazione fattori quali coerenza dei dati, latenza e scalabilità quando si fa scelta.

  • Con l'applicazione. Aggiornare l'applicazione per usare la soluzione di archiviazione dello stato della sessione scelta. Potrebbe essere necessario modificare i file di configurazione o il codice dell'applicazione per connettersi al servizio di archiviazione esterno.

  • Aggiornare la logica. Modificare la logica di gestione della sessione dell'applicazione per archiviare e recuperare i dati della sessione dalla soluzione di archiviazione esterna. Potrebbe essere necessario usare API o librerie fornite dalla soluzione di archiviazione per gestire lo stato della sessione.

Eliminare l'affinità client. L'affinità client è nota anche come sessioni di affinità sessione o sessioni appiccide. Quando si elimina l'affinità client, si distribuiscono le richieste client in modo uniforme tra più repliche o server, senza instradare tutte le richieste da un client alla stessa replica. Questa configurazione può migliorare la scalabilità e le prestazioni delle applicazioni consentendo a qualsiasi replica disponibile di elaborare le richieste.

Esaminare l'algoritmo di bilanciamento del carico. Un algoritmo di bilanciamento del carico può causare l'aggiunta involontaria e artificiale del client in cui troppe richieste vengono inviate a un'istanza back-end. L'aggiunta può verificarsi se l'algoritmo è configurato per inviare sempre richieste dallo stesso utente alla stessa istanza. Può verificarsi anche se le richieste sono troppo simili tra loro.

Eliminare il blocco dei dati. Il blocco dei dati garantisce la coerenza, ma presenta svantaggi sulle prestazioni. Può causare escalation di blocchi e influire negativamente sulla concorrenza, sulla latenza e sulla disponibilità. Per eliminare il blocco dei dati, è necessario implementare la concorrenza ottimistica. I database non relazionali devono usare il controllo di concorrenza ottimistica e avere il livello di coerenza corretto. La strategia di partizionamento dei dati deve supportare anche le esigenze di concorrenza.

Usare l'individuazione dinamica del servizio. L'individuazione dinamica dei servizi è il processo di rilevamento automatico e registrazione dei servizi in un sistema distribuito. Consente ai client di individuare i servizi disponibili senza essere strettamente associati a istanze specifiche. I client non devono essere in grado di accettare una dipendenza diretta da un'istanza specifica nel carico di lavoro. Per evitare queste dipendenze, è consigliabile usare un proxy per distribuire e ridistribuire le connessioni client. Il proxy funge da intermediario tra client e servizi, fornendo un livello di astrazione che consente di aggiungere o rimuovere i servizi senza influire sui client.

Usare le attività in background. Quando un'applicazione viene ridimensionata, può gestire un carico di lavoro crescente o un numero maggiore di richieste simultanee. L'offload di attività intensive come attività in background consente all'applicazione principale di gestire le richieste utente senza operazioni a elevato utilizzo di risorse. Seguire questa procedura per disattivare le attività come attività in background:

  1. Trovare le attività a elevato utilizzo di CPU e I/O nell'applicazione che è possibile scaricare. Queste attività in genere comportano calcoli o interazioni pesanti con risorse esterne, ad esempio database o operazioni di rete.

  2. Progettare l'applicazione per supportare le attività in background. Separare le attività a elevato utilizzo dalla logica principale dell'applicazione e fornire un meccanismo per avviare e gestire le attività in background.

  3. Implementare l'elaborazione delle attività in background con tecnologie o framework appropriati. Includere funzionalità fornite dal linguaggio di programmazione o dalla piattaforma, ad esempio la programmazione asincrona, il threading o le code di attività. Contenere operazioni intensive in attività o thread separati, queste attività possono essere eseguite simultaneamente o pianificate per l'esecuzione a intervalli specifici.

  4. Distribuire attività in background se sono presenti molte di esse o se le attività richiedono tempo o risorse sostanziali. Per una possibile soluzione, vedere l’articolo relativo al modello di consumer concorrenti.

Configurare il ridimensionamento

La configurazione della scalabilità è il processo di configurazione e modifica dei parametri per allocare dinamicamente le risorse in base alle esigenze del carico di lavoro. Include strategie come l'uso delle funzionalità di scalabilità automatica, la comprensione dei limiti di scalabilità dei servizi e l'implementazione di metriche di carico significative. La configurazione corretta garantisce che un'applicazione possa rispondere a richieste variabili, ottimizzando l'efficienza. Quando si configura la scalabilità, prendere in considerazione le strategie seguenti:

Usare i servizi con scalabilità automatica. La funzionalità di scalabilità automatica ridimensiona automaticamente l'infrastruttura per soddisfare la domanda. Usare le offerte di piattaforma come servizio (PaaS) con funzionalità di scalabilità automatica predefinite. La facilità di scalabilità in PaaS è un vantaggio principale. Ad esempio, il ridimensionamento delle macchine virtuali richiede un servizio di bilanciamento del carico separato, la gestione delle richieste client e lo stato archiviato esternamente. Le offerte PaaS gestiscono la maggior parte di queste attività.

Limita la scalabilità automatica. Impostare limiti di scalabilità automatica per ridurre al minimo il ridimensionamento che potrebbe comportare costi non necessari. A volte non è possibile impostare limiti di ridimensionamento. In questi casi, è necessario impostare avvisi per notificare quando il componente raggiunge il limite massimo di scalabilità e il ridimensionamento eccessivo.

Informazioni sui limiti di scalabilità dei servizi. Quando si comprendono i limiti di scalabilità dei servizi, gli incrementi e le restrizioni, è possibile prendere decisioni informate quando si seleziona un servizio. Il ridimensionamento dei limiti determina se il servizio scelto può gestire il carico di lavoro previsto, ridimensionare in modo efficiente e soddisfare i requisiti di prestazioni dell'applicazione. Ridimensionare i limiti da considerare:

  • Limiti di scalabilità: i limiti di scalabilità sono la capacità massima che un percorso o un servizio può gestire. È importante conoscere questi limiti per garantire che il servizio possa soddisfare il carico di lavoro previsto e gestire l'utilizzo massimo senza riduzione delle prestazioni. Ogni risorsa ha un limite superiore di scalabilità. Se è necessario superare i limiti di scalabilità, è necessario partizionare il carico di lavoro.

  • Incrementi di scalabilità: scalabilità dei servizi a incrementi definiti. Ad esempio, i servizi di calcolo potrebbero ridimensionare per istanze e pod mentre i database potrebbero ridimensionare in base a istanze, unità transazioni e core virtuali. È importante comprendere questi incrementi per ottimizzare l'allocazione delle risorse e impedire il flapping delle risorse.

  • Restrizioni di scalabilità: alcuni servizi consentono di aumentare o ridurre le prestazioni, ma limitare automaticamente la scalabilità inversa. È necessario ridimensionare manualmente o ridistribuire una nuova risorsa. Queste limitazioni sono spesso per proteggere il carico di lavoro. Il ridimensionamento o il ridimensionamento possono avere implicazioni sulla disponibilità e sulle prestazioni del carico di lavoro. Un servizio potrebbe applicare determinate limitazioni o vincoli per garantire che il carico di lavoro disponga di risorse sufficienti per funzionare in modo efficace. Queste limitazioni possono influire sulla coerenza e la sincronizzazione dei dati, soprattutto nei sistemi distribuiti. Il servizio potrebbe disporre di meccanismi per gestire la replica dei dati e la coerenza durante il ridimensionamento o l'uscita, ma potrebbe non fornire lo stesso livello di supporto per il ridimensionamento o l'esecuzione.

Usare metriche di carico significative. Il ridimensionamento deve usare metriche di carico significative come trigger di ridimensionamento. Le metriche di carico significative includono metriche semplici, ad esempio CPU o memoria. Includono anche metriche più avanzate, ad esempio profondità coda, query SQL, query di metriche personalizzate e lunghezza della coda HTTP. Prendere in considerazione l'uso di una combinazione di metriche di carico semplici e avanzate come trigger di scalabilità.

Usare un buffer. Un buffer è una capacità inutilizzata che può essere usata per gestire picchi in richiesta. Piani di carico di lavoro ben progettati per picchi imprevisti nel carico di lavoro. È necessario aggiungere un buffer per gestire i picchi per il ridimensionamento orizzontale e verticale.

Impedisci il flapping. Flapping è una condizione di ciclo che si verifica quando un evento di scalabilità attiva un evento di scalabilità opposto, creando un'azione di scalabilità back-and-forth continua. Ad esempio, se il ridimensionamento riduce il numero di istanze, potrebbe causare l'aumento dell'utilizzo della CPU nelle istanze rimanenti, attivando un evento di scalabilità orizzontale. L'evento di scalabilità orizzontale, a sua volta, causa l'eliminazione dell'utilizzo della CPU, ripetendo il processo.

È importante scegliere un margine adeguato tra le soglie scale-out e scale-in per evitare il flapping. È possibile evitare azioni di scalabilità orizzontale e scalabilità frequenti e non necessarie impostando le soglie che forniscono una differenza significativa nell'utilizzo della CPU.

Usare i francobolli di distribuzione. Esistono tecniche che semplificano la scalabilità di un carico di lavoro. È possibile usare il modello Deployment Stamps per ridimensionare facilmente un carico di lavoro aggiungendo una o più unità di scalabilità.

Rischio: mentre il ridimensionamento consente di ottimizzare i costi modificando la capacità per soddisfare la domanda, può comportare un aumento complessivo dei costi durante lunghi periodi di domanda elevata.

Ridimensionamento dei test

Il ridimensionamento dei test prevede la simulazione di vari scenari di carico di lavoro in un ambiente controllato per valutare la risposta di un carico di lavoro a diversi livelli di domanda. Consente di garantire la scalabilità efficiente del carico di lavoro, ottimizzando l'efficienza delle prestazioni durante carichi diversi.

È necessario assicurarsi che il carico di lavoro venga ridimensionato in modo efficiente in condizioni reali. È essenziale eseguire test di carico e stress in un ambiente che rispecchia la configurazione di produzione. Questi test, eseguiti in ambienti non di produzione, consentono di valutare strategie di scalabilità verticale e orizzontale e determinare quale ottimizza le prestazioni in modo più efficace. Ecco un approccio consigliato per il ridimensionamento dei test:

  • Definire scenari di carico di lavoro. Identificare gli scenari di carico di lavoro chiave necessari per testare, ad esempio l'aumento del traffico utente, le richieste simultanee, il volume di dati o l'uso delle risorse.

  • Usare l'ambiente di test simile alla produzione. Creare un ambiente di test separato che assomiglia strettamente all'ambiente di produzione in termini di infrastruttura, configurazione e dati.

  • Impostare le metriche delle prestazioni. Definire le metriche delle prestazioni da misurare, ad esempio tempo di risposta, velocità effettiva, utilizzo della CPU e della memoria e tassi di errore.

  • Sviluppare test case. Sviluppare test case che simulano diversi scenari di carico di lavoro, aumentando gradualmente il carico per valutare le prestazioni a vari livelli.

  • Eseguire e monitorare i test. Eseguire i test usando i test case definiti e raccogliere i dati sulle prestazioni a ogni livello di carico. Monitorare il comportamento del carico di lavoro, il consumo delle risorse e la riduzione delle prestazioni.

  • Analizzare e ottimizzare il ridimensionamento. Analizzare i risultati del test per identificare i colli di bottiglia delle prestazioni, le limitazioni di scalabilità o le aree per un miglioramento. Ottimizzare la configurazione, l'infrastruttura o il codice per migliorare la scalabilità e le prestazioni. Il completamento del ridimensionamento richiede tempo, quindi testare gli effetti dei ritardi di ridimensionamento.

  • Dipendenze degli indirizzi. Trovare potenziali problemi di dipendenza. Il ridimensionamento o il partizionamento in un'area di un carico di lavoro potrebbero causare problemi di prestazioni in una dipendenza. Le parti con stato di un carico di lavoro, ad esempio i database, sono la causa più comune dei problemi di prestazioni delle dipendenze. I database richiedono un'attenta progettazione per ridimensionare orizzontalmente. È consigliabile prendere in considerazione misure, ad esempio la concorrenza ottimistica o il partizionamento dei dati, per consentire una maggiore velocità effettiva al database.

  • Retest dopo le modifiche. Ripetere i test di scalabilità dopo aver implementato ottimizzazioni per convalidare i miglioramenti e garantire che il carico di lavoro possa gestire in modo efficiente i carichi di lavoro previsti.

Compromesso: prendere in considerazione i vincoli di budget e gli obiettivi di efficienza dei costi del carico di lavoro. La scalabilità verticale potrebbe comportare costi più elevati a causa della necessità di risorse più grandi e più potenti. La scalabilità orizzontale offre risparmi sui costi usando istanze più piccole che possono essere aggiunte o rimosse in base alla richiesta.

Carico di lavoro di partizione

Il partizionamento è il processo di divisione di un set di dati o di un carico di lavoro di grandi dimensioni in parti più piccole e gestibili denominate partizioni. Ogni partizione contiene un subset dei dati o del carico di lavoro ed è in genere archiviato o elaborato separatamente. Il partizionamento consente l'elaborazione parallela e riduce la contesa. La divisione del carico di lavoro in unità più piccole consente all'applicazione di elaborare ogni unità in modo indipendente. Il risultato è un uso migliore delle risorse e tempi di elaborazione più rapidi. Il partizionamento consente inoltre di distribuire i dati in più dispositivi di archiviazione, riducendo il carico nei singoli dispositivi e migliorando le prestazioni complessive.

Informazioni sul partizionamento

L'approccio di partizionamento specifico usato dipende dal tipo di dati o dal carico di lavoro in uso e dalla tecnologia usata. Alcune strategie comuni per il partizionamento includono:

  • Partizionamento orizzontale: in questo approccio il set di dati o il carico di lavoro viene diviso in base a criteri specifici, ad esempio intervalli di valori o attributi specifici. Ogni partizione contiene un subset dei dati che soddisfano i criteri definiti.

  • Partizionamento verticale: in questo approccio il set di dati o il carico di lavoro viene diviso in base a attributi o colonne specifiche. Ogni partizione contiene un subset delle colonne o degli attributi, consentendo l'accesso più efficiente ai dati necessari.

  • Partizionamento funzionale: in questo approccio, i dati o il carico di lavoro vengono suddivisi in base alle funzioni o alle operazioni specifiche che devono essere eseguite. Ogni partizione contiene i dati o i componenti necessari per una funzione specifica, consentendo l'elaborazione ottimizzata e le prestazioni.

Pianificare il partizionamento

È importante considerare fattori come la distribuzione dei dati, i modelli di query, la crescita dei dati e i requisiti del carico di lavoro durante il partizionamento. La pianificazione e la progettazione appropriate sono essenziali per garantire l'efficacia del partizionamento e ottimizzare l'efficienza delle prestazioni. Se si risolve il partizionamento come un'operazione successiva, è più difficile perché è già disponibile un carico di lavoro attivo da gestire. Potrebbe essere necessario modificare la logica di accesso ai dati, distribuire grandi quantità di dati tra partizioni e supportare l'utilizzo continuo durante la distribuzione dei dati.

Implementare il partizionamento

È importante analizzare le caratteristiche dei dati, i modelli di accesso, i requisiti di concorrenza e gli obiettivi di scalabilità quando si decide quale tipo di partizionamento usare. Ogni tipo di partizionamento ha i propri vantaggi e considerazioni. Ecco alcuni fattori da considerare per ogni tipo di partizionamento:

  • Il partizionamento orizzontale è appropriato quando si desidera distribuire i dati tra più risorse o server per migliorare la scalabilità e le prestazioni. È efficace quando il carico di lavoro può essere parallelizzato ed elaborato in modo indipendente in ogni partizione. Prendere in considerazione il partizionamento orizzontale quando più utenti o processi devono poter accedere o aggiornare il set di dati simultaneamente.

  • Il partizionamento verticale è appropriato quando alcuni attributi o colonne vengono spesso accessibili, mentre altri vengono accessibili meno frequentemente. Il partizionamento verticale consente l'accesso efficiente ai dati necessari riducendo al minimo il recupero dei dati non necessari.

  • Il partizionamento funzionale è appropriato quando diverse funzioni richiedono subset diversi dei dati e possono essere elaborati in modo indipendente. Il partizionamento funzionale può ottimizzare le prestazioni consentendo a ogni partizione di concentrarsi su operazioni specifiche.

Testare e ottimizzare il partizionamento

Testare lo schema di partizionamento per verificare l'efficacia e l'efficienza della strategia in modo da poter apportare modifiche per migliorare le prestazioni. Fattori di misura, ad esempio tempo di risposta, velocità effettiva e scalabilità. Confrontare i risultati rispetto agli obiettivi delle prestazioni e identificare eventuali colli di bottiglia o problemi. In base all'analisi, identificare le potenziali opportunità di ottimizzazione. Potrebbe essere necessario ridistribuire i dati tra partizioni, modificare le dimensioni delle partizioni o modificare i criteri di partizionamento.

Compromesso: il partizionamento aggiunge complessità alla progettazione e allo sviluppo di un carico di lavoro. Il partizionamento richiede conversazioni e pianificazione tra sviluppatori e amministratori del database.

Rischio: il partizionamento introduce alcuni potenziali problemi che devono essere considerati e risolti, tra cui:

  • Deviazione dei dati: il partizionamento può causare un'inclinazione dei dati, in cui determinate partizioni ricevono una quantità sproporzionata di dati o carico di lavoro rispetto ad altri. L'inclinazione dei dati può causare squilibri delle prestazioni e un aumento della contesa in partizioni specifiche.

  • Prestazioni delle query: gli schemi di partizionamento progettati in modo non corretto possono influire negativamente sulle prestazioni delle query. Se le query devono accedere ai dati tra più partizioni, potrebbe richiedere un coordinamento e una comunicazione aggiuntive tra le partizioni, con conseguente aumento della latenza.

Facilitazione di Azure

Ottimizzazione del ridimensionamento. Azure ha la capacità dell'infrastruttura per supportare la scalabilità verticale e orizzontale. I servizi di Azure hanno livelli di prestazioni diversi noti come SKU. Gli SKU consentono di ridimensionare verticalmente. Molte delle risorse di Azure supportano il ridimensionamento automatico o altre opzioni di scalabilità sul posto. Alcune risorse supportano metriche avanzate o input personalizzato per supportare il comportamento di ridimensionamento dell'ottimizzazione. La maggior parte delle implementazioni di ridimensionamento in Azure può impostare limiti e supportare l'osservabilità necessaria per ricevere avvisi per la modifica.

Monitoraggio di Azure consente di monitorare diverse metriche e condizioni nelle applicazioni e nell'infrastruttura. È possibile usare Monitoraggio per attivare azioni di ridimensionamento automatizzato in base alle regole predefinite. Ad esempio, in servizio Azure Kubernetes (servizio Azure Kubernetes) è possibile usare Monitoraggio per abilitare il ridimensionamento automatico orizzontale dei pod e il ridimensionamento automatico del cluster. Usando le funzionalità di monitoraggio e avvisi, è possibile facilitare efficacemente il ridimensionamento in Azure e garantire che le applicazioni e l'infrastruttura possano adattarsi dinamicamente per soddisfare la domanda.

È anche possibile creare scalabilità automatica personalizzata in Azure. È possibile usare gli avvisi in Monitoraggio per le risorse che non dispongono di una funzionalità di scalabilità automatica. Questi avvisi possono essere configurati per essere basati su query o basati su metriche e possono eseguire azioni usando Automazione di Azure. Automazione offre una piattaforma per l'hosting e l'esecuzione di codice PowerShell e Python in Azure, nel cloud e negli ambienti locali. Offre funzionalità come la distribuzione di runbook su richiesta o in base a una pianificazione, la cronologia di esecuzione e la registrazione, l'archivio segreti integrato e l'integrazione del controllo del codice sorgente.

Progettazione dell'applicazione per la scalabilità: ecco alcuni modi in cui Azure facilita la progettazione del ridimensionamento delle applicazioni;

  • Eliminazione del blocco dei dati: in Azure SQL Database è possibile abilitare il blocco ottimizzato per migliorare le prestazioni nei database che richiedono coerenza rigorosa.

  • Uso delle attività in background: Azure offre servizi e linee guida per l'implementazione di processi in background. Per altre informazioni, vedere Processi in background.

  • Implementazione del bilanciamento del carico: Azure offre servizi di bilanciamento del carico che non richiedono affinità client. Questi servizi di bilanciamento del carico includono Frontdoor di Azure, gateway applicazione di Azure e Azure Load Balancer.

Partizionamento di un carico di lavoro: Azure offre varie strategie di partizionamento per archivi dati diversi. Queste strategie consentono di migliorare le prestazioni e la scalabilità distribuendo i dati tra più partizioni. Per altre informazioni, vedere Strategie di partizione dei dati.

Elenco di controllo dell'efficienza delle prestazioni

Fare riferimento al set completo di raccomandazioni.