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 |
varchar |
||
ascii |
STRING(MAX) |
|
uuid |
STRING(MAX) |
|
inet |
STRING(MAX) |
|
blob |
BYTES(MAX)
Para armazenar dados binários, use o tipo de dados |
|
Tipos de data e hora | date |
DATE |
time |
INT64
O Spanner não é compatível com um tipo de dados de tempo dedicado. Use |
|
timestamp |
TIMESTAMP |
|
timeuuid |
STRING(MAX) |
|
Tipos de contêiner | set |
ARRAY
O Spanner não é compatível com um tipo de dados |
list |
ARRAY
Use |
|
map |
JSON
O Spanner não é compatível com um tipo de mapa dedicado. Use colunas |
|
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
(SpannerSTRING(MAX)
) é mapeado parauuid
no Cassandra.title
(SpannerSTRING(MAX)
) é mapeado paravarchar
no Cassandra.artists
(SpannerARRAY<STRING(MAX)>
) é mapeado paraset<varchar>
no Cassandra.tags
(SpannerJSON
) é mapeado paramap<varchar,varchar>
no Cassandra.numberOfSongs
(SpannerINT64
) é mapeado paratinyint
no Cassandra.releaseDate
(SpannerDATE
) é mapeado paradate
no Cassandra.copiesSold
(SpannerINT64
) é mapeado parabigint
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.
- Todas as funções de agregação
- Todas as funções de data/hora, exceto
currentTimeUUID
- Todas as funções de conversão, exceto as de conversão de blob
- Todas as funções de transação leves, exceto as condições
BATCH
- Nenhuma das seguintes funções de consulta:
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:
- O adaptador do Cassandra pode ser usado como um auxiliar no processo ou como um proxy sidecar para conectar seus aplicativos do Cassandra à interface do Cassandra. Para mais informações, consulte Conectar-se ao Spanner usando o adaptador do Cassandra.
- O adaptador do Cassandra pode ser iniciado como um processo independente
localmente e conectado usando
CQLSH
. Para mais informações, consulte Conectar o adaptador do Cassandra ao aplicativo.
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
- 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. -
No Google Cloud console, acesse a página
Painéis:
Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Monitoring.
- Na página Visão geral dos painéis, clique em Criar painel personalizado.
- Na barra de ferramentas do painel, clique no ícone Configurações do painel. Em seguida, selecione JSON e Editor de JSON.
- No painel Editor JSON, copie o conteúdo do arquivo
cassandra-adapter-dashboard.json
que você baixou e cole no editor. - 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".
- Depois que o painel for criado, clique em Adicionar filtro. Em seguida, selecione
project_id
ouinstance_id
para monitorar o adaptador do Cassandra.
CLI da gcloud
- 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. 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
- Aprenda a migrar do Cassandra para o Spanner.
- Saiba como se conectar ao Spanner usando o adaptador do Cassandra.