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 velocità di richiesta molto elevate. Questa pagina definisce le linee guida per ottimizzare la scalabilità e le prestazioni fornite da Cloud Storage.

Scalabilità automatica

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

  • Circa 1000 richieste di scrittura di oggetti al secondo, inclusi il caricamento, l'aggiornamento e l'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, inclusi elenco di oggetti, lettura di dati di oggetti e lettura di metadati degli oggetti.

Queste frequenze di lettura e scrittura iniziali sono in media di 2,5 PB di scrittura e 13 PB di lettura in un mese per oggetti da 1 MB. Man mano che la frequenza di richiesta per un determinato bucket aumenta, Cloud Storage scala automaticamente e aumenta automaticamente la capacità di I/O per quel bucket, distribuendo il carico delle richieste su più server.

Carica tempo di ridistribuzione

Quando un bucket si avvicina al limite di capacità di IO, Cloud Storage richiede in genere minuti per rilevare e ridistribuire il carico su più server. Di conseguenza, se la frequenza delle richieste nel tuo bucket aumenta più velocemente di quanto Cloud Storage possa eseguire questa ridistribuzione, potresti incorrere in limiti temporanei, in particolare maggiori percentuali di latenza ed errori. Aumentare gradualmente la frequenza delle richieste per i bucket, come descritto di seguito, eviti tali latenza ed errori.

Indicizzazione delle chiavi degli oggetti

Cloud Storage supporta l'elenco di oggetti coerente, che consente agli utenti di eseguire facilmente flussi di lavoro di elaborazione dati verso Cloud Storage. Per fornire una scheda degli oggetti coerente, Cloud Storage gestisce un indice delle chiavi oggetto 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 sono presenti in un intervallo limitato dell'indice aumenta naturalmente le possibilità di contenzione.

Cloud Storage rileva tale connotazione, nota anche come hotspot, e ridistribuisce automaticamente il carico sull'intervallo di indice interessato su più server. Come per la scalabilità della capacità IO di un bucket, quando accedi a un nuovo intervallo di indice, ad esempio quando scrivi gli oggetti sotto un nuovo prefisso, devi aumentare gradualmente la frequenza delle richieste, come descritto di seguito. In caso contrario, la latenza e i tassi di errore potrebbero risultare temporaneamente più alti.

Best practice

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

Incrementare gradualmente il tasso di richieste

Per garantire che la scalabilità automatica di Cloud Storage fornisca sempre le migliori prestazioni, devi aumentare gradualmente la frequenza di richiesta per i bucket che non hanno registrato una frequenza di richiesta elevata in diversi giorni o che hanno una nuova gamma di chiavi di oggetto. Se la frequenza di richiesta è inferiore a 1000 richieste di scrittura al secondo o a 5000 richieste di lettura al secondo, non è necessario creare incrementi. Se la frequenza di richiesta dovrebbe superare queste soglie, dovresti iniziare con una frequenza di richiesta inferiore o vicina alle soglie, per poi raddoppiare la velocità non più veloce di ogni 20 minuti.

Se si verificano problemi, come una maggiore latenza o tassi di errore, metti in pausa la ramp-up o riduci temporaneamente la frequenza di richiesta per concedere a Cloud Storage più tempo per scalare il bucket. Devi utilizzare il backoff esponenziale per ritentare le richieste quando:

  • Ricezione di errori con i codici di risposta 408 e 429.
  • Ricezione di errori con i codici di risposta di 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 le chiavi degli oggetti in base a una sequenza di numeri o timestamp. Ciò accade perché le richieste vengono spostate continuamente in un nuovo intervallo di indice, rendendo il deployment del carico più difficile e meno efficace.

Per mantenere un'elevata frequenza di richieste, evita di utilizzare nomi sequenziali. L'utilizzo di nomi di oggetti completamente casuali garantisce la migliore distribuzione del carico. Se vuoi utilizzare numeri o timestamp sequenziali come parte dei nomi degli oggetti, introduci casualmente i nomi degli oggetti aggiungendo un valore hash prima del numero di sequenza o del timestamp.

Ad esempio, se i nomi degli oggetti originali da 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 casuale più lungo offre una scalabilità automatica più efficace in caso di passaggio a frequenze di lettura e scrittura molto elevate. Ad esempio, un prefisso di 1 carattere con un valore esadecimale casuale fornisce una scalabilità automatica effettiva dalla velocità iniziale di 5000/1000 letture/scrittura al secondo fino a circa 80000/16000 operazioni di lettura/scrittura al secondo, perché il prefisso ha 16 valori potenziali. Se il tuo caso d'uso non richiede tariffe più elevate, un prefisso randomizzato di 1 carattere ha la stessa efficacia per incrementare le percentuali di richiesta rispetto al prefisso casuale 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 essere 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 tale prefisso, senza tenere conto del 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 è così efficace

Come menzionato sopra, l'utilizzo di una stringa casuale dopo un prefisso comune è utile solo per la scalabilità automatica in quel prefisso. Quando le richieste passano a un nuovo prefisso, potresti non trarre più vantaggio dagli effetti di scalabilità automatica precedenti. Ciò è particolarmente importante quando i prefissi seguono un pattern sequenziale.

Ad esempio, se scrivi i 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
...

Anche se la scalabilità automatica consente di aumentare la frequenza di scrittura sotto un prefisso nel tempo, viene reimpostata all'inizio di ogni ora. Ne consegue una frequenza di scrittura non ottimale e aumenti periodici della latenza e della percentuale di errori. Se devi scrivere su prefissi diversi nel corso del 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 in modo da ottenere la massima frequenza di scrittura o eliminazione possibile.

A tale scopo, devi distribuire i caricamenti o i eliminazioni tra più prefissi. Ad esempio, se hai molte cartelle e molti file in ciascuna cartella da caricare, una buona strategia è quella di caricare file da più cartelle in parallelo e scegliere in modo casuale quali cartelle e file sono caricati. In questo modo, il sistema può distribuire il carico in modo più uniforme per l'intero intervallo di chiavi, in modo da ottenere una percentuale di richiesta elevata dopo l'applicazione iniziale.

Passaggi successivi