4.1 Descrição

O Apache Cassandra é um sistema de gerenciamento de banco de dados distribuído que pertence à classe dos sistemas NoSQL e foi projetado para criar armazenamentos altamente escaláveis ​​e confiáveis ​​de enormes matrizes de dados apresentadas na forma de um hash.

Inicialmente, o projeto foi desenvolvido nas entranhas do Facebook e em 2009 transferido para a proteção da Apache Software Foundation, esta organização continua a desenvolver o projeto. As soluções industriais baseadas em Cassandra são implantadas para fornecer serviços a empresas como Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter e Spotify. Em 2011, o maior cluster de servidores atendendo a um único banco de dados no Cassandra tinha mais de 400 máquinas e continha mais de 300 TB de dados.

Escrito na linguagem Java , ele implementa um sistema de hash distribuído semelhante ao DynamoDB, que fornece escalabilidade quase linear com o aumento do volume de dados. Ele usa um modelo de armazenamento de dados baseado em uma família de colunas, que difere de sistemas como MemcacheDB, que armazenam dados apenas em um par chave-valor, pela capacidade de armazenar hashes com vários níveis de aninhamento.

Pertence à categoria de SGBD tolerante a falhas: os dados colocados no banco de dados são replicados automaticamente para vários nós de uma rede distribuída ou mesmo distribuídos uniformemente em vários data centers. Quando um nó falha, suas funções são captadas em tempo real por outros nós, adicionando novos nós ao cluster e atualizando a versão do Cassandra é feito em tempo real, sem intervenção manual adicional e reconfiguração de outros nós.

No entanto, é altamente recomendável gerar novamente chaves (rótulos) para cada nó, incluindo os existentes, a fim de preservar a qualidade do balanceamento de carga. A geração de chaves para nós existentes pode ser evitada no caso de um aumento múltiplo no número de nós (2 vezes, 3 vezes e assim por diante).

4.2 Modelo de dados

Na terminologia Cassandra, um aplicativo funciona com um keyspace, que corresponde ao conceito de esquema de banco de dados no modelo relacional. Este keyspace pode conter várias famílias de colunas, o que corresponde ao conceito de uma tabela relacional.

Por sua vez, as famílias de colunas contêm colunas (coluna), que são combinadas usando a chave (chave de linha) no registro (linha). A coluna consiste em três partes: name (nome da coluna), timestamp (timestamp) e value (valor). As colunas dentro de um registro são ordenadas. Ao contrário de um banco de dados relacional, não há restrições sobre se os registros (e em termos de banco de dados são linhas) contêm colunas com os mesmos nomes de outros registros - não.

As famílias de colunas podem ser de vários tipos, mas neste artigo omitiremos esse detalhe. Também nas versões mais recentes do Cassandra, tornou-se possível executar consultas para definir e alterar dados (DDL, DML) usando a linguagem CQL, além de criar índices secundários.

O valor específico armazenado no cassandra é identificado por:

  • keyspace é uma ligação ao aplicativo (domínio). Permite hospedar dados de diferentes aplicações no mesmo cluster;
  • um grupo de colunas é uma associação a uma consulta;
  • key é uma associação a um nó de cluster. A chave determina em quais nós as colunas salvas terminarão;
  • nome da coluna é uma associação a um atributo no registro. Permite armazenar vários valores em uma entrada.

Cada valor está associado a um timestamp, um número especificado pelo usuário que é usado para resolver conflitos durante a gravação: quanto maior o número, a coluna mais nova é considerada e, quando comparada, substitui as colunas antigas.

4.3 Tipos de dados

Por tipos de dados: keyspace e família de colunas são strings (nomes); timestamp é um número de 64 bits; e a chave, o nome da coluna e o valor da coluna são uma matriz de bytes. Cassandra também tem o conceito de tipos de dados. Esses tipos podem ser especificados (opcionalmente) pelo desenvolvedor ao criar uma família de colunas.

Para nomes de colunas, isso é chamado de comparador, para valores e chaves, é chamado de validador. A primeira define quais valores de bytes são permitidos para nomes de colunas e como ordená-los. A segunda é quais valores de byte são válidos para valores de coluna e chave.

Se esses tipos de dados não forem definidos, o cassandra armazena os valores e os compara como strings de bytes (BytesType), pois, na verdade, eles são armazenados internamente.

Os tipos de dados são:

  • BytesType : qualquer string de byte (sem validação)
  • AsciiType : string ASCII
  • UTF8Type : string UTF-8
  • IntegerType : número com tamanho arbitrário
  • Int32Type : número de 4 bytes
  • LongType : número de 8 bytes
  • UUIDType : UUID tipo 1 ou 4
  • TimeUUIDType : Tipo 1 UUID
  • DateType : valor de carimbo de data/hora de 8 bytes
  • BooleanType : dois valores: true = 1 ou false = 0
  • FloatType : número de ponto flutuante de 4 bytes
  • DoubleType : número de ponto flutuante de 8 bytes
  • DecimalType : um número com um tamanho arbitrário e um ponto flutuante
  • CounterColumnType : contador de 8 bytes

No cassandra, todas as operações de escrita de dados são sempre operações de reescrita, ou seja, se uma coluna com a mesma chave e nome que já existe vier para a família de colunas, e o timestamp for maior que o que está salvo, então o valor é sobrescrito . Os valores registrados nunca mudam, apenas as colunas mais recentes entram com novos valores.

Escrever no cassandra é mais rápido do que ler. Isso muda a abordagem adotada no projeto. Se considerarmos cassandra do ponto de vista de projetar um modelo de dados, é mais fácil imaginar uma família de colunas não como uma tabela, mas como uma visão materializada - uma estrutura que representa os dados de alguma consulta complexa, mas os armazena em disco.

Em vez de tentar compor os dados de alguma forma usando consultas, é melhor tentar armazenar tudo o que pode ser necessário para essa consulta na família de destino. Ou seja, é preciso abordar não do lado das relações entre entidades ou relacionamentos entre objetos, mas do lado das consultas: quais campos devem ser selecionados; em que ordem os registros devem ir; quais dados relacionados aos principais devem ser solicitados juntos - tudo isso já deve estar armazenado na família de colunas.

O número de colunas em um registro é teoricamente limitado a 2 bilhões. Esta é uma breve digressão, e mais detalhes podem ser encontrados no artigo sobre técnicas de design e otimização. E agora vamos nos aprofundar no processo de salvar dados no cassandra e lê-los.