Linee guida per tasso di richieste e distribuzione degli accessi

Cloud Storage è un servizio altamente scalabile che utilizza la tecnologia di scalabilità automatica per raggiungere tassi di richieste molto elevati. Questa pagina illustra le linee guida per l'ottimizzazione della scalabilità e delle prestazioni fornite da Cloud Storage.

Scalabilità automatica

Cloud Storage è un servizio multi-tenant, il che significa che gli utenti condividono lo stesso insieme di risorse sottostanti. Per utilizzare al meglio queste risorse condivise, i bucket hanno una capacità di I/O iniziale di:

  • Circa 1000 richieste di scrittura di oggetti al secondo, inclusi caricamento, aggiornamento ed eliminazione di oggetti. Tieni presente che Cloud Storage ha anche un limite inferiore per le scritture ripetute nello stesso nome dell'oggetto.
  • Circa 5000 richieste di lettura di oggetti al secondo, inclusi l'elenco degli oggetti, la lettura dei dati degli oggetti e la lettura dei metadati degli oggetti.

Questi tassi di lettura e scrittura iniziali sono in media di 2,5 PB scritti e 13 PB letti in un mese per gli oggetti da 1 MB. Man mano che il tasso di richieste per un determinato bucket aumenta, Cloud Storage esegue la scalabilità automatica e aumenta automaticamente la capacità di I/O per quel bucket distribuendo il carico delle richieste su più server.

Tempo di ridistribuzione del carico

Quando un bucket si avvicina al limite della capacità di I/O, Cloud Storage in genere impiega alcuni minuti per rilevare e ridistribuire di conseguenza il carico su più server. Di conseguenza, se il tasso di richieste sul bucket aumenta più rapidamente di quanto Cloud Storage possa eseguire questa ridistribuzione, potresti riscontrare limiti temporanei, in particolare latenza e tassi di errore più elevati. L'aumento graduale del tasso di richieste per i bucket, come descritto di seguito, evita questa latenza ed errori.

Indicizzazione delle chiavi degli oggetti

Cloud Storage supporta l'elenco coerente degli oggetti, che consente agli utenti di eseguire facilmente flussi di lavoro di elaborazione dei dati su Cloud Storage. Per fornire un elenco coerente degli oggetti, Cloud Storage gestisce un indice delle chiavi degli oggetti per ogni bucket. Questo indice viene memorizzato in ordine lessicografico e viene aggiornato ogni volta che gli oggetti vengono scritti o eliminati da un bucket. L'aggiunta e l'eliminazione di oggetti le cui chiavi esistono in un piccolo intervallo dell' indice aumenta naturalmente le probabilità di contesa.

Cloud Storage rileva questa contesa, nota anche come hotspotting, e ridistribuisce automaticamente il carico sull'intervallo di indici interessato su più server. Analogamente alla scalabilità della capacità di I/O di un bucket, quando accedi a un nuovo intervallo dell'indice, ad esempio quando scrivi oggetti con un nuovo prefisso, devi aumentare gradualmente il tasso di richieste, come descritto di seguito. In caso contrario, potresti riscontrare temporaneamente latenza e tassi di errore più elevati.

Best practice

Le sezioni seguenti forniscono le best practice su come aumentare il tasso di richieste, scegliere le chiavi degli oggetti e distribuire le richieste per evitare limiti temporanei sul bucket. Tieni presente che, oltre a queste considerazioni per bucket , esistono anche limiti di larghezza di banda combinati che si applicano ai bucket che si trovano nella stessa località e nello stesso progetto.

Aumentare gradualmente il tasso di richieste

Per garantire che la scalabilità automatica di Cloud Storage fornisca sempre le prestazioni migliori, devi aumentare gradualmente il tasso di richieste per qualsiasi bucket che non abbia avuto un tasso di richieste elevato per diversi giorni o che abbia un nuovo intervallo di chiavi degli oggetti. Se il tasso di richieste è inferiore a 1000 richieste di scrittura al secondo o 5000 richieste di lettura al secondo, non è necessario alcun aumento. Se prevedi che il tasso di richieste superi queste soglie, devi iniziare con un tasso di richieste inferiore o vicino alle soglie e poi aumentarlo gradualmente, non più rapidamente del raddoppio del tasso in un periodo di 20 minuti.

Se riscontri problemi come aumento della latenza o dei tassi di errore, metti in pausa l'aumento o riduci temporaneamente il tasso di richieste per dare a Cloud Storage più tempo per scalare il bucket. Devi riprovare a inviare le richieste con backoff esponenziale quando:

  • Ricevi errori con i codici di risposta 408 e 429.
  • Ricevi errori con i codici di risposta 5xx.

I bucket con lo spazio dei nomi gerarchico abilitato offrono limiti di query al secondo (QPS) iniziali fino a 8 volte superiori per la lettura e la scrittura degli oggetti rispetto ai bucket senza lo spazio dei nomi gerarchico abilitato. Il QPS iniziale più elevato semplifica la scalabilità dei carichi di lavoro che richiedono un uso intensivo dei dati e offre un throughput migliorato. Per saperne di più sull'abilitazione dello spazio dei nomi gerarchico nel bucket, consulta Creare un bucket con lo spazio dei nomi gerarchico abilitato.

Utilizzare una convenzione di denominazione che distribuisca il carico in modo uniforme tra gli intervalli di chiavi

La scalabilità automatica di un intervallo di indici può essere rallentata quando si utilizzano nomi sequenziali, ad esempio chiavi degli oggetti basate su una sequenza di numeri o timestamp. Ciò si verifica perché le richieste passano costantemente a un nuovo intervallo di indici, rendendo più difficile e meno efficace la ridistribuzione del carico.

Per mantenere un tasso di richieste elevato, evita di utilizzare nomi sequenziali. L'utilizzo di nomi di oggetti completamente casuali offre la migliore distribuzione del carico. Se vuoi utilizzare numeri o timestamp sequenziali come parte dei nomi degli oggetti, aggiungi un valore hash prima del numero di sequenza o del timestamp per introdurre la casualità nei nomi degli oggetti.

Ad esempio, se i nomi degli oggetti originali che vuoi utilizzare sono:

my-bucket/2016-05-10-12-00-00/file1
my-bucket/2016-05-10-12-00-00/file2
my-bucket/2016-05-10-12-00-01/file3
...

Puoi calcolare l'hash MD5 del nome dell'oggetto originale e aggiungere i primi 6 caratteri dell'hash come prefisso al nome dell'oggetto. I nuovi nomi degli oggetti diventano:

my-bucket/2fa764-2016-05-10-12-00-00/file1
my-bucket/5ca42c-2016-05-10-12-00-00/file2
my-bucket/6e9b84-2016-05-10-12-00-01/file3
...

Un prefisso casuale più lungo offre una scalabilità automatica più efficace quando si aumentano i tassi di lettura e scrittura molto elevati. Ad esempio, un prefisso di 1 carattere che utilizza un valore esadecimale casuale fornisce una scalabilità automatica efficace dalle 5000/1000 letture/scritture iniziali al secondo fino a circa 80000/16000 letture/scritture al secondo, perché il prefisso ha 16 valori potenziali. Se il tuo caso d'uso non richiede tassi più elevati, un prefisso casuale di 1 carattere è efficace quanto un prefisso casuale di 2 o più caratteri per aumentare i tassi di richieste.

La casualità dopo un prefisso comune è efficace sotto il prefisso

Tieni presente che la stringa casuale non deve necessariamente trovarsi all'inizio del nome dell'oggetto. L'aggiunta di una stringa casuale dopo un prefisso comune consente comunque alla scalabilità automatica di funzionare, ma l'effetto è limitato a quel prefisso, senza considerare il resto del bucket.

Ad esempio:

my-bucket/images/animals/4ce4c6af-6d27-4fa3-8a91-5701a8552705/1.jpg
my-bucket/images/animals/9a495e72-1d85-4637-a243-cbf3e4a90ae7/2.jpg
...
my-bucket/images/landscape/585356ac-ce89-47a8-bdd2-78a86b58fee6/1.jpg
my-bucket/images/landscape/2550ae5b-395e-4243-a29b-bbf5aece60ef/2.jpg
...
my-bucket/images/clouds/1.jpg
my-bucket/images/clouds/2.jpg
...

La denominazione sopra indicata consente una scalabilità automatica efficiente degli oggetti in images/animals e images/landscape, ma non images/clouds.

La casualità dopo i prefissi sequenziali non è altrettanto efficace

Come accennato in precedenza, l'utilizzo di una stringa casuale dopo un prefisso comune aiuta solo la scalabilità automatica sotto quel prefisso. Una volta che le richieste passano a un nuovo prefisso, potresti non usufruire più degli effetti di scalabilità automatica precedenti. Questo è un problema soprattutto quando i prefissi seguono un pattern sequenziale.

Ad esempio, se scrivi file con un nuovo prefisso basato sul timestamp ogni ora:

my-bucket/2016-05-10-00/cf9a7b95-0d2e-4466-9596-840ff388ddbd
my-bucket/2016-05-10-00/f1e16a88-16b8-4c66-ba66-a225c87be80c
my-bucket/2016-05-10-00/646d8272-4a88-4dc2-b2d4-d537c778df41
...
my-bucket/2016-05-10-01/bdcba6de-ac25-4c27-8550-0d08f249e69d
my-bucket/2016-05-10-01/a32c867c-09a9-4d65-9668-ddd4ebe4138b
my-bucket/2016-05-10-01/d619485c-5243-4a4e-8ef3-0f7e1d26ce1d
...

Sebbene la scalabilità automatica contribuisca ad aumentare il tasso di scrittura sotto un prefisso nel tempo, il tasso di scrittura viene reimpostato all'inizio di ogni ora. Ciò comporta un tasso di scrittura non ottimale e aumenti periodici della latenza e del tasso di errore. Se devi scrivere su prefissi diversi nel tempo, per evitare questo problema, assicurati che i nuovi prefissi siano distribuiti uniformemente nell'intero intervallo di chiavi.

Riordinare le operazioni collettive per distribuire il carico in modo uniforme tra gli intervalli di chiavi

A volte potresti voler eseguire un caricamento o un'eliminazione collettiva dei dati in Cloud Storage. In entrambi i casi, potresti non avere il controllo sui nomi degli oggetti. Tuttavia, puoi controllare l'ordine in cui gli oggetti vengono caricati o eliminati per ottenere il tasso di scrittura o eliminazione più elevato possibile.

Per farlo, devi distribuire i caricamenti o le eliminazioni su più prefissi. Ad esempio, se hai molte cartelle e molti file in ogni cartella da caricare, una buona strategia è caricare da più cartelle in parallelo e scegliere in modo casuale le cartelle e i file da caricare. In questo modo, il sistema può distribuire il carico in modo più uniforme nell'intero intervallo di chiavi, il che ti consente di raggiungere un tasso di richieste elevato dopo l'aumento iniziale.

Passaggi successivi