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

O Cloud Storage é um serviço altamente escalável que usa tecnologia de escala automática para alcançar taxas de pedidos muito elevadas. Esta página apresenta diretrizes para otimizar a escalabilidade e o desempenho que o Cloud Storage oferece.

Escalonamento automático

O Cloud Storage é um serviço multi-inquilino, o que significa que os utilizadores partilham o mesmo conjunto de recursos subjacentes. Para tirar o máximo partido destes recursos partilhados, os contentores têm uma capacidade de E/S inicial de:

  • Aproximadamente 1000 pedidos de gravação de objetos por segundo, o que inclui o carregamento, a atualização e a eliminação de objetos. Tenha em atenção que o Cloud Storage também tem um limite inferior para escritas repetidas no mesmo nome do objeto.
  • Aproximadamente 5000 pedidos de leitura de objetos por segundo, o que inclui a listagem de objetos, a leitura de dados de objetos e a leitura de metadados de objetos.

Estas taxas de leitura e escrita iniciais correspondem, em média, a 2,5 PB escritos e 13 PB lidos num mês para objetos de 1 MB. À medida que a taxa de pedidos de um determinado segmento aumenta, o Cloud Storage é dimensionado automaticamente e aumenta automaticamente a capacidade de E/S desse segmento, distribuindo a carga de pedidos por vários servidores.

Tempo de redistribuição do carregamento

À medida que um contentor se aproxima do limite da capacidade de E/S, o Cloud Storage demora normalmente alguns minutos a detetar e redistribuir em conformidade a carga por mais servidores. Consequentemente, se a taxa de pedidos no seu contentor aumentar mais rapidamente do que o Cloud Storage consegue realizar esta redistribuição, pode deparar-se com limites temporários, especificamente, taxas de erro e latência mais elevadas. Aumentar gradualmente a taxa de pedidos para os seus contentores, conforme descrito abaixo, evita essa latência e erros.

Indexação de chaves de objetos

O Cloud Storage suporta a listagem de objetos consistente, o que permite aos utilizadores executar facilmente fluxos de trabalho de processamento de dados no Cloud Storage. Para fornecer uma lista de objetos consistente, o Cloud Storage mantém um índice de chaves de objetos para cada contentor. Este índice é armazenado por ordem lexicográfica e é atualizado sempre que os objetos são escritos ou eliminados de um contentor. A adição e a eliminação de objetos cujas chaves existem num pequeno intervalo do índice aumentam naturalmente as probabilidades de concorrência.

O Cloud Storage deteta este tipo de contenção, também conhecido como hotspotting, e redistribui automaticamente a carga no intervalo de índice afetado em vários servidores. Semelhante ao aumento da capacidade de E/S de um contentor, quando acede a um novo intervalo do índice, como quando escreve objetos sob um novo prefixo, deve aumentar gradualmente a taxa de pedidos, conforme descrito abaixo. Se não o fizer, pode resultar em taxas de erros e latência temporariamente mais elevadas.

Práticas recomendadas

As secções seguintes fornecem práticas recomendadas sobre como aumentar a taxa de pedidos, escolher chaves de objetos e distribuir pedidos para evitar limites temporários no seu contentor. Tenha em atenção que, além destas considerações por contentor, também existem limites de largura de banda combinados que se aplicam a contentores localizados na mesma localização e projeto.

Aumente gradualmente a taxa de pedidos

Para garantir que a escalabilidade automática do Cloud Storage oferece sempre o melhor desempenho, deve aumentar gradualmente a taxa de pedidos para qualquer contentor que não tenha tido uma taxa de pedidos elevada durante vários dias ou que tenha um novo intervalo de chaves de objetos. Se a sua taxa de pedidos for inferior a 1000 pedidos de gravação por segundo ou 5000 pedidos de leitura por segundo, não é necessário um aumento gradual. Se a sua taxa de pedidos for superior a estes limites, deve começar com uma taxa de pedidos abaixo ou perto dos limites e, em seguida, aumentar gradualmente a taxa, sem exceder o dobro da taxa num período de 20 minutos.

Se tiver problemas, como um aumento da latência ou das taxas de erro, pause o aumento gradual ou reduza temporariamente a taxa de pedidos para dar ao Cloud Storage mais tempo para dimensionar o seu contentor. Deve tentar novamente os pedidos com retirada exponencial quando:

  • Receber erros com os códigos de resposta 408 e 429.
  • Receber erros com códigos de resposta 5xx.

Os contentores com o espaço de nomes hierárquico ativado oferecem limites iniciais de consultas por segundo (QPS) até 8 vezes superiores para leitura e gravação de objetos em comparação com os contentores sem o espaço de nomes hierárquico ativado. O QPS inicial mais elevado facilita o dimensionamento de cargas de trabalho com grande volume de dados e oferece um débito melhorado. Para mais informações sobre como ativar o espaço de nomes hierárquico no seu contentor, consulte o artigo Crie um contentor com o espaço de nomes hierárquico ativado.

Use uma convenção de nomenclatura que distribua a carga uniformemente pelos intervalos de chaves

O dimensionamento automático de um intervalo de índice pode ser mais lento quando usa nomes sequenciais, como chaves de objetos baseadas numa sequência de números ou data/hora. Isto ocorre porque os pedidos estão constantemente a mudar para um novo intervalo de índices, o que torna a redistribuição da carga mais difícil e menos eficaz.

Para manter uma taxa de pedidos elevada, evite usar nomes sequenciais. A utilização de nomes de objetos completamente aleatórios oferece-lhe a melhor distribuição de carga. Se quiser usar números sequenciais ou datas/horas como parte dos nomes dos objetos, introduza aleatoriedade nos nomes dos objetos adicionando um valor hash antes do número de sequência ou da data/hora.

Por exemplo, se os nomes dos objetos originais que quer usar forem:

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

Pode calcular o hash MD5 do nome do objeto original e adicionar os primeiros 6 carateres do hash como um prefixo ao nome do objeto. Os novos nomes dos objetos passam a ser:

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 oferece um dimensionamento automático mais eficaz quando aumenta para taxas de leitura e gravação muito elevadas. Por exemplo, um prefixo de 1 caráter que use um valor hexadecimal aleatório oferece uma escalabilidade automática eficaz das 5000/1000 leituras/escritas iniciais por segundo até aproximadamente 80 000/16 000 leituras/escritas por segundo, porque o prefixo tem 16 valores potenciais. Se o seu exemplo de utilização não precisar de taxas mais elevadas do que esta, um prefixo aleatório de 1 caráter é tão eficaz no aumento das taxas de pedidos como um prefixo aleatório de 2 ou mais carateres.

A aleatoriedade após um prefixo comum é eficaz no prefixo

Tenha em atenção que a string aleatória não tem necessariamente de estar no início do nome do objeto. A adição de uma string aleatória após um prefixo comum continua a permitir o funcionamento do dimensionamento automático, mas o efeito limita-se a esse prefixo, sem ter em conta o resto do contentor.

Por 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 nomenclatura acima permite o dimensionamento automático eficiente de objetos em images/animals e images/landscape,, mas não em images/clouds.

A aleatoriedade após prefixos sequenciais não é tão eficaz

Conforme mencionado acima, a utilização de uma string aleatória após um prefixo comum só ajuda no ajuste de escala automático nesse prefixo. Assim que os pedidos mudarem para um novo prefixo, pode deixar de beneficiar dos efeitos de dimensionamento automático anteriores. Isto é especialmente problemático quando os prefixos seguem um padrão sequencial.

Por exemplo, se escrever ficheiros com um novo prefixo baseado na 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
...

Embora o dimensionamento automático ajude a aumentar a taxa de gravação sob um prefixo ao longo do tempo, a taxa de gravação é reposta no início de cada hora. Isto resulta numa taxa de gravação abaixo do ideal e aumentos periódicos na latência e na taxa de erro. Se precisar de escrever em prefixos diferentes ao longo do tempo, para evitar este problema, certifique-se de que os novos prefixos estão distribuídos uniformemente por todo o intervalo de chaves.

Reordene as operações em massa para distribuir a carga uniformemente pelos intervalos de chaves

Por vezes, é útil fazer um carregamento ou uma eliminação em massa de dados no Cloud Storage. Em ambos os casos, pode não ter controlo sobre os nomes dos objetos. No entanto, pode controlar a ordem pela qual os objetos são carregados ou eliminados para alcançar a taxa de gravação ou eliminação mais elevada possível.

Para tal, deve distribuir os carregamentos ou as eliminações por vários prefixos. Por exemplo, se tiver muitas pastas e muitos ficheiros em cada pasta para carregar, uma boa estratégia é carregar a partir de várias pastas em paralelo e escolher aleatoriamente as pastas e os ficheiros que são carregados. Ao fazê-lo, permite que o sistema distribua a carga de forma mais uniforme por todo o intervalo de chaves, o que lhe permite alcançar uma taxa de pedidos elevada após o aumento inicial.

O que se segue?