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:
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).
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.
Crie os pontos de divisão no mínimo sete dias e no máximo 12 horas antes do aumento previsto do tráfego.
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.