Visão geral da pré-divisão

Este documento contém informações para ajudá-lo a dividir previamente seu banco de dados.

O Spanner gerencia divisões de banco de dados e escalona em resposta a mudanças de carga e tamanho. A divisão e a mesclagem são dinâmicas, com base no tráfego. À medida que uma divisão recebe mais tráfego, o Spanner o subdivide em intervalos menores e redistribui as divisões resultantes sobre outros recursos disponíveis na instância. O Spanner mescla a divisão quando ela recebe menos tráfego de maneira consistente.

A divisão não é instantânea. Se a divisão e o rebalanceamento não acompanharem o tráfego, uma divisão poderá usar os recursos de computação e memória disponíveis. Quando isso acontece, o programador de trabalho do Spanner coloca mais solicitações em fila, aumentando a latência e possivelmente levando a tempos limite e transações canceladas.

Ao dividir previamente o banco de dados, o Spanner pode estar pronto para um aumento previsível. É possível dividir previamente o banco de dados criando pontos de divisão.

Considere dividir previamente o banco de dados nos seguintes cenários:

  • Você está carregando um grande conjunto de dados em novas tabelas e índices em um banco de dados do Spanner pela primeira vez, como um carregamento em massa único.
  • Você espera um aumento na carga de tráfego em um banco de dados atual do Spanner em um futuro próximo. Por exemplo, talvez você precise oferecer suporte a um grande evento de tráfego, como o lançamento de um produto ou uma campanha de vendas.

Determinar a contagem de divisões

Recomendamos a criação de 10 pontos de divisão por nó. Como o Spanner pode dividir e se ajustar ao tráfego rapidamente para instâncias menores, não é necessário dividir previamente as instâncias menores.

Determinar os pontos de divisão

Considere o seguinte ao determinar os pontos de divisão do seu banco de dados:

  • Se o tráfego for distribuído de maneira uniforme por todo o intervalo de chaves, como ao usar UUIDs ou chaves de sequência invertida em bit, escolha pontos de divisão que dividam o espaço da chave pós-tráfego de maneira uniforme.

  • Se o tráfego se concentrar em um conjunto de intervalos de chaves conhecidos, divida e isole esses intervalos.

  • Se você está esperando tráfego nos índices, use pontos de divisão no índice correspondente.

  • As tabelas intercaladas serão divididas se os pontos de divisão forem adicionados à tabela mãe. Se você espera um tráfego maior na tabela intercalada, use pontos de divisão na tabela intercalada correspondente.

  • É possível alocar os pontos de divisão para objetos de esquema proporcionalmente ao aumento do tráfego.

Exemplo de fluxo de trabalho para determinar pontos de divisão

Suponha que seu banco de dados tenha as estruturas de tabela definidas pela seguinte DDL:

CREATE TABLE UserInfo (
 UserId INT64 NOT NULL,
 Info BYTES(MAX),
) PRIMARY KEY (UserId);


CREATE TABLE UserLocationInfo (
 UserId INT64 NOT NULL,
 LocationId STRING(MAX) NOT NULL,
 ActivityData BYTES(MAX),
) PRIMARY KEY (UserId, LocationId), INTERLEAVE IN PARENT UserInfo ON DELETE CASCADE;


CREATE INDEX UsersByLocation ON UserLocationInfo(LocationId);

UserId é um hash gerado aleatoriamente no espaço INT64, e você precisa adicionar 100 pontos de divisão para distribuir de maneira uniforme o aumento previsto no tráfego na tabela UserInfo e nas tabelas intercaladas dela. Como os pontos de divisão são distribuídos de maneira uniforme, você precisa encontrar o número de linhas ou offset entre cada ponto de divisão:

offset = o valor máximo do intervalo de UserId / 99

Em seguida, os pontos de divisão da tabela UserInfo são determinados a partir da primeira linha de UserId ou UserId_first. Para determinar o enésimo ponto de divisão, use o seguinte cálculo:

Ponto de divisão N: UserId_first + (offset * (N-1))

Por exemplo, o primeiro ponto de divisão é UserId_first + (offset * 0) e o terceiro é UserId_first + (offset * 2).

Como a tabela UserLocationInfo é uma tabela intercalada da tabela UserInfo, ela também é dividida nos limites de UserId. Talvez você também queira criar pontos de divisão na tabela UserLocationInfo na coluna LocationId.

Considere que o LocationId segue o formato $COUNTRY_$STATE_$CITY_$BLOCK_$NUMBER, por exemplo, US_CA_SVL_MTL_1100_7.

Para uma UserId, com base no prefixo da string LocationId, é possível determinar divisões para colocar a tabela UserLocationInfo do UserId em três países diferentes, em três divisões diferentes:

  • Ponto de divisão 1: (1000, "CN")
  • Ponto de divisão 2: (1000, "FR")
  • Ponto de divisão 3: (1000, "EUA")

Você pode adicionar novos pontos de divisão usando apenas um prefixo e não precisa corresponder ao formato especificado para uma coluna ou índice. Neste exemplo, os pontos de divisão não correspondem ao formato especificado para LocationId e usam apenas $COUNTRY como prefixo.

Se você quiser dividir o índice UsersByLocation, espalhe uniformemente os pontos de divisão na coluna LocationId ou isole alguns valores da coluna LocationId que devem receber mais tráfego:

  • Ponto de divisão 1: "CN"
  • Ponto de divisão 2: "EUA"
  • Ponto de divisão 3: "US_NYC"

É possível dividir ainda mais o índice usando as partes da chave da tabela indexada para locais que recebem ainda mais tráfego. Por exemplo, se você espera que o local CN receba mais tráfego, insira os seguintes pontos de divisão:

  • Ponto de divisão 1: "CN" e TableKey: (1000, "CN")
  • Ponto de divisão 2: "CN" e TableKey: (2000, "CN")
  • Ponto de divisão 3: "CN" e TableKey: (3000, "CN")

Expiração do ponto de divisão

É possível definir um prazo de validade para cada ponto de divisão. Dependendo do caso de uso, defina os pontos de divisão para expirar após o aumento previsto do tráfego diminuir.

O prazo de validade padrão é de 10 dias a partir da criação ou atualização da divisão. O prazo de validade máximo permitido é de 30 dias a partir da criação ou atualização da divisão.

Depois que a divisão expira, o Spanner assume o gerenciamento da divisão e não é mais possível visualizá-la. O Spanner pode mesclar a divisão dependendo do tráfego.

Também é possível atualizar o prazo de validade de um ponto de divisão antes que ele expire. Por exemplo, se o aumento do tráfego não diminuiu, é possível aumentar o prazo de validade da divisão. Se você não precisar mais de um ponto de divisão, configure-o para expirar imediatamente. Para saber como definir o prazo de validade dos pontos de divisão, consulte Como expirar um ponto de divisão.

Resultados de dividir previamente o banco de dados

Os seguintes resultados provavelmente são gerados após a adição de pontos de divisão:

  • Mudanças de latência: a adição de pontos de divisão é uma maneira de simular aumentos no tráfego no banco de dados. Quando um banco de dados tem mais divisões, pode haver aumentos permanentes na latência de leitura e gravação devido a mais participantes de transações e divisões de consulta. Também espere um aumento no uso de computação e consulta por solicitação de leitura ou gravação.

  • Eficácia do ponto de divisão: para determinar se os pontos de divisão adicionados são benéficos, monitore o perfil de latência em busca de mudanças mínimas e o visualizer de chave para pontos de acesso. Se você perceber pontos de acesso, poderá expirar os pontos de divisão imediatamente e criar novos. Para mais informações sobre como expirar pontos de divisão, consulte Como expirar um ponto de divisão. Considere introduzir um número menor de divisões na próxima iteração de adição de divisões e observe o perfil de latência.

  • Comportamento do ponto de divisão após o aumento do tráfego: os pontos de divisão adicionados devem ser removidos quando o aumento do tráfego se estabilizar. A distribuição dividida pode não convergir para onde estava antes do aumento da carga. O banco de dados pode se basear em um perfil de latência diferente devido à alteração do tráfego e à divisão necessária para oferecer suporte ao tráfego.

Exemplo de caso de uso:

Imagine que você é administrador de banco de dados em uma empresa de jogos e está antecipando um aumento de tráfego para o lançamento de um novo jogo. Você espera o tráfego em novas tabelas que estão vazias.

Você precisa garantir que não haja interrupção do serviço quando o tráfego passar para que não haja impacto observável nas taxas de latência ou de erro.

Considere a seguinte estratégia de pré-divisão de alto nível para este caso de uso:

  1. Identifique o número de nós que a instância precisa para dar suporte ao aumento de tráfego. Para saber como identificar a contagem de nós, consulte Visão geral do desempenho. Se você estiver usando o escalonador automático, defina o parâmetro de limite máximo como a contagem de nós identificada. Além disso, defina o parâmetro de limite mínimo como (contagem de nós que você identificou / 5).

  2. Identifique as tabelas e os índices que têm mais tráfego e podem se beneficiar mais do uso de pontos de divisão. Analise os dados atuais e escolha usar pontos de divisão personalizados ou distribuídos de maneira uniforme.

  3. Crie os pontos de divisão no máximo sete dias e no máximo 12 horas antes do aumento previsto do tráfego.

  4. Verifique se as divisões foram criadas. Para ver os pontos de divisão criados em uma instância, consulte Visualizar pontos de divisão.

Advertências

Considere as seguintes advertências ao criar pontos de divisão:

  • Exclusão de tabela, índice e banco de dados: antes de excluir uma tabela, um índice ou um banco de dados, é necessário garantir que todos os pontos de divisão adicionados correspondentes tenham expirado. Para fazer isso, defina a data de validade da divisão como a hora atual. Isso é necessário para que a cota no nível da instância seja recuperada. Para mais informações sobre como expirar pontos de divisão, consulte Como expirar um ponto de divisão.

  • Backup e restauração de bancos de dados: as divisões adicionadas não são armazenadas em backup. Você precisa criar divisões em um banco de dados restaurado.

  • Escalonamento automático assimétrico: se você estiver usando escalonamento automático assimétrico, a contagem de nós usada para determinar a contagem de pontos de divisão será a contagem mínima de nós em todas as regiões.

  • Aumento temporário nas métricas de uso do armazenamento: adicionar pontos de divisão aumenta temporariamente a métrica de armazenamento total do banco de dados até que o Spanner conclua a compactação. Para mais informações, consulte Uso do armazenamento. Isso só acontece quando os intervalos de chaves atuais são divididos ainda mais, e não quando novos intervalos de chaves são divididos.

  • Crie pontos de divisão no mínimo sete e no máximo 12 horas antes do aumento esperado do tráfego.

Limites antes da divisão

A pré-divisão do banco de dados tem as seguintes limitações:

  • Não é possível dividir previamente os índices de pesquisa. Você só precisa pré-dividir a tabela base. Para mais informações, consulte Fragmentação do índice de pesquisa.

  • Não é possível dividir previamente os índices de vetores. Para mais informações sobre índices vetoriais, consulte Índice de vetor.

  • Para saber mais sobre as cotas para pontos de divisão, consulte Cotas e limites.

A seguir