Lineamientos de distribución de acceso y porcentaje de solicitudes

Cloud Storage es un servicio con alta escalabilidad que usa tecnología de ajuste de escala automático para lograr tasas de solicitudes muy altas. En esta página, se presentan los lineamientos que proporciona Cloud Storage para optimizar el escalamiento y el rendimiento.

Ajuste de escala automático

Cloud Storage es un servicio multiusuario, lo que significa que los usuarios comparten el mismo conjunto de recursos subyacentes. Para aprovechar al máximo estos recursos compartidos, los depósitos tienen una capacidad inicial de E/S de:

  • Alrededor de 1,000 solicitudes de escritura de objetos por segundo, lo que incluye subir, actualizar y borrar objetos. Ten en cuenta que Cloud Storage también tiene un límite más pequeño para escrituras repetidas en el mismo nombre del objeto.
  • Alrededor de 5,000 solicitudes de lectura de objetos por segundo, lo que incluye crear listas de objetos, leer datos de objetos y metadatos de objetos.

Estos índices iniciales de lectura y escritura tienen un promedio de 2.5 PB escritos y de 13 PB leídos en un mes para objetos de 1 MB. A medida que crece la tasa de solicitudes en un bucket determinado, Cloud Storage aumenta de forma automática la escala y la capacidad de E/S para ese bucket mediante la distribución de la carga de solicitudes entre varios servidores.

Tiempo de redistribución de cargas

A medida que un bucket se acerca a su límite de capacidad de E/S, Cloud Storage, por lo general, tarda unos minutos en detectar y redistribuir la carga entre un número mayor de servidores según corresponda. Por lo tanto, si el porcentaje de solicitudes en tu bucket aumenta más rápido de lo que Cloud Storage puede redistribuir, es posible que te encuentres con límites temporarios, en particular con una latencia mayor y con porcentajes de error más altos. Si se aumenta de forma gradual el porcentaje de solicitudes de tus depósitos, como se describe a continuación, se evitan esa latencia y esos errores.

Indexación de claves de objeto

Cloud Storage admite la enumeración de objetos coherente, lo que permite a los usuarios ejecutar flujos de trabajo de procesamiento de datos con facilidad en Cloud Storage. Para proporcionar una enumeración de objetos coherente, Cloud Storage mantiene un índice de claves de objetos para cada bucket. Este índice se almacena en orden lexicográfico y se actualiza cuando se escriben o borran objetos de un bucket. Agregar y borrar objetos cuyas claves se encuentran en un rango pequeño del índice aumenta las posibilidades de contención.

Cloud Storage detecta esa contención, también conocida como generación de hotspots, y redistribuye de forma automática la carga en el rango del índice afectado en servidores múltiples. De forma similar al escalamiento de la capacidad de E/S de un depósito, cuando se accede a un nuevo rango del índice, por ejemplo, cuando se escriben objetos con un nuevo prefijo, debes aumentar de forma gradual la tasa de solicitudes, como se describe a continuación. No hacerlo puede causar mayor latencia y mayores tasas de errores de forma temporal.

Recomendaciones

Las siguientes secciones proporcionan recomendaciones sobre cómo aumentar la tasa de solicitudes, elegir claves de objeto y distribuir solicitudes para evitar límites temporales en tu bucket. Ten en cuenta que, además de estas consideraciones por bucket, también hay límites de ancho de banda combinados que se aplican a los buckets ubicados en la misma ubicación y en el mismo proyecto.

Aumenta la tasa de solicitudes de forma gradual

Para asegurarte de que el ajuste de escala automático de Cloud Storage siempre ofrezca el mejor rendimiento, debes aumentar de forma gradual tu tasa de solicitudes para cualquier bucket que no tuvo una tasa de solicitudes alta durante varios días o que tiene un nuevo rango de claves de objeto. Si tu tasa de solicitudes es inferior a 1,000 solicitudes de escritura por segundo o 5,000 solicitudes de lectura por segundo, no se necesita ningún aumento. Si se espera que tu tasa de solicitudes supere estos umbrales, debes comenzar con un porcentaje de solicitudes inferior o cercano a los umbrales y, luego, aumentar el porcentaje de forma gradual, sin que supere la duplicación en un período de 20 minutos.

Si tienes algún problema, como un aumento de la latencia o las tasas de errores, pausa o reduce la tasa de solicitudes de forma temporal a fin de que Cloud Storage tenga más tiempo para escalar tu bucket. Debes reintentar tus solicitudes con retirada exponencial en los siguientes casos:

  • Si recibes errores con los códigos de respuesta 408 y 429.
  • Si recibes errores con los códigos de respuesta 5xx.

Usa una convención de nombres que distribuya las cargas de manera uniforme entre los rangos de claves

El ajuste de escala automático de un rango de índice se puede hacer más lento cuando se usan nombres secuenciales, como las claves de objeto basadas en una secuencia de números o una marca de tiempo. Esto ocurre porque las solicitudes cambian todo el tiempo a un nuevo rango de índice, lo que hace que la redistribución de las cargas sea más difícil y menos efectiva.

Para mantener una alta tasa de solicitudes, evita usar nombres secuenciales. Usar nombres de objetos aleatorios brindará la mejor distribución de cargas. Si deseas usar números secuenciales o marcas de tiempo como parte de los nombres de tus objetos, haz aleatorios los nombres de los objetos mediante un valor de hash antes del número de secuencia o la marca de tiempo.

Por ejemplo, si los nombres de los objetos originales que deseas usar son los siguientes:

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
...

Puedes calcular el hash MD5 del nombre del objeto original y agregar los primeros 6 caracteres del hash como un prefijo al nombre del objeto. Los nuevos nombres de los objetos se convierten en los siguientes:

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 prefijo aleatorio más extenso proporciona un ajuste de escala automático más efectivo cuando se aumenta a tasas de lectura y escritura muy altas. Por ejemplo, un prefijo de 1 caracter con un valor hexadecimal aleatorio proporciona un ajuste de escala automático efectivo desde 5,000 operaciones de lectura y 1,000 operaciones de escritura iniciales por segundo hasta un valor aproximado de 80,000 operaciones de lectura y 16,000 operaciones de escritura por segundo, porque el prefijo tiene 16 valores posibles. Si tu caso de uso no necesita tasas más altas que estas, un prefijo aleatorio de 1 caracter es tan efectivo en el aumento de las tasas de solicitudes como un prefijo aleatorio de 2 caracteres o más.

La aleatoriedad después de un prefijo en común es efectiva bajo el prefijo

Ten en cuenta que no es necesario que la string aleatoria esté al principio del nombre del objeto. Agregar una string aleatoria después de un prefijo común también permite que el ajuste de escala automático funcione, pero el efecto se limita a ese prefijo, sin tener en cuenta el resto del bucket.

Por ejemplo:

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
...

Los nombres anteriores permiten un ajuste de escala automático de objetos eficiente en images/animals y en images/landscape,, pero no en images/clouds.

La aleatorización después de prefijos secuenciales no es tan efectiva

Como se mencionó antes, usar una string aleatoria después de un prefijo común solo ayuda en el ajuste de escala automático bajo ese prefijo. Una vez que las solicitudes cambian a un nuevo prefijo, es posible que ya no te beneficies de los efectos de ajuste de escala automático anteriores. Esto es problemático en particular cuando los prefijos siguen un patrón secuencial.

Por ejemplo, si escribes archivos con un nuevo prefijo basado en marca de tiempo cada hora:

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
...

Aunque el ajuste de escala automático ayuda a aumentar la tasa de escritura bajo un prefijo a lo largo del tiempo, la tasa de escritura se reinicia al comienzo de cada hora. Esto da como resultado una tasa de escritura deficiente y aumentos periódicos en la latencia y la tasa de errores. Si necesitas escribir en diferentes prefijos a lo largo del tiempo, asegúrate de que los nuevos prefijos se distribuyan de forma uniforme en todo el rango de claves para evitar este problema.

Reordena las operaciones masivas para distribuir las cargas de manera uniforme entre los rangos de claves

En ocasiones, necesitarás realizar una carga o eliminación masiva de datos en Cloud Storage. En ambos casos, es posible que no tengas control sobre los nombres de los objetos. Sin embargo, puedes controlar el orden en que se suben o borran los objetos para lograr la mayor tasa de escritura o eliminación posible.

Para hacerlo, debes distribuir las cargas o eliminaciones entre múltiples prefijos. Por ejemplo, si tienes que subir muchas carpetas y muchos archivos dentro de cada carpeta, una buena estrategia es subir desde varias carpetas en paralelo y elegir de forma aleatoria qué carpetas y archivos se suben. Si haces esto, el sistema puede distribuir las cargas de manera más uniforme en todo el rango de claves, lo que te permite lograr una tasa alta de solicitudes después del aumento inicial.

¿Qué sigue?