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
e429
. - 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
- Esamina le quote e i limiti di Cloud Storage.
- Scopri i metodi di ripetizione consigliati per le richieste a Cloud Storage.