Diretrizes de taxa de solicitação e distribuição de acesso

O Cloud Storage é um serviço altamente escalonável que usa a tecnologia de escalonamento automático para atingir taxas de solicitação muito altas. Veja nesta página as diretrizes para otimizar o escalonamento e o desempenho oferecidos pelo Cloud Storage.

Escalonamento automático

O Cloud Storage é um serviço multilocatário. Isso significa que os usuários compartilham o mesmo grupo de recursos subjacentes. Para aproveitar ao máximo esses recursos compartilhados, os buckets têm uma capacidade inicial de E/S de:

  • aproximadamente 1.000 solicitações de gravação de objeto por segundo, o que inclui fazer upload, atualizar e excluir objetos; O Cloud Storage também tem um limite menor para gravações repetidas no mesmo nome de objeto.
  • aproximadamente 5.000 solicitações de leitura de objeto por segundo, o que inclui listar objetos, ler dados de objetos e ler metadados de objetos.

Essas taxas iniciais de leitura e gravação têm média de 2,5 PB de gravação e 13 PB de leitura em um mês para objetos de 1 MB. À medida que a taxa de solicitação de um determinado bucket cresce, o Cloud Storage aumenta automaticamente a capacidade de E/S desse bucket, distribuindo a carga de solicitação por vários servidores.

Tempo de redistribuição da carga

À medida que um bucket se aproxima do limite de capacidade de E/S, o Cloud Storage geralmente leva alguns minutos para detectar e redistribuir a carga entre mais servidores. Consequentemente, se a taxa de solicitação no bucket aumentar mais rápido do que a capacidade do Cloud Storage de executar a redistribuição, você encontrará limites temporários, especificamente, maior latência e taxas de erro. Aumentar a taxa de solicitação nos buckets gradualmente, conforme descrito abaixo, evita essa latência e esses erros.

Indexação de chaves de objetos

O Cloud Storage é compatível com a listagem consistente de objetos, o que permite aos usuários executar fluxos de trabalho de processamento de dados com facilidade. Para fornecer uma listagem consistente de objetos, o Cloud Storage mantém um índice de chaves de objetos de cada bucket. Esse índice é armazenado em ordem lexicográfica e é atualizado sempre que os objetos são gravados ou excluídos de um bucket. Se você adicionar e excluir objetos das chaves contidas em uma pequena faixa do índice, aumentará naturalmente as chances de contenção.

O Cloud Storage detecta essa contenção, também conhecida como uso excessivo do ponto de acesso, e redistribui automaticamente a carga no intervalo do índice afetado em vários servidores. De modo semelhante ao escalonamento da capacidade de E/S de um intervalo, quando uma nova faixa do índice é acessada, como na gravação de objetos com um prefixo novo, é necessário aumentar gradualmente a taxa de solicitações, conforme descrito abaixo. Se você não fizer isso, o resultado poderá ser taxas de latência e erro temporariamente maiores.

Práticas recomendadas

Nas seções a seguir, descrevemos as práticas recomendadas para aumentar a taxa de solicitação, escolher chaves de objetos e distribuir solicitações, a fim de evitar limites temporários nos intervalos. Além dessas considerações por bucket, também há limites de largura de banda combinados que se aplicam a buckets localizados no mesmo local e projeto.

Aumentar gradualmente a taxa de solicitação

Para garantir que o escalonamento automático do Cloud Storage sempre ofereça o melhor desempenho, é necessário aumentar gradualmente a taxa de solicitação de um bucket. Para isso, esse bucket precisa de uma nova faixa de chaves de objetos ou não pode ter uma taxa de solicitação alta por vários dias. Se a taxa de solicitação for menor que 1.000 solicitações de gravação ou 5.000 solicitações de leitura por segundo, não será necessário aumentá-la. Se sua taxa de solicitação deve ultrapassar esses limites, comece com uma taxa de solicitação abaixo ou perto dos limites e aumente gradualmente a taxa não mais rápido do que dobrando a taxa durante um período de 20 minutos.

Em caso de problemas, como o aumento das taxas de latência ou erro, pause o aumento ou reduza a taxa de solicitação temporariamente para dar ao Cloud Storage mais tempo para escalonar o bucket. Tente fazer as solicitações novamente com espera exponencial quando:

  • receber erros com códigos de resposta 408 e 429;
  • receber erros com códigos de resposta 5xx.

Usar uma convenção de nomenclatura que distribua a carga uniformemente pelas faixas de chaves

O escalonamento automático de uma faixa do índice pode ser desacelerado ao usar nomes sequenciais, como chaves de objeto baseadas em uma sequência de números ou carimbo de data/hora. Isso se deve à mudança constante das solicitações para novas faixas do índice, o que torna a redistribuição da carga mais difícil e menos eficaz.

Para manter uma taxa de solicitação alta, evite usar nomes sequenciais. O uso de nomes de objetos completamente aleatórios proporciona a melhor distribuição da carga. Se você quiser usar números ou carimbos de data/hora sequenciais como parte dos nomes dos objetos, torne-os aleatórios adicionando um valor de hash antes do número ou carimbo de data/hora sequencial.

Por exemplo, se os nomes de objeto originais que você quer usar são:

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

Você pode calcular o hash MD5 do nome original do objeto e adicionar os primeiros seis caracteres do hash como prefixo. Os novos nomes de objeto serão:

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

Um prefixo aleatório mais longo fornece um escalonamento automático mais eficaz ao aumentar para taxas de leitura e gravação muito altas. Por exemplo, um prefixo de 1 caractere usando um valor hexadecimal aleatório fornece escalonamento automático eficaz das leituras/gravações iniciais de 5.000/1.000 por segundo até aproximadamente 80.000/16.000 leituras/gravações por segundo porque o prefixo tem 16 valores possíveis. Se o caso de uso não precisar de taxas mais altas do que isso, um prefixo aleatório de um caractere é tão eficiente no aumento de taxas de solicitação quanto um prefixo aleatório de dois caracteres ou mais.

Aleatoriedade após um prefixo comum é eficaz sob o prefixo

A string aleatória não precisa necessariamente estar no início do nome do objeto. Adicionar a string aleatória após um prefixo comum também permitirá que o escalonamento automático funcione. No entanto, o efeito é limitado a esse prefixo, sem considerar o restante do bucket.

Exemplo:

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

A nomeação acima permite o escalonamento automático eficiente de objetos em images/animals e images/landscape,, mas não images/clouds.

Aleatoriedade após prefixos sequenciais não é tão eficaz

Como mencionado acima, o uso de uma string aleatória após um prefixo comum só ajuda no escalonamento automático sob esse prefixo. Quando as solicitações mudam para um novo prefixo, pode não ser mais possível se beneficiar dos efeitos anteriores do escalonamento automático. Isso é um problema principalmente quando os prefixos seguem um padrão sequencial.

Por exemplo, se você gravar arquivos sob um novo prefixo com base no carimbo de data/hora a 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
...

Com o escalonamento automático, é possível aumentar a taxa de gravação sob um prefixo ao longo do tempo. No entanto, a taxa de gravação é redefinida no início de cada hora. Isso resulta em uma taxa de gravação abaixo do ideal e em aumentos periódicos na latência e na taxa de erro. Se você precisa gravar prefixos diferentes ao longo do tempo, verifique se os novos prefixos estão distribuídos uniformemente em toda a faixa de chaves para evitar esse problema.

Reordenar operações em massa para distribuir a carga uniformemente pelas faixas de chaves

Há situações em que o ideal é fazer um upload ou uma exclusão de dados em massa no Cloud Storage. Em ambos os casos, talvez você não tenha o controle dos nomes dos objetos. No entanto, é possível controlar a ordem em que os objetos são enviados ou excluídos para ter a maior taxa de gravação ou exclusão possível.

Para fazer isso, você precisa distribuir os uploads ou as exclusões por vários prefixos. Por exemplo, se você tiver muitas pastas e muitos arquivos em cada uma delas, uma boa estratégia é fazer o upload em paralelo de várias pastas e fazer o upload de arquivos e pastas escolhidos aleatoriamente. Assim, o sistema pode distribuir a carga de maneira mais uniforme em toda a faixa de chaves. Isso possibilita alcançar uma taxa de solicitação alta após o aumento inicial.

A seguir