4.1 Descrizione

Apache Cassandra è un sistema di gestione di database distribuito che appartiene alla classe dei sistemi NoSQL ed è progettato per creare archivi altamente scalabili e affidabili di enormi array di dati presentati sotto forma di hash.

Inizialmente, il progetto è stato sviluppato nelle viscere di Facebook e nel 2009 trasferito sotto l'ala dell'Apache Software Foundation, questa organizzazione continua a sviluppare il progetto. Le soluzioni industriali basate su Cassandra vengono implementate per fornire servizi ad aziende come Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter e Spotify. Nel 2011, il più grande cluster di server che serviva un singolo database sotto Cassandra aveva più di 400 macchine e conteneva più di 300 TB di dati.

Scritto in linguaggio Java , implementa un sistema di hash distribuito simile a DynamoDB, che fornisce una scalabilità quasi lineare con l'aumento del volume di dati. Utilizza un modello di archiviazione dei dati basato su una famiglia di colonne, che differisce da sistemi come MemcacheDB, che memorizzano i dati solo in una coppia chiave-valore, per la capacità di memorizzare hash con diversi livelli di nidificazione.

Appartiene alla categoria dei DBMS fault-tolerant: i dati inseriti nel database vengono automaticamente replicati su più nodi di una rete distribuita o addirittura distribuiti uniformemente in più data center. Quando un nodo si guasta, le sue funzioni vengono rilevate al volo da altri nodi, l'aggiunta di nuovi nodi al cluster e l'aggiornamento della versione di Cassandra vengono eseguiti al volo, senza ulteriori interventi manuali e riconfigurazioni di altri nodi.

Tuttavia, si consiglia vivamente di rigenerare le chiavi (etichette) per ciascun nodo, comprese quelle esistenti, al fine di preservare la qualità del bilanciamento del carico. La generazione di chiavi per nodi esistenti può essere evitata in caso di aumento multiplo del numero di nodi (2 volte, 3 volte e così via).

4.2 Modello dati

Nella terminologia di Cassandra, un'applicazione funziona con uno spazio delle chiavi, che corrisponde al concetto di uno schema di database nel modello relazionale. Questo keyspace può contenere diverse famiglie di colonne, che corrispondono al concetto di tabella relazionale.

A loro volta, le famiglie di colonne contengono colonne (colonna), che vengono combinate utilizzando la chiave (chiave riga) nel record (riga). La colonna è composta da tre parti: name (nome della colonna), timestamp (timestamp) e value (valore). Le colonne all'interno di un record sono ordinate. A differenza di un database relazionale, non ci sono restrizioni sul fatto che i record (e in termini di database si tratta di righe) contengano colonne con gli stessi nomi di altri record - no.

Le famiglie di colonne possono essere di diversi tipi, ma in questo articolo ometteremo questo dettaglio. Anche nelle ultime versioni di Cassandra è diventato possibile eseguire query per la definizione e la modifica dei dati (DDL, DML) utilizzando il linguaggio CQL, nonché la creazione di indici secondari.

Il valore specifico memorizzato in cassandra è identificato da:

  • keyspace è un'associazione all'applicazione (dominio). Consente di ospitare dati da diverse applicazioni sullo stesso cluster;
  • una famiglia di colonne è un'associazione a una query;
  • key è un'associazione a un nodo del cluster. La chiave determina su quali nodi andranno a finire le colonne salvate;
  • il nome della colonna è un'associazione a un attributo nel record. Consente di memorizzare più valori in una voce.

Ogni valore è associato a un timestamp, un numero specificato dall'utente che viene utilizzato per risolvere i conflitti durante la registrazione: maggiore è il numero, viene considerata la colonna più recente e, se confrontata, sovrascrive le vecchie colonne.

4.3 Tipi di dati

Per tipi di dati: lo spazio delle chiavi e la famiglia di colonne sono stringhe (nomi); timestamp è un numero a 64 bit; e la chiave, il nome della colonna e il valore della colonna è un array di byte. Cassandra ha anche il concetto di tipi di dati. Questi tipi possono essere specificati (facoltativamente) dallo sviluppatore durante la creazione di una famiglia di colonne.

Per i nomi di colonna questo è chiamato comparatore, per valori e chiavi è chiamato validatore. Il primo definisce quali valori di byte sono consentiti per i nomi di colonna e come ordinarli. Il secondo è quali valori di byte sono validi per i valori di colonna e chiave.

Se questi tipi di dati non sono impostati, cassandra memorizza i valori e li confronta come stringhe di byte (BytesType) poiché, di fatto, sono archiviati internamente.

I tipi di dati sono:

  • BytesType : qualsiasi stringa di byte (nessuna convalida)
  • AsciiType : stringa ASCII
  • Tipo UTF8 : stringa UTF-8
  • IntegerType : numero con dimensione arbitraria
  • Int32Type : numero a 4 byte
  • LongType : numero a 8 byte
  • UUIDType : tipo UUID 1 o 4
  • TimeUUIDType : Tipo 1 UUID
  • DateType : valore timestamp a 8 byte
  • BooleanType : due valori: true = 1 o false = 0
  • FloatType : numero in virgola mobile a 4 byte
  • DoubleType : numero in virgola mobile a 8 byte
  • DecimalType : un numero con una dimensione arbitraria e un punto mobile
  • CounterColumnType : contatore a 8 byte

In cassandra, tutte le operazioni di scrittura dei dati sono sempre operazioni di riscrittura, ovvero se una colonna con la stessa chiave e nome già esistente arriva alla famiglia di colonne e il timestamp è maggiore di quello che viene salvato, allora il valore viene sovrascritto . I valori registrati non cambiano mai, solo le colonne più recenti arrivano con nuovi valori.

Scrivere a cassandra è più veloce che leggere. Questo cambia l'approccio adottato nella progettazione. Se consideriamo cassandra dal punto di vista della progettazione di un modello di dati, è più facile immaginare una famiglia di colonne non come una tabella, ma come una vista materializzata, una struttura che rappresenta i dati di una query complessa, ma li memorizza su disco.

Invece di provare a comporre i dati in qualche modo utilizzando le query, è meglio provare a memorizzare tutto ciò che potrebbe essere necessario per questa query nella famiglia di destinazione. Cioè, è necessario avvicinarsi non dal lato delle relazioni tra entità o relazioni tra oggetti, ma dal lato delle query: quali campi devono essere selezionati; in quale ordine dovrebbero andare i record; quali dati relativi a quelli principali dovrebbero essere richiesti insieme - tutto questo dovrebbe già essere memorizzato nella famiglia di colonne.

Il numero di colonne in un record è teoricamente limitato a 2 miliardi. Questa è una breve digressione, e maggiori dettagli possono essere trovati nell'articolo sulle tecniche di progettazione e ottimizzazione. E ora approfondiamo il processo di salvataggio dei dati in cassandra e la lettura.