Como projetar seu esquema

Veja nesta página como projetar um esquema para uma tabela do Cloud Bigtable. Antes de ler esta página, familiarize-se com a visão geral do Cloud Bigtable.

Conceitos gerais

Projetar um esquema do Cloud Bigtable é muito diferente de projetar um esquema para um banco de dados relacional. No primeiro caso, lembre-se dos seguintes conceitos:

  • Cada tabela tem apenas um índice: a chave de linha. Não há índices secundários.
  • As linhas são classificadas lexicograficamente por chave de linha, da string que tem menos bytes para a que tem mais. As chaves de linha são classificadas por bytes big-endian ou de rede, o equivalente binário à ordem alfabética.
  • Todas as operações são atômicas no nível da linha. Por exemplo, se você atualizar duas linhas em uma tabela, possivelmente uma linha será atualizada com êxito, e a outra falhará. Evite projetar esquemas que necessitam de atomicidade entre linhas.
  • O ideal é que leituras e gravações sejam distribuídas por igual pelo espaço da linha da tabela.
  • Em geral, mantenha todas as informações de uma entidade em uma única linha. Uma entidade que não precisa de atualizações e leituras atômicas pode ser dividida em várias linhas. Isso é recomendável se os dados da entidade forem grandes (centenas de MB).
  • As entidades relacionadas precisam ser armazenadas em linhas adjacentes, o que torna as leituras mais eficientes.
  • As tabelas do Cloud Bigtable são esparsas. As colunas vazias não ocupam espaço. Como resultado, a prática recomendada é criar um grande número de colunas, mesmo que a maioria tenha muitas linhas vazias.

Limites de tamanho

O Cloud Bigtable impõe limites de tamanho nos dados armazenados nas suas tabelas. Lembre-se de considerar esses limites ao projetar seu esquema.

Como o Cloud Bigtable lê as linhas atomicamente, é importante limitar a quantidade total de dados que você armazena em uma única linha. Como prática recomendada, armazene no máximo 10 MB em uma única célula e 100 MB em uma única linha. Você não pode ultrapassar os limites rígidos de tamanho de dados nas células e nas linhas.

Esses limites de tamanho são medidos em megabytes binários (MB), em que 1 MB é igual a 220 bytes. Essa unidade de medida também é conhecida como mebibyte (MiB).

Como escolher uma chave de linha

Para alcançar o melhor desempenho possível no Cloud Bigtable, é essencial pensar cuidadosamente em como compor a chave de linha. Isso é importante porque as consultas mais eficientes do Cloud Bigtable usam a chave de linha, um prefixo ou intervalo de linhas para recuperar os dados. Outros tipos de consultas acionam a verificação total da tabela, o que é bem menos eficiente. Se você escolher a chave de linha correta agora, evitará um complicado processo de migração de dados mais tarde.

Comece questionando como serão usados os dados que você planeja armazenar. Por exemplo:

  • informações de usuários: você precisa de acesso rápido a informações sobre conexões entre usuários (por exemplo, se o usuário A segue o usuário B)?
  • conteúdo gerado pelo usuário: se você mostra aos demais usuários uma amostra de uma grande quantidade de conteúdo gerado por um usuário, como atualizações de status, como decidir o que será exibido?
  • dados de série temporal: você precisará recuperar com frequência os registros N mais recentes ou de um determinado período de tempo? Se você estiver armazenando dados de vários tipos de eventos, será necessário filtrá-los com base no tipo de evento?

Se você entender suas necessidades desde o início, sua chave de linha e o seu esquema terão como oferecer a flexibilidade suficiente para a realização de consultas eficientes aos dados.

Tipos de chaves de linha

Esta seção descreve alguns dos tipos de chaves de linha mais comuns, além de explicar quando usar cada um.

Como regra básica, mantenha as chaves de linha curtas, na medida do possível. Chaves de linha compridas ocupam um espaço adicional de memória e armazenamento, além de aumentarem o tempo necessário para receber as respostas do servidor do Cloud Bigtable.

Nomes de domínio inversos

Se você estiver armazenando dados sobre entidades que podem ser representadas como nomes de domínio, pense em usar como chave de linha o nome de domínio inverso (por exemplo, com.company.product). Usá-lo assim é uma ótima ideia, principalmente se os dados de cada linha se sobrepuserem às linhas adjacentes. Nesse caso, o Cloud Bigtable compactará os dados de forma mais eficiente.

Essa abordagem funciona melhor quando os dados estão espalhados por muitos nomes de domínio inversos diferentes. Se você pretende armazenar a maior parte dos dados em um número pequeno de nomes de domínio inversos, pense em atribuir outros valores à chave de linha. Caso contrário, você poderá sobrecarregar um bloco, empurrando a maioria das gravações para um único nó no cluster.

Identificadores de string

Caso esteja armazenando dados sobre entidades que possam ser identificadas por uma string simples (por exemplo, o código do usuário), recomenda-se que você use o identificador da string como chave de linha ou como uma parte dessa chave.

Anteriormente, esta página recomendava usar um hash do identificador de string em vez do identificador de string real. O uso de hash não é mais recomendado. Descobrimos que as chaves de linha em hash dificultam a solução de problemas com o Cloud Bigtable, porque elas são efetivamente sem sentido. Por exemplo, se sua chave de linha for um hash do código de usuário, será difícil ou impossível descobrir qual código de usuário está vinculado à chave de linha.

Use valores legíveis em vez de valores em hash na chave de linha. Além disso, se sua chave de linha incluir vários valores, separe-os com um delimitador. Essas práticas facilitam o uso da ferramenta Key Visualizer para resolver problemas com o Cloud Bigtable.

Carimbos de data/hora

Se você frequentemente precisa recuperar dados com base na data e hora em que foram gravados, uma boa solução é incluir um carimbo de data/hora como parte da chave de linha. Não é recomendável usar somente o carimbo de data/hora como chave de linha, pois a maioria das gravações seria empurrada para um único nó. Pelo mesmo motivo, evite colocar o carimbo no início da chave de linha.

Por exemplo, digamos que o seu aplicativo precise gravar, a cada segundo, dados relacionados ao desempenho de um grande número de máquinas, como utilização de CPU e memória. A chave de linha desses dados poderia ser uma combinação de identificador da máquina e carimbo de data/hora dos dados (por exemplo, machine_4223421#1425330757685).

Se você normalmente recupera primeiro os registros mais recentes, é possível usar um carimbo de data/hora invertido na chave de linha subtraindo o carimbo do valor máximo da linguagem de programação para números inteiros longos (em Java, java.lang.Long.MAX_VALUE). Com o carimbo invertido, os registros serão ordenados do mais recente para o mais antigo.

Vários valores em uma única chave de linha

Como a única maneira de realizar consultas no Cloud Bigtable com eficiência é utilizando a chave de linha, na maioria dos casos, é muito útil incluir vários identificadores nela. Quando a chave de linha contém vários valores, é importante saber como os dados serão usados.

Por exemplo, digamos que seu aplicativo permita que os usuários postem mensagens e mencionem uns aos outros nas postagens. Você quer encontrar uma forma eficiente de listar todos os usuários que marcaram um usuário específico em uma postagem. Uma maneira de fazer isso é usar uma chave de linha que contenha o nome de usuário marcado, seguida pelo nome de usuário que fez a marcação, separados por um delimitador (por exemplo, wmckinley#gwashington). Para descobrir quem marcou um nome de usuário específico ou mostrar todas as postagens com a tag desse nome de usuário, basta recuperar o intervalo de linhas com chaves que comecem pelo nome de usuário.

É importante criar uma chave de linha que permita recuperar um intervalo de linhas bem definido. Caso contrário, sua consulta necessitará de uma verificação da tabela, o que é muito mais lento do que recuperar linhas específicas. Por exemplo, imagine que você armazena dados relacionados a desempenho a cada segundo. Se a chave de linha consistir em um carimbo de data/hora seguido pelo identificador da máquina (por exemplo, 1425330757685#machine_4223421), não haverá uma maneira eficiente de limitar a consulta a apenas uma máquina específica. A consulta somente poderá ser limitada com base no carimbo de data/hora.

Prefixos de chave de linha

O primeiro valor em uma chave de linha de vários valores é chamado de prefixo de chave de linha. Os prefixos de chave de linha bem planejados permitem aproveitar a ordem de classificação do Cloud Bigtable para armazenar dados relacionados em linhas contíguas. O armazenamento de dados relacionados em linhas contíguas permite acessar dados relacionados como um intervalo de linhas, em vez de executar varreduras de tabela ineficientes.

Usando prefixos de chave de linha para multilocação

Os prefixos de chave de linha fornecem uma solução escalonável para um caso de uso de "multilocação", um cenário no qual você armazena dados semelhantes, usando o mesmo modelo de dados, em nome de vários clientes. O uso de uma tabela para todos os locatários costuma ser a maneira mais eficaz de armazenar e acessar dados de vários locatários.

Por exemplo, digamos que você armazene e rastreie históricos de compras em nome de muitas empresas. Você pode usar seu ID exclusivo para cada empresa como um prefixo de chave de linha. Todos os dados de um locatário seriam armazenados em linhas contíguas na mesma tabela e você poderia consultar ou filtrar usando o prefixo de chave de linha. Então, quando uma empresa não for mais seu cliente e você precisar excluir os dados do histórico de compras que estava armazenando para ela, poderá descartar o intervalo de linhas que usam o prefixo de chave de linha desse cliente.

Por outro lado, se você armazenasse dados em nome de cada empresa em sua própria tabela, provavelmente teria mais problemas de desempenho e escalonabilidade, além de ultrapassar inadvertidamente o limite de 1.000 tabelas do Cloud Bigtable por instância.

Chaves de linha a ser evitadas

Alguns tipos de chave de linha podem dificultar a consulta aos dados ou resultar em um desempenho insatisfatório. Esta seção descreve os tipos de chave de linha que você deve evitar no Cloud Bigtable.

Nomes de domínio

Evite usar nomes de domínio não inversos ou padrão como chaves de linha. O uso de nomes de domínio padrão torna ineficiente a recuperação de todas as linhas dentro de uma parte do domínio. Por exemplo, todas as linhas relacionadas a company.com estarão em intervalos de linhas separados, como services.company.com, product.company.com e assim por diante. Além disso, usar nomes de domínio padrão faz com que as linhas sejam classificadas de tal forma que os dados relacionados não são agrupados em um único lugar. Isso resulta em uma compactação menos eficiente.

Códigos numéricos sequenciais

Suponha que o seu sistema atribua um código numérico para cada usuário do seu aplicativo. Provavelmente, você ficará tentado a usar o código numérico do usuário como chave de linha na sua tabela. No entanto, como é mais provável que os usuários novos sejam mais ativos, essa abordagem poderá empurrar a maior parte do tráfego para um número pequeno de nós.

Uma abordagem segura é usar uma versão invertida do código numérico do usuário, distribuindo, assim, o tráfego de maneira uniforme para todos os nós da tabela do Cloud Bigtable.

Identificadores atualizados com frequência

Evite usar uma única chave de linha para identificar um valor que é atualizado com muita frequência. Por exemplo, se você armazena dados de uso de memória uma vez por segundo, não use uma única chave de linha com o nome memusage e não atualize a linha repetidamente. Esse tipo de operação sobrecarrega o bloco que armazena a linha usada com muita frequência. Isso também pode fazer com que a linha exceda o limite de tamanho, já que os valores anteriores de cada célula continuam ocupando espaço por um período de tempo.

Em vez disso, armazene um valor por linha, usando a chave de linha que contém o tipo de métrica, um delimitador e um carimbo de data/hora. Por exemplo, para rastrear o uso da memória ao longo do tempo, use chaves de linha semelhantes a memusage#1423523569918. Essa é uma estratégia eficiente porque criar uma linha nova no Cloud Bigtable é mais rápido que criar uma célula nova. Além disso, é possível realizar a leitura dos dados rapidamente a partir de um período específico calculando as chaves inicial e final adequadas.

Com relação aos valores alterados com muita frequência, como um contador que é atualizado centenas de vezes por minuto, a prática recomendada é simplesmente manter os dados na memória, na camada do aplicativo, e gravar linhas novas periodicamente no Cloud Bigtable.

Valores em hash

Conforme discutido acima, uma versão anterior desta página recomendou o uso de valores em hash nas chaves de linha. Essa prática não é mais recomendada. Ela gera chaves de linha sem sentido, o que dificulta o uso da ferramenta Key Visualizer para resolver problemas com o Cloud Bigtable.

Use valores legíveis em vez de valores em hash. Se sua chave de linha incluir muitos valores, separe-os com um delimitador.

Grupos e qualificadores de coluna

Esta seção fornece orientações sobre como considerar grupos de colunas e qualificadores de coluna na tabela.

Grupos de colunas

Diferentemente do HBase, no Cloud Bigtable, é possível usar até cerca de 100 grupos de colunas sem prejudicar o desempenho. Como resultado, sempre que uma linha contiver vários valores inter-relacionados, recomenda-se agrupar esses valores no mesmo grupo de colunas. Agrupar dados em colunas permite recuperar dados de um ou vários grupos, em vez de recuperar todos os dados de cada linha. Agrupe os dados com o máximo de proximidade possível para receber apenas as informações necessárias nas chamadas de API mais frequentes.

Além disso, os nomes dos grupos de colunas precisam ser curtos, porque eles estão inclusos nos dados transferidos em cada solicitação.

Qualificadores de coluna

Como as tabelas do Cloud Bigtable são esparsas, é possível criar quantos qualificadores de coluna você achar necessário em cada linha. Não há penalidade de espaço para células vazias em uma linha. Portanto, muitas vezes faz sentido tratar os qualificadores de coluna como dados. Por exemplo, se sua tabela armazena postagens de usuários, use o identificador exclusivo de cada postagem como qualificador de coluna.

Dito isso, evite dividir seus dados em mais qualificadores de coluna do que o necessário. Isso pode resultar em linhas com um número muito grande de células não vazias. Leva algum tempo até que o Cloud Bigtable processe cada célula de uma linha. Além disso, cada célula adiciona uma sobrecarga à quantidade de dados armazenados em sua tabela e enviados pela rede. Por exemplo, se você armazenar 1 KB (1.024 bytes) de dados, será muito mais eficiente armazenar esses dados em uma única célula, em vez de distribuí-los por 1.024 células de 1 byte cada. Se você normalmente lê ou grava alguns valores relacionados de uma só vez, considere armazená-los juntos em uma célula, com um formato que facilite a extração dos valores individuais posteriormente (como o formato binário do buffer de protocolo).

Da mesma maneira, é recomendável usar nomes de qualificadores de coluna curtos, o que ajuda a reduzir a quantidade de dados transferidos em cada solicitação.

Próximas etapas

Saiba como projetar um esquema para dados de séries temporais.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Cloud Bigtable