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 richiesta molto elevati. Questa pagina fornisce le linee guida per l'ottimizzazione la scalabilità e le prestazioni offerte da Cloud Storage.

Scalabilità automatica

Cloud Storage è un servizio multi-tenant, il che significa che gli utenti condividono nello stesso insieme di risorse sottostanti. Per sfruttare al meglio i contenuti condivisi risorse, i bucket hanno una capacità di I/O iniziale pari a:

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

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

Tempo di ridistribuzione del caricamento

Quando un bucket si avvicina al limite di capacità di I/O, in genere Cloud Storage impiega nell'ordine dei minuti per rilevare e di conseguenza ridistribuire il carico su più server. Di conseguenza, se la tasso di richieste sul tuo bucket aumenta più rapidamente di quanto sia in grado di eseguire la ridistribuzione da Cloud Storage, potrebbero imbattersi in limiti temporanei, in particolare una maggiore latenza e tassi di errore. Aumentare gradualmente la tasso di richieste per i bucket, come descritto di seguito evitando tempi di latenza ed errori simili.

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 dei dati su Cloud Storage. Per fornire un elenco di oggetti coerente, Cloud Storage gestisce un indice delle chiavi degli oggetti per ogni bucket. Questo indice viene archiviato in ordine alfabetico e viene aggiornato ogni volta che gli oggetti vengono scritti o eliminati da un bucket. L'aggiunta ed eliminazione di oggetti le cui chiavi esistono tutte in un piccolo intervallo dell'indice aumentano naturalmente le probabilità di concorrenza.

Cloud Storage rileva tali conflitti, noti anche come hotspot e si ridistribuisce automaticamente il carico sull'intervallo dell'indice interessato su più server. Simile alla scalabilità la capacità IO di un bucket, quando si accede a un nuovo intervallo dell'indice, come quando scrivi oggetti con un nuovo prefisso, devi incrementare la richiesta la valutazione in modo graduale, come descritto di seguito. In caso contrario, potrebbero verificarsi la latenza e i tassi di errore sono temporaneamente più elevati.

Best practice

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

Aumento graduale del tasso di richieste

Per assicurarti che la scalabilità automatica di Cloud Storage offra sempre le migliori prestazioni, devi aumentare gradualmente il tasso di richieste per tutti i bucket che non hanno registrato un tasso di richieste elevato da diversi giorni o che hanno un nuovo intervallo di chiavi degli oggetti. Se la frequenza delle richieste è inferiore a 1000 richieste di scrittura al secondo o 5000 richieste di lettura al secondo, non è necessario alcun periodo di transizione. Se le tue se il tasso di richieste deve superare queste soglie, devi iniziare con un tasso di richieste inferiore o vicino alle soglie e quindi di aumentare gradualmente la percentuale non più velocemente che raddoppiare la frequenza in un periodo di 20 minuti.

Se riscontri problemi come un aumento della latenza o delle percentuali di errore, metti in pausa la fase di implementazione o riduci temporaneamente la frequenza delle richieste per dare a Cloud Storage più tempo per scalare il bucket. Devi effettuare nuovi tentativi per le richieste con backoff esponenziale quando:

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

Utilizza una convenzione di denominazione che distribuisce il carico in modo uniforme tra gli intervalli di chiavi

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

Per mantenere un tasso di richieste elevato, evita di usare i nomi degli utenti. L'utilizzo di nomi di oggetti completamente casuali offre il carico migliore distribuzione dei contenuti. Se vuoi utilizzare numeri sequenziali o timestamp come parte 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 originali degli oggetti 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 il primo 6 caratteri dell'hash come prefisso al nome dell'oggetto. Il nuovo oggetto i nomi 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 passa a velocità di lettura e scrittura molto elevate. Ad esempio, un prefisso di 1 carattere che utilizza un un valore esadecimale casuale fornisce una scalabilità automatica effettiva dall'iniziale valore 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 richiede un aumento superiore, un prefisso casuale di 1 carattere è altrettanto efficace per aumentare le frequenze di richiesta di un prefisso casuale di 2 caratteri o più.

La casualità dopo che un prefisso comune diventa effettivo sotto il prefisso

Tieni presente che la stringa casuale non deve essere necessariamente all'inizio del nome dell'oggetto. L'aggiunta di una stringa casuale dopo un prefisso comune consente il funzionamento della scalabilità automatica, ma l'effetto è limitato a quel prefisso, con 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 riportata sopra consente una scalabilità automatica efficiente degli oggetti in images/animals e images/landscape,, ma non in images/clouds.

La casualità dopo i prefissi sequenziali non è altrettanto efficace

Come già detto, l'utilizzo di una stringa casuale dopo un prefisso comune aiuta solo con con la scalabilità automatica sotto quel prefisso. Quando le richieste passano a un nuovo prefisso, puoi non usufruiscono più dei precedenti effetti di scalabilità automatica. In particolare quando i prefissi seguono uno schema sequenziale.

Ad esempio, se scrivi file sotto un nuovo prefisso basato su 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 aiuti ad aumentare la velocità di scrittura sotto un prefisso rispetto di scrittura, la frequenza di scrittura viene reimpostata all'inizio di ogni ora. Questo porta con una frequenza di scrittura non ottimale e con aumenti periodici della latenza e del tasso di errore. Se devi scrivere in 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 collettivo o un'eliminazione di dati in di archiviazione ideale in Cloud Storage. In entrambi i casi, potresti non avere il controllo sull'oggetto i nomi degli utenti. Tuttavia, puoi controllare l'ordine di caricamento degli oggetti o eliminati per ottenere la più alta velocità di scrittura o eliminazione possibile.

A tal fine, devi distribuire i caricamenti o le eliminazioni su più prefissi. Ad esempio, se in ogni cartella sono presenti molte cartelle e molti file caricare, una buona strategia è eseguire caricamenti in parallelo da più cartelle scegliere casualmente quali cartelle e file vengono caricati. In questo modo il sistema di distribuire il carico in modo più uniforme sull'intero intervallo di chiavi, per raggiungere una percentuale elevata di richieste dopo l'avvio iniziale.

Passaggi successivi