Interface do Cassandra

Nesta página, comparamos a arquitetura do Apache Cassandra e do Spanner, além de ajudar você a entender as capacidades e limitações da interface do Cassandra do Spanner. Ele pressupõe que você já conhece o Cassandra e quer migrar aplicativos atuais ou projetar novos usando o Spanner como banco de dados.

O Cassandra e o Spanner são bancos de dados distribuídos em grande escala criados para aplicativos que exigem alta escalonabilidade e baixa latência. Embora os dois bancos de dados possam oferecer suporte a cargas de trabalho NoSQL exigentes, o Spanner oferece recursos avançados para modelagem de dados, consultas e operações transacionais. Para mais informações sobre como o Spanner atende aos critérios de banco de dados NoSQL, consulte Spanner para cargas de trabalho não relacionais.

Principais conceitos

Esta seção compara os principais conceitos do Cassandra e do Spanner.

Terminologia

Cassandra Spanner
Cluster Instância

Um cluster do Cassandra é equivalente a uma instância do Spanner, que é uma coleção de servidores e recursos de armazenamento. Como o Spanner é um serviço gerenciado, não é necessário configurar o hardware ou software subjacente. Você só precisa especificar a quantidade de nós que quer reservar para sua instância ou usar o escalonamento automático para escalonar a instância automaticamente. Uma instância funciona como um contêiner para seus bancos de dados. Você também escolhe a topologia de replicação de dados (regional, birregional ou multirregional) no nível da instância.
Keyspace Banco de dados

Um keyspace do Cassandra é equivalente a um banco de dados do Spanner, que é uma coleção de tabelas e outros elementos de esquema (por exemplo, índices e funções). Ao contrário de um keyspace, não é necessário configurar o local de replicação. O Spanner replica automaticamente seus dados para a região designada na sua instância.
Tabela Tabela

No Cassandra e no Spanner, as tabelas são uma coleção de linhas identificadas por uma chave primária especificada no esquema da tabela.
Partição Divisão

O Cassandra e o Spanner escalonam dividindo os dados. No Cassandra, cada fragmento é chamado de partição, enquanto no Spanner, cada fragmento é chamado de divisão. O Cassandra usa o particionamento por hash, o que significa que cada linha é atribuída de forma independente a um nó de armazenamento com base em um hash da chave primária. O Spanner é fragmentado por intervalo, o que significa que as linhas contíguas no espaço de chaves da chave primária também são contíguas no armazenamento (exceto nos limites de divisão). O Spanner cuida da divisão e da fusão com base na carga e no armazenamento, e isso é transparente para o aplicativo. A principal implicação é que, ao contrário do Cassandra, as verificações de intervalo em um prefixo da chave primária são uma operação eficiente no Spanner.
Row Linha

No Cassandra e no Spanner, uma linha é uma coleção de colunas identificadas exclusivamente por uma chave primária. Assim como o Cassandra, o Spanner é compatível com chaves primárias compostas. Ao contrário do Cassandra, o Spanner não faz distinção entre a chave de partição e as colunas de clustering, porque os dados são fragmentados por intervalo. Você pode pensar no Spanner como tendo apenas colunas de clustering, com o particionamento gerenciado nos bastidores.
Coluna Coluna

No Cassandra e no Spanner, uma coluna é um conjunto de valores de dados do mesmo tipo. Há um valor para cada linha de uma tabela. Para mais informações sobre como comparar tipos de colunas do Cassandra com o Spanner, consulte Tipos de dados.

Arquitetura

Um cluster do Cassandra consiste em um conjunto de servidores e armazenamento colocados com esses servidores. Uma função de hash mapeia linhas de um keyspace de chave de partição para um nó virtual (vnode). Em seguida, um conjunto de vnodes é atribuído aleatoriamente a cada servidor para veicular uma parte do keyspace do cluster. O armazenamento dos vnodes é anexado localmente ao nó de serviço. Os drivers de cliente se conectam diretamente aos nós de serviço e processam o balanceamento de carga e o roteamento de consultas.

Uma instância do Spanner consiste em um conjunto de servidores em uma topologia de replicação. O Spanner fragmenta dinamicamente cada tabela em intervalos de linhas com base no uso da CPU e do disco. Os fragmentos são atribuídos a nós de computação para veiculação. Os dados são armazenados fisicamente no Colossus, o sistema de arquivos distribuídos do Google, separado dos nós de computação. Os drivers de cliente se conectam aos servidores de front-end do Spanner, que realizam o roteamento de solicitações e o balanceamento de carga. Para saber mais, consulte o artigo Ciclo de vida das leituras e gravações do Spanner.

Em um nível alto, as duas arquiteturas escalonam à medida que os recursos são adicionados ao cluster subjacente. A separação de computação e armazenamento do Spanner permite que a carga entre os nós de computação seja reequilibrada mais rapidamente em resposta a mudanças na carga de trabalho. Ao contrário do Cassandra, as movimentações de fragmentos não envolvem movimentações de dados, já que os dados permanecem no Colossus. Além disso, o particionamento baseado em intervalos do Spanner pode ser mais natural para aplicativos que esperam que os dados sejam classificados por chave de partição. O outro lado do particionamento baseado em intervalo é que as cargas de trabalho que gravam em uma extremidade do espaço de chaves (por exemplo, tabelas com chave pelo carimbo de data/hora atual) podem ter hotspots se outros projetos de esquema não forem considerados. Para mais informações sobre técnicas para superar pontos de acesso, consulte Práticas recomendadas de design de esquema.

Consistência

Com o Cassandra, é necessário especificar um nível de consistência para cada operação. Se você usar o nível de consistência de quorum, a maioria do nó de réplica precisará responder ao nó do coordenador para que a operação seja considerada bem-sucedida. Se você usar um nível de consistência de um, o Cassandra precisará de um único nó de réplica para responder e a operação ser considerada bem-sucedida.

O Spanner oferece consistência forte. A API Spanner não expõe réplicas ao cliente. Os clientes do Spanner interagem com ele como se fosse um banco de dados de uma única máquina. Uma gravação é sempre feita em uma maioria de réplicas antes que o Spanner informe o sucesso ao usuário. Qualquer leitura subsequente reflete os dados recém-gravados. Os aplicativos podem optar por ler um snapshot do banco de dados em um momento no passado, o que pode ter benefícios de desempenho em relação a leituras consistentes. Para mais informações sobre as propriedades de consistência do Spanner, consulte a visão geral das transações.

Ele foi criado para oferecer a consistência e a disponibilidade necessárias em aplicativos de grande escala. O Spanner oferece consistência forte em grande escala e com alto desempenho. Para casos de uso que exigem isso, o Spanner oferece suporte a leituras de snapshot (desatualizadas) que flexibilizam os requisitos de atualização.

Interface do Cassandra

Com a interface do Cassandra, você aproveita a infraestrutura totalmente gerenciada, escalonável e altamente disponível do Spanner usando ferramentas e sintaxe familiares do Cassandra. Esta página ajuda você a entender os recursos e as limitações da interface do Cassandra.

Benefícios da interface do Cassandra

  • Portabilidade: a interface do Cassandra oferece acesso a toda a gama de recursos do Spanner, usando esquemas, consultas e clientes compatíveis com o Cassandra. Isso simplifica a movimentação de um aplicativo criado no Spanner para outro ambiente do Cassandra ou vice-versa. Essa portabilidade oferece flexibilidade de implantação e é compatível com cenários de recuperação de desastres, como uma saída forçada.
  • Familiaridade: se você já usa o Cassandra, pode começar a usar o Spanner rapidamente com muitas das mesmas instruções e tipos de CQL.
  • Spanner sem concessões: como é criada com base na estrutura atual do Spanner, a interface do Cassandra oferece todos os benefícios de disponibilidade, consistência e custo-benefício do Spanner sem comprometer nenhum dos recursos disponíveis no ecossistema complementar do GoogleSQL.

Compatibilidade com CQL

  • Suporte ao dialeto CQL: o Spanner oferece um subconjunto do dialeto CQL, incluindo linguagem de consulta de dados (DQL), linguagem de manipulação de dados (DML), transações leves (LWT, na sigla em inglês), funções de agregação e de data/hora.

  • Funcionalidade do Cassandra compatível: a interface do Cassandra é compatível com muitos dos recursos mais usados do Cassandra. Isso inclui partes principais do esquema e do sistema de tipos, muitas formas de consulta comuns, uma variedade de funções e operadores e os principais aspectos do catálogo do sistema do Cassandra. Os aplicativos podem usar muitos clientes ou drivers do Cassandra conectando-se à implementação do Spanner do protocolo de rede do Cassandra.

  • Suporte a protocolo de cliente e de rede: o Spanner é compatível com os principais recursos de consulta do protocolo de rede do Cassandra v4 usando o adaptador do Cassandra, um cliente leve que é executado ao lado do aplicativo. Isso permite que muitos clientes do Cassandra funcionem como estão com um banco de dados de interface do Cassandra do Spanner, aproveitando o gerenciamento global de endpoints e conexões do Spanner e a autenticação do IAM.

Tipos de dados do Cassandra compatíveis

A tabela a seguir mostra os tipos de dados do Cassandra compatíveis e mapeia cada tipo de dados para o tipo de dados equivalente do GoogleSQL do Spanner.

Tipos de dados do Cassandra compatíveis Tipo de dados GoogleSQL do Spanner
Tipos numéricos tinyint (inteiro assinado de 8 bits) INT64 (inteiro assinado de 64 bits)

O Spanner oferece suporte a um único tipo de dados de 64 bits para números inteiros com sinal.

smallint (número inteiro assinado de 16 bits)
int (inteiro assinado de 32 bits)
bigint (inteiro assinado de 64 bits)
float (ponto flutuante IEEE-754 de 32 bits) FLOAT32 (ponto flutuante IEEE-754 de 32 bits)
double (ponto flutuante IEEE-754 de 64 bits) FLOAT64 (ponto flutuante IEEE-754 de 64 bits)
decimal Para números decimais de precisão fixa, use o tipo de dados NUMERIC (precisão 38, escala 9).
varint (inteiro de precisão variável)
Tipos de string text STRING(MAX)

Tanto text quanto varchar armazenam e validam strings UTF-8. No Spanner, as colunas STRING precisam especificar o comprimento máximo. Não há impacto no armazenamento. Isso é para fins de validação.

varchar
ascii STRING(MAX)
uuid STRING(MAX)
inet STRING(MAX)
blob BYTES(MAX)

Para armazenar dados binários, use o tipo de dados BYTES.

Tipos de data e hora date DATE
time INT64

O Spanner não é compatível com um tipo de dados de tempo dedicado. Use INT64 para armazenar a duração em nanossegundos.

timestamp TIMESTAMP
timeuuid STRING(MAX)
Tipos de contêiner set ARRAY

O Spanner não é compatível com um tipo de dados set dedicado. Use colunas ARRAY para representar um set.

list ARRAY

Use ARRAY para armazenar uma lista de objetos tipados.

map JSON

O Spanner não é compatível com um tipo de mapa dedicado. Use colunas JSON para representar mapas.

Outros tipos boolean BOOL
counter INT64

Anotações de tipo de dados

A opção de coluna cassandra_type permite definir mapeamentos entre os tipos de dados do Cassandra e do Spanner. Ao criar uma tabela no Spanner para interagir com ela usando consultas compatíveis com o Cassandra, você pode usar a opção cassandra_type para especificar o tipo de dados correspondente do Cassandra em cada coluna. Esse mapeamento é usado pelo Spanner para interpretar e converter dados corretamente ao transferi-los entre os dois sistemas de banco de dados.

Por exemplo, se houver uma tabela no Cassandra com o seguinte esquema:

CREATE TABLE Albums (
  albumId uuid,
  title varchar,
  artists set<varchar>,
  tags  map<varchar, varchar>,
  numberOfSongs tinyint,
  releaseDate date,
  copiesSold bigint,
  ....
  PRIMARY KEY(albumId)
)

No Spanner, você usa anotações de tipo para mapear os tipos de dados do Cassandra, conforme mostrado abaixo:

CREATE TABLE Albums (
  albumId       STRING(MAX) OPTIONS (cassandra_type = 'uuid'),
  title         STRING(MAX) OPTIONS (cassandra_type = 'varchar'),
  artists       ARRAY<STRING(max)> OPTIONS (cassandra_type = 'set<varchar>'),
  tags          JSON OPTIONS (cassandra_type = 'map<varchar, varchar>'),
  numberOfSongs INT64 OPTIONS (cassandra_type = 'tinyint'),
  releaseDate   DATE OPTIONS (cassandra_type = 'date'),
  copiesSold    INT64 OPTIONS (cassandra_type = 'bigint')
  ...
) PRIMARY KEY (albumId);

No exemplo anterior, a cláusula OPTIONS mapeia o tipo de dados do Spanner da coluna para o tipo de dados correspondente do Cassandra.

  • albumId (Spanner STRING(MAX)) é mapeado para uuid no Cassandra.
  • title (Spanner STRING(MAX)) é mapeado para varchar no Cassandra.
  • artists (Spanner ARRAY<STRING(MAX)>) é mapeado para set<varchar> no Cassandra.
  • tags (Spanner JSON) é mapeado para map<varchar,varchar> no Cassandra.
  • numberOfSongs (Spanner INT64) é mapeado para tinyint no Cassandra.
  • releaseDate (Spanner DATE) é mapeado para date no Cassandra.
  • copiesSold (Spanner INT64) é mapeado para bigint no Cassandra.
Modificar a opção cassandra_type

É possível usar a instrução ALTER TABLE para adicionar ou modificar a opção cassandra_type em colunas atuais.

Para adicionar uma opção cassandra_type a uma coluna que ainda não tem uma, use a seguinte instrução:

ALTER TABLE Albums ALTER COLUMN uuid SET OPTIONS (cassandra_type='uuid');

Neste exemplo, a coluna uuid na tabela "Albums" é atualizada com a opção cassandra_type definida como uuid.

Para modificar uma opção cassandra_type, use a instrução ALTER TABLE com o novo valor cassandra_type. Por exemplo, para mudar o cassandra_type da coluna numberOfSongs na tabela "Álbuns" de tinyint para bigint, use a seguinte instrução:

ALTER TABLE Albums ALTER COLUMN numberOfSongs SET OPTIONS (cassandra_type='bigint');

Você só pode modificar os seguintes tipos:

De Para
tinyint smallint, int, bigint
smallint int, bigint
int bigint
float double
texto varchar
ascii varchar, text
Mapeamentos diretos e sutis

Em muitos casos, o mapeamento entre os tipos de dados do Spanner e do Cassandra é simples. Por exemplo, um STRING(MAX) do Spanner é mapeado para um varchar do Cassandra, e um INT64 do Spanner é mapeado para um bigint do Cassandra.

No entanto, há situações em que o mapeamento exige mais consideração e ajuste. Por exemplo, talvez seja necessário mapear um smallint do Cassandra para um INT64 do Spanner.

Funções do Cassandra compatíveis

Esta seção lista as funções do Cassandra compatíveis com o Spanner.

A lista a seguir mostra o suporte do Spanner para funções do Cassandra.

Recursos do Cassandra sem suporte no Spanner

É importante entender que a interface do Cassandra oferece os recursos do Spanner por meio de esquemas, tipos, consultas e clientes compatíveis com o Cassandra. Ela não é compatível com todos os recursos do Cassandra. A migração de um aplicativo Cassandra para o Spanner, mesmo usando a interface do Cassandra, provavelmente exigirá alguma reformulação para acomodar recursos não compatíveis do Cassandra ou diferenças de comportamento, como otimização de consultas ou design de chave primária. No entanto, depois da migração, suas cargas de trabalho poderão aproveitar a confiabilidade e os recursos multimodais exclusivos do Spanner.

A lista a seguir fornece mais informações sobre recursos do Cassandra não compatíveis:

  • Alguns recursos da linguagem CQL não são compatíveis: tipos e funções definidos pelo usuário, TTL e carimbo de data/hora de gravação.
  • Spanner e Google Cloud plano de controle: bancos de dados com interfaces do Cassandra usam o Spanner e ferramentas do Google Cloudpara provisionar, proteger, monitorar e otimizar instâncias. O Spanner não é compatível com ferramentas, como nodetool, para atividades administrativas.

Suporte a DDL

As instruções DDL do CQL não são compatíveis diretamente com a interface do Cassandra. Para mudanças de DDL, use o console do Spanner Google Cloud , o comando gcloud ou as bibliotecas de cliente.

Conectividade

  • Suporte a clientes do Cassandra

    O Spanner permite que você se conecte a bancos de dados de vários clientes:

Controle de acesso com o Identity and Access Management

Você precisa ter as permissões spanner.databases.adapt, spanner.databases.select e spanner.databases.write para realizar operações de leitura e gravação no endpoint do Cassandra. Para mais informações, consulte a visão geral do IAM.

Para mais informações sobre como conceder permissões do IAM do Spanner, consulte Aplicar papéis do IAM.

Monitoramento

O Spanner fornece as seguintes métricas para ajudar você a monitorar o adaptador do Cassandra:

  • spanner.googleapis.com/api/adapter_request_count: captura e expõe o número de solicitações de adaptador que o Spanner realiza por segundo ou o número de erros que ocorrem no servidor do Spanner por segundo.
  • spanner.googleapis.com/api/adapter_request_latencies: captura e expõe a quantidade de tempo que o Spanner leva para processar solicitações de adaptador.

É possível criar um painel personalizado do Cloud Monitoring para mostrar e monitorar métricas do adaptador do Cassandra. O painel personalizado contém os seguintes gráficos:

  • Latências de solicitação P99: a distribuição do 99º percentil das latências de solicitação do servidor por message_type para seu banco de dados.

  • Latências de solicitação P50: a distribuição do 50º percentil das latências de solicitação do servidor por message_type do seu banco de dados.

  • Contagem de solicitações de API por tipo de mensagem: a contagem de solicitações de API por message_type do seu banco de dados.

  • Contagem de solicitações de API por tipo de operação: a contagem de solicitações de API por op_type do seu banco de dados.

  • Taxas de erro: as taxas de erro da API para seu banco de dados.

Google Cloud console

  1. Faça o download do arquivo cassandra-adapter-dashboard.json. Esse arquivo tem as informações necessárias para preencher um painel personalizado no Monitoring.
  2. No Google Cloud console, acesse a página  Painéis:

    Acesse Painéis

    Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Monitoring.

  3. Na página Visão geral dos painéis, clique em Criar painel personalizado.
  4. Na barra de ferramentas do painel, clique no ícone Configurações do painel. Em seguida, selecione JSON e Editor de JSON.
  5. No painel Editor JSON, copie o conteúdo do arquivo cassandra-adapter-dashboard.json que você baixou e cole no editor.
  6. Para aplicar as mudanças ao painel, clique em Aplicar mudanças. Se você não quiser usar esse painel, volte para a página "Visão geral dos painéis".
  7. Depois que o painel for criado, clique em Adicionar filtro. Em seguida, selecione project_id ou instance_id para monitorar o adaptador do Cassandra.

CLI da gcloud

  1. Faça o download do arquivo cassandra-adapter-dashboard.json. Esse arquivo tem as informações necessárias para preencher um painel personalizado no Monitoring.
  2. Para criar um painel em um projeto, use o comando gcloud monitoring dashboards create:

    gcloud monitoring dashboards create --config-from-file=cassandra-adapter-dashboard.json
    

    Para mais informações, consulte a referência gcloud monitoring dashboards create.

Além disso, as seguintes métricas do Spanner são úteis para monitorar o adaptador:

  • CPU utilization metrics fornecem informações sobre o uso da CPU para tarefas do usuário e do sistema com detalhamentos por prioridade e tipo de operação.
  • Storage utilization metrics fornecem informações sobre o banco de dados e o armazenamento de backup.
  • O Spanner built-in statistics tables fornece insights sobre consultas, transações e leituras para ajudar você a descobrir problemas nos seus bancos de dados.

Para uma lista completa de insights do sistema, consulte Monitorar instâncias com insights do sistema. Para saber mais sobre como monitorar seus recursos do Spanner, consulte Monitorar instâncias com o Cloud Monitoring.

Preços

Não há cobrança adicional pelo uso do endpoint do Cassandra. Você recebe a cobrança dos preços padrão do Spanner pela quantidade de capacidade de computação usada pela sua instância e pela quantidade de armazenamento usada pelo seu banco de dados.

Para mais informações, consulte os preços do Spanner.

A seguir