Vista geral da pré-divisão

Este documento contém informações para ajudar a dividir previamente a sua base de dados.

O Spanner gere as divisões da base de dados e é dimensionado em resposta às alterações de carga e tamanho. A divisão e a união são dinâmicas, com base no tráfego. À medida que uma divisão recebe mais tráfego, o Spanner subdivide-a em intervalos mais pequenos e redistribui as divisões resultantes por outros recursos disponíveis na instância. O Spanner une a divisão quando esta recebe consistentemente menos tráfego.

A divisão não é instantânea. Se a divisão e o reequilíbrio não conseguirem acompanhar o tráfego, uma divisão pode potencialmente usar os respetivos recursos de computação e memória disponíveis. Quando isto acontece, o programador de tarefas do Spanner coloca em fila pedidos adicionais, o que aumenta a latência e pode levar a tempos limite e transações anuladas.

Ao dividir previamente a base de dados, o Spanner pode estar pronto para um aumento previsível do tráfego. Pode dividir previamente a sua base de dados criando pontos de divisão.

Considere dividir previamente a base de dados nos seguintes cenários:

  • Está a carregar um conjunto de dados grande para novas tabelas e índices numa base de dados do Spanner pela primeira vez, como um carregamento em massa único.
  • Está a prever um aumento da carga de tráfego numa base de dados do Spanner existente num futuro próximo. Por exemplo, pode ter de suportar um evento de tráfego grande, como o lançamento de um produto ou uma campanha de vendas.

Determine a quantidade de divisões

Recomendamos a criação de 10 pontos de divisão por nó. Uma vez que o Spanner pode dividir e ajustar-se ao tráfego rapidamente para instâncias mais pequenas, não precisa de pré-dividir instâncias mais pequenas.

Determine os pontos de divisão

Considere o seguinte ao determinar os pontos de divisão da sua base de dados:

  • Se o seu tráfego estiver distribuído uniformemente pelo intervalo de chaves, como quando usa UUIDs ou chaves de sequência com bits invertidos, escolha pontos de divisão que dividam uniformemente o espaço de chaves de tráfego.

  • Se o tráfego estiver concentrado num conjunto de intervalos de chaves conhecidos, divida e isole esses intervalos de chaves.

  • Se estiver à espera de tráfego nos seus índices, use pontos de divisão no índice correspondente.

  • As tabelas intercaladas são divididas se forem adicionados pontos de divisão à tabela principal. Se espera um tráfego mais elevado na tabela intercalada, certifique-se de que usa pontos de divisão na tabela intercalada correspondente.

  • Pode atribuir os pontos de divisão a objetos de esquema proporcionalmente ao aumento do respetivo tráfego.

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

Suponha que a sua base de dados tem as estruturas de tabelas definidas pela seguinte LDD:

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 tem de adicionar 100 pontos de divisão para distribuir uniformemente o aumento previsto no tráfego na tabela UserInfo e nas respetivas tabelas intercaladas. Como os pontos de divisão estão distribuídos uniformemente, tem de encontrar o número de linhas ou offset entre cada ponto de divisão:

offset = o valor máximo do intervalo 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 N.º 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 ponto de divisão é UserId_first + (offset * 2).

Uma vez que a tabela UserLocationInfo é uma tabela intercalada da tabela UserInfo, também é dividida nos limites de UserId. Também pode criar pontos de divisão na tabela UserLocationInfo na coluna LocationId.

Tenha em atenção que LocationId segue o formato $COUNTRY_$STATE_$CITY_$BLOCK_$NUMBER, por exemplo, US_CA_SVL_MTL_1100_7.

Para um UserId, com base no prefixo da string LocationId, pode determinar divisões para colocar a tabela UserLocationInfo para o UserId em 3 países diferentes em 3 divisões diferentes:

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

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

Se quiser dividir o índice UsersByLocation, pode distribuir uniformemente os pontos de divisão na coluna LocationId ou isolar alguns valores da coluna LocationId que se espera que recebam um aumento do tráfego:

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

Pode dividir ainda mais o índice usando as partes principais da chave da tabela indexada para localizações que recebem um aumento ainda maior do tráfego. Por exemplo, se esperar que a localização CN receba um aumento do tráfego, pode introduzir 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")

Validade dos pontos divididos

Pode definir um tempo de expiração para cada ponto de divisão. Consoante o seu exemplo de utilização, defina os pontos de divisão para expirar depois de o aumento previsto do tráfego diminuir.

O tempo de validade predefinido é de 10 dias a partir do momento em que a divisão é criada ou atualizada. O tempo de validade máximo permitido é de 30 dias a partir do momento em que cria ou atualiza a divisão.

Após a expiração da divisão, o Spanner assume a gestão da divisão e já não pode ver a divisão. O Spanner pode unir a divisão consoante o tráfego.

Também pode atualizar a hora de validade de um ponto de divisão antes de expirar. Por exemplo, se o aumento do tráfego não tiver diminuído, pode aumentar o tempo de expiração da divisão. Se já não precisar de um ponto de divisão, pode defini-lo para expirar imediatamente. Para saber como definir o tempo de expiração dos pontos divididos, consulte o artigo Como fazer expirar um ponto dividido.

Resultados da divisão prévia da sua base de dados

Os seguintes resultados são prováveis após adicionar pontos de divisão:

  • Alterações na latência: a adição de pontos de divisão é uma forma de simular aumentos no tráfego na base de dados. Quando uma base de dados tem mais divisões, podem ocorrer aumentos permanentes na latência de leitura e escrita devido a mais participantes de transações e divisões de consultas. Também pode esperar um aumento na utilização de computação e consultas por pedido de leitura ou escrita.

  • Eficácia dos pontos de divisão: para determinar se os pontos de divisão adicionados são benéficos, monitorize o perfil de latência para verificar se existem alterações mínimas e o visualizador de chaves para verificar se existem pontos críticos. Se notar pontos críticos, pode fazer expirar os pontos de divisão imediatamente e criar novos. Para mais informações sobre os pontos de divisão com prazo de validade, consulte o artigo Como fazer 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 após a estabilização do aumento do tráfego. A distribuição dividida pode não convergir para o ponto em que estava antes do aumento da carga. A base de dados pode estabilizar num perfil de latência diferente devido à alteração do tráfego e à divisão necessária para suportar o tráfego.

Exemplo de utilização

Considere que é administrador de base de dados numa empresa de videojogos e está a antecipar um aumento do tráfego para o lançamento de um novo jogo. Está a esperar o tráfego em novas tabelas que estão vazias.

Tem de garantir que não existe nenhuma interrupção do serviço quando o tráfego passa para que não haja um impacto observável na latência ou nas taxas de erro.

Considere a seguinte estratégia de pré-divisão de alto nível para este exemplo de utilização:

  1. Identifique o número de nós que a instância precisa para suportar o aumento do tráfego. Para saber como identificar a quantidade de nós, consulte o artigo Vista geral do desempenho. Se estiver a usar o autoscaler, defina o parâmetro de limite máximo para a contagem de nós que identificou. Além disso, defina o parâmetro de limite mínimo para (número de nós que identificou / 5).

  2. Identifique as tabelas e os índices que têm o tráfego mais elevado e que podem beneficiar mais da utilização de pontos de divisão. Analise os dados atuais e escolha entre usar pontos de divisão personalizados ou pontos de divisão distribuídos uniformemente.

  3. Crie os pontos de divisão no mínimo 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 numa instância, consulte o artigo Veja os pontos de divisão.

Advertências

Considere as seguintes ressalvas ao criar pontos de divisão:

  • Eliminação de tabelas, índices e bases de dados: antes de eliminar uma tabela, um índice ou uma base de dados, tem de garantir que todos os pontos de divisão adicionados correspondentes expiraram. Pode fazê-lo definindo a data de validade da divisão para a hora atual. Isto é necessário para que a quota ao nível da instância seja recuperada. Para mais informações sobre a expiração de pontos de divisão, consulte Como fazer expirar um ponto de divisão.

  • Fazer cópias de segurança e restaurar bases de dados: as divisões adicionadas não têm cópia de segurança. Tem de criar divisões numa base de dados restaurada.

  • Dimensionamento automático assimétrico: se estiver a usar o dimensionamento automático assimétrico, a quantidade de nós usada para determinar a quantidade de pontos de divisão é a quantidade mínima de nós em todas as regiões.

  • Aumento temporário nas métricas de utilização do armazenamento: a adição de pontos de divisão aumenta temporariamente a métrica de armazenamento total da base de dados até o Spanner concluir a compactação. Para mais informações, consulte o artigo Utilização do armazenamento. Isto só acontece quando os intervalos de chaves existentes são divididos ainda mais e não quando os novos intervalos de chaves são divididos.

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

Limites de pré-divisão

A divisão prévia da base de dados tem as seguintes limitações:

  • Não pode dividir previamente os índices de pesquisa. Só precisa de dividir previamente a tabela base. Para mais informações, consulte o artigo Fragmentação do índice de pesquisa.

  • Não pode dividir previamente os índices vetoriais. Para mais informações sobre os índices vetoriais, consulte o artigo Índice vetorial.

  • Para saber mais acerca das quotas de pontos divididos, consulte o artigo Quotas e limites.

O que se segue?