Soluzioni NoSQL, Apache Cassandra

Cassandra è un DBMS distribuito non relazionale,  sviluppato in origine da Facebook è entrato a far parte dei progetti  open source (top level) di Apache Software Foundation con delle ottime referenze dettate dalle compagnie che lo utilizzano. Progettato per gestire un ampia mole di dati tipicamente su server clustered, è una soluzione NoSql (ma Structured Storage)  descritta dai creatori come un modello dati  BigTable su infrastruttura Amazon Dynamo-like, Cassandra fornisce una stuttura chiave-valore con eventual consistency.

Cassandra è una database distribuito, fault-tolerant, elastico e con consistenza dati regolabile (read/write),  nel quale più nodi di Cassandra cooperano per ottimizzare e distribuire le informazioni mediante un protocollo P2P, per cui i dati sono automaticamente replicati su più nodi.

In breve, il modello dati di Cassandra:

  • Column è un hash formato da name, value e timestamp,  in cui name e value sono array di byte, ogni colonna è salvata in un file separato.
  • SuperColumns: raggruppa al suo interno le columns, le supercolumns non hanno un proprio timestamp.
  • ColumnFamily (SuperColumnFamily): una lista ordinata di columns o supercolumns (array di coppie chiave/valore)  identificata da un nome. La ColumnFamily rappresenta un analogo della tabella nei sistemi relazionli, ogni file (colonna) è ordinato per row (con la propria chiave),  quindi colonne in relazione fra loro dovrebbero stare nella stessa ColumnFamily.
  • Keyspace:  un namespace per ColumnFamilies, tipicamente uno per applicazione, analogo al concetto di schema o database nei sistemi relazionali.
  • Cluster: le macchine (nodi) di una istanza logica di Cassandra, i cluster posso contenere keyspaces multipli.

Un esempio di struttura con rappresentazione JSON  che riporta i concetti di key, column families e column:

{
   "mccv":{
      "Users":{
         "emailAddress":{"name":"emailAddress", "value":"foo@bar.com"},
         "webSite":{"name":"webSite", "value":"http://bar.com"}
      },
      "Stats":{
         "visits":{"name":"visits", "value":"243"}
      }
   },
   "user2":{
      "Users":{
         "emailAddress":{"name":"emailAddress", "value":"user2@bar.com"},
         "twitter":{"name":"twitter", "value":"user2"}
      }
   }
}

Benchè non esista uno schema predefinito per le row, le altre strutture (ColumnFamily, SuperColumnFamily e Keyspace) debbono essere dichiarate nel file di configurazione. L’accesso dati in lettura e scrittura avviene mediante un set di API (basate su Thrift) che consentono le normali operazioni CRUD. Rispetto ai database relazionali con Cassandra è indispensabile proggettare la struttura pensando a quali query debbono essere supportate in modo efficiente ad esempio creando un apposita ColumnFamily per query, il vantaggio è che Cassandra risulta essere più veloce nelle operazioni di scrittura rispetto ad un database relazionale.

Altre soluzione open source NoSQL molto promettenti, ma differenti da Cassandra,  saranno eventualmente trattate in articoli futuri,  alcune tra loro particolarmente interessanti sono CouchDB, MongoDB e HBase (il più simile a Cassandra).

Di seguito alcuni link utili sull’argomento.

VN:F [1.9.3_1094]
Valuta questo articolo
Rating: 0.0/5 (0 votes cast)

No related posts.

Tags: , , ,

Leave a Comment