Linee guida per tasso di richieste e distribuzione degli accessi

Cloud Storage è un servizio a scalabilità elevata che utilizza la tecnologia di scalabilità automatica per ottenere tassi di richieste molto elevati. In questa pagina sono riportate le linee guida per ottimizzare la scalabilità e le prestazioni offerte da Cloud Storage.

Scalabilità automatica

Cloud Storage è un servizio multi-tenant, nel senso 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 pari a:

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

La media di queste velocità di lettura e scrittura iniziali è di 2,5 PB in scrittura e 13 PB in lettura al mese per oggetti da 1 MB. All'aumentare del tasso di richieste per un determinato bucket, Cloud Storage scala automaticamente e aumenta automaticamente la capacità di I/O per quel bucket distribuendo il carico delle richieste su più server.

Tempo di ridistribuzione del carico

Man mano che un bucket si avvicina al limite di capacità di I/O, Cloud Storage in genere impiega nell'ordine di minuti per rilevare e ridistribuire il carico su più server. Di conseguenza, se il tasso di richieste nel tuo bucket aumenta più rapidamente di quanto Cloud Storage possa eseguire questa ridistribuzione, potresti incorrere in limiti temporanei, in particolare una latenza più alta e tassi di errore più elevati. Aumentare gradualmente il tasso di richieste per i bucket, come descritto di seguito, evita tale latenza ed errori.

Indicizzazione delle chiavi degli oggetti

Cloud Storage supporta l'elenco di oggetti coerenti, che consente agli utenti di eseguire facilmente flussi di lavoro di elaborazione dati su Cloud Storage. Per offrire un elenco coerente di oggetti, Cloud Storage conserva un indice di chiavi oggetto per ciascun bucket. Questo indice è archiviato in ordine lessicografico e viene aggiornato ogni volta che gli oggetti vengono scritti in o eliminati da un bucket. L'aggiunta e l'eliminazione di oggetti le cui chiavi sono presenti tutte in un piccolo intervallo dell'indice aumenta naturalmente le probabilità di contesa.

Cloud Storage rileva questo conflitto, noto anche come hotspotting, e ridistribuisce automaticamente il carico sull'intervallo dell'indice interessato su più server. Come per la 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, dovresti aumentare gradualmente la frequenza delle richieste, come descritto di seguito. In caso contrario, la latenza e i tassi di errore potrebbero essere più elevati.

best practice

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

Incrementa il tasso di richieste gradualmente

Per garantire che la scalabilità automatica di Cloud Storage offra sempre le migliori prestazioni, devi aumentare gradualmente la frequenza di richieste per tutti i bucket che non hanno registrato un tasso di richieste elevato per diversi giorni o che hanno un nuovo intervallo di chiavi degli oggetti. Se la percentuale di richieste è inferiore a 1000 richieste di scrittura al secondo o 5000 richieste di lettura al secondo, non è necessario alcun accelerazione. Se prevedi che il tasso di richieste supererà queste soglie, ti consigliamo di iniziare con un tasso di richieste inferiore o vicino alle soglie, per poi aumentare gradualmente la frequenza non prima di raddoppiarla in un periodo di 20 minuti.

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

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

Utilizza una convenzione di denominazione che distribuisca il carico in modo uniforme tra gli intervalli chiave

La scalabilità automatica di un intervallo di indice può essere rallentata quando si utilizzano nomi sequenziali, ad esempio chiavi oggetto basate su una sequenza di numeri o timestamp. Questo accade perché le richieste si spostano costantemente in un nuovo intervallo di indici, rendendo la ridistribuzione del carico più difficile e meno efficace.

Per mantenere un tasso di richieste elevato, evita di utilizzare nomi sequenziali. L'uso di nomi degli oggetti completamente casuali offre la migliore distribuzione del carico. Se vuoi utilizzare numeri sequenziali o timestamp nei nomi degli oggetti, introduci la casualità nei nomi degli oggetti aggiungendo un valore hash prima del numero di sequenza o del timestamp.

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 originale dell'oggetto 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 randomizzato più lungo fornisce una scalabilità automatica più efficace in caso di velocità di lettura e scrittura molto elevata. Ad esempio, un prefisso di 1 carattere che utilizza un valore esadecimale casuale fornisce una scalabilità automatica efficace dalle prime 5000/1000 letture/scritture al secondo fino a circa 80.000/16.000 letture/scritture al secondo, perché il prefisso ha 16 valori potenziali. Se il tuo caso d'uso non ha bisogno di tariffe più elevate di un prefisso casuale di 1 carattere, per incrementare il numero di richieste è efficace quanto un prefisso randomizzato di due caratteri o più lungo.

La casualità dopo un prefisso comune viene applicata 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 il funzionamento della scalabilità automatica, 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 precedente consente una scalabilità automatica efficiente degli oggetti in images/animals e images/landscape, ma non in images/clouds.

La casualità dopo prefissi sequenziali non è così efficace

Come accennato in precedenza, l'utilizzo di una stringa casuale dopo un prefisso comune contribuisce solo alla scalabilità automatica per quel prefisso. Quando le richieste passano a un nuovo prefisso, potresti non trarre più vantaggio dai precedenti effetti di scalabilità automatica. Questo crea un problema soprattutto quando i prefissi seguono uno schema sequenziale.

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

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 aiuti ad aumentare la frequenza di scrittura con un prefisso nel tempo, la frequenza di scrittura viene reimpostata all'inizio di ogni ora. Ciò si traduce in una frequenza di scrittura non ottimale e in aumenti periodici della latenza e della percentuale di errori. Se nel tempo devi scrivere con prefissi diversi, assicurati che i nuovi prefissi siano distribuiti uniformemente nell'intero intervallo di chiavi per evitare questo problema.

Riordina le operazioni collettive per distribuire il carico in modo uniforme tra gli intervalli chiave

A volte potrebbe essere necessario eseguire un caricamento collettivo o un'eliminazione di 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 la frequenza di scrittura o eliminazione più elevata possibile.

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

Passaggi successivi