Cloud Storage est un service ultra évolutif qui exploite la technologie d'autoscaling pour atteindre des taux de requêtes très élevés. Cette page explique comment optimiser le scaling et les performances fournis par Cloud Storage.
Autoscaling
Cloud Storage est un service mutualisé, ce qui signifie que les utilisateurs partagent le même ensemble de ressources sous-jacentes. Afin d'optimiser l'utilisation de ces ressources partagées, les buckets ont une capacité d'E/S initiale suivante :
- Environ 1 000 requêtes d'écriture d'objets par seconde. Ces opérations incluent l'importation, la mise à jour et la suppression d'objets. Notez que Cloud Storage présente également une limite plus faible pour les écritures répétées sur le même nom d'objet.
- Environ 5 000 requêtes de lecture d'objets par seconde. Ces opérations incluent la création de listes d'objets, la lecture de données d'objets et la lecture de métadonnées d'objets.
Ces taux initiaux de lecture et d'écriture permettent en moyenne d'écrire 2,5 Po de données et d'en lire 13 Po par mois pour des objets de 1 Mo. À mesure que le taux de requêtes s'accroît sur un bucket donné, Cloud Storage effectue un autoscaling et augmente automatiquement la capacité d'E/S sur ce bucket en répartissant la charge de requêtes sur plusieurs serveurs.
Délai de répartition de la charge
Lorsqu'un bucket approche de sa limite de capacité d'E/S, Cloud Storage met généralement quelques minutes à détecter la charge et à la répartir en conséquence sur davantage de serveurs. Donc, si le taux de requêtes sur votre bucket augmente plus rapidement que la capacité de Cloud Storage à répartir la charge, vous risquez d'être confronté à des restrictions temporaires et notamment de subir une latence et des taux d'erreur plus élevés. Pour éviter ce genre de situation, vous pouvez augmenter progressivement le taux de requêtes sur vos buckets, comme décrit ci-dessous.
Indexation des clés d'objet
Cloud Storage permet de répertorier les objets de manière cohérente pour que les utilisateurs puissent facilement exécuter des workflows de traitement des données sur le service. Afin de fournir des listes d'objets cohérentes, Cloud Storage gère un index de clés d'objet pour chaque bucket. Cet index est stocké dans l'ordre lexicographique et mis à jour chaque fois qu'un objet est créé dans un bucket ou supprimé d'un bucket. L'ajout ou la suppression d'objets dont toutes les clés se trouvent dans une petite plage d'index augmente naturellement les risques de conflit.
Cloud Storage détecte ces conflits, également appelés "hotspotting", et répartit automatiquement la charge sur la plage d'index affectée entre plusieurs serveurs. À l'instar du scaling de la capacité d'E/S d'un bucket, il est conseillé d'augmenter progressivement le taux de requêtes lorsque vous accédez à une nouvelle plage de l'index ou que vous écrivez des objets sous un nouveau préfixe, comme décrit ci-dessous. Sinon, votre latence et vos taux d'erreur pourraient temporairement s'accroître.
Bonnes pratiques
Les sections suivantes décrivent les bonnes pratiques à adopter lors de l'augmentation progressive du taux de requêtes, du choix des clés d'objet et de la répartition des requêtes afin d'éviter d'être soumis à des restrictions temporaires sur votre bucket. Notez qu'en plus de ces considérations par bucket, des limites de bande passante combinées s'appliquent également aux buckets situés dans le même emplacement et le même projet.
Augmenter progressivement le taux de requêtes
Pour garantir un autoscaling optimal dans Cloud Storage, vous devez augmenter progressivement votre taux de requêtes sur les buckets qui n'ont pas rencontré un taux élevé au cours des derniers jours ou qui disposent d'une nouvelle plage de clés d'objet. Si votre taux de requêtes est inférieur à 1 000 requêtes d'écriture ou à 5 000 requêtes de lecture par seconde, aucune augmentation n'est nécessaire. S'il devait dépasser ces seuils, vous devriez commencer par choisir un taux de requêtes inférieur ou proche de ces derniers, puis l'augmenter progressivement, sans excéder une cadence d'un doublement par période de 20 minutes.
Si vous rencontrez des problèmes tels qu'une latence ou des taux d'erreur élevés, cessez d'augmenter progressivement le taux de requêtes ou réduisez-le temporairement pour laisser à Cloud Storage le temps d'adapter le bucket. Vous devez relancer vos requêtes avec un intervalle exponentiel entre les tentatives dans les cas suivants :
- Erreurs générées avec des codes de réponse
408et429 - Erreurs générées avec des codes de réponse
5xx
Les buckets avec l'espace de noms hiérarchique activé offrent des limites initiales de requêtes par seconde (RPS) jusqu'à huit fois plus élevées pour la lecture et l'écriture d'objets par rapport aux buckets sans espace de noms hiérarchique activé. La limite initiale de RPS plus élevée facilite l'adaptation des charges de travail utilisant beaucoup de données et améliore le débit. Pour savoir comment activer l'espace de noms hiérarchique sur votre bucket, consultez Créer un bucket avec l'espace de noms hiérarchique activé.
Utiliser une convention d'attribution de nom qui répartit la charge uniformément entre les plages de clés
L'autoscaling d'une plage d'index peut être ralenti lorsque vous utilisez des noms séquentiels, tels que des clés d'objet basées sur une séquence de chiffres ou sur un code temporel. Ce phénomène est dû au fait que les requêtes passent constamment à d'autres plages d'index, ce qui complique la répartition de la charge et la rend moins efficace.
Afin de maintenir un taux de requêtes élevé, évitez d'utiliser des noms séquentiels. Employez plutôt des noms d'objet aléatoires, qui optimiseront la répartition de la charge. Si vous souhaitez utiliser des numéros séquentiels ou des codes temporels dans vos noms d'objet, intégrez-y une chaîne aléatoire en ajoutant une valeur de hachage avant le numéro de séquence ou le code temporel.
Supposons par exemple que vous souhaitiez utiliser les noms d'objet d'origine suivants :
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 ...
Vous pouvez calculer le hachage MD5 du nom d'objet d'origine et ajouter les six premiers caractères du hachage en tant que préfixe de ce nom. Les objets prennent alors les noms suivants :
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 préfixe aléatoire plus long permet un autoscaling plus efficace lorsqu'il est soumis à des taux de lecture et d'écriture très élevés. Par exemple, un préfixe à 1 caractère utilisant une valeur hexadécimale aléatoire permet un autoscaling efficace de 5 000/1 000 lectures/écritures par seconde à environ 80 000/16 000 lectures/écritures par seconde, car le préfixe comporte 16 valeurs potentielles. Si votre cas d'utilisation ne nécessite pas de taux plus élevés que ces valeurs, un préfixe aléatoire à 1 caractère est tout aussi efficace qu'un préfixe aléatoire à 2 caractères ou plus pour accroître le taux des requêtes.
L'ajout d'une chaîne aléatoire après un préfixe commun s'avère efficace pour les éléments comportant le préfixe
Notez que la chaîne aléatoire ne doit pas nécessairement se situer au début du nom d'objet. L'ajout d'une chaîne aléatoire après un préfixe commun n'entravera pas l'autoscaling, mais l'effet se limitera au préfixe, sans tenir compte du reste du bucket.
Exemple :
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 ...
Les noms ci-dessus permettent d'obtenir un autoscaling efficace des objets dans images/animals et images/landscape,, mais pas dans images/clouds.
L'ajout d'une chaîne aléatoire après des préfixes séquentiels n'est pas aussi efficace
Comme mentionné ci-dessus, l'utilisation d'une chaîne aléatoire après un préfixe commun ne rend l'autoscaling efficace que pour les éléments comportant ce préfixe. Lorsque les requêtes passent à un autre préfixe, vous ne pouvez plus bénéficier des effets d'autoscaling précédents. Ce problème est particulièrement apparent lorsque les préfixes suivent un schéma séquentiel.
Par exemple, si vous écrivez des fichiers toutes les heures sous un nouveau préfixe basé sur un horodatage, vous pouvez obtenir les noms suivants :
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 ...
Bien que l'autoscaling aide à augmenter au fil du temps le taux d'écriture avec un certain préfixe, ce taux est réinitialisé au début de chaque heure. Vous obtenez alors un taux d'écriture non optimal, ainsi qu'une latence et des taux d'erreur périodiquement accrus. Si, au fil du temps, vous avez besoin d'écrire des données avec différents préfixes, assurez-vous que les nouveaux préfixes sont uniformément répartis sur l'ensemble de la plage de clés pour contourner ce problème.
Réorganiser les opérations groupées pour répartir la charge uniformément sur les plages de clés
Vous pourrez parfois être amené(e) à effectuer une importation ou une suppression groupée de données dans Cloud Storage. Dans les deux cas, il est possible que vous n'exerciez aucun contrôle sur les noms d'objet. Toutefois, vous pouvez choisir l'ordre d'importation ou de suppression des objets pour obtenir le meilleur taux d'écriture ou de suppression possible.
Pour ce faire, répartissez les importations ou les suppressions sur plusieurs préfixes. Si vous souhaitez par exemple importer un grand nombre de dossiers contenant beaucoup de fichiers, une bonne stratégie consiste à importer plusieurs dossiers en parallèle et à choisir aléatoirement les dossiers et les fichiers à importer. Ainsi, le système est en mesure de répartir la charge sur l'ensemble de la plage de clés de manière plus uniforme, ce qui permet d'atteindre un taux de requêtes élevé après l'augmentation progressive initiale.
Étapes suivantes
- Consultez les quotas et limites de Cloud Storage.
- Découvrez la stratégie de nouvelles tentatives recommandée pour les requêtes adressées à Cloud Storage.