NOSQL..addio RDBMS!

horus's picture

Nosql e` una nuova sigla che sta ad indicare l`uso di datastore non relazionali, i paper accademici li definiscono "Structured Storage'..

Per tutti questi anni i DB relazionali hanno costituito lo standard sia per le grosse aziende che per i privati, insomma uno standard a tutti i livelli.Lavorare con i DBMS relazionali consente di estrarre i dati in maniera selettiva attraverso un linguaggio dichiarativo e strutturato l`SQL.

Da qualche tempo invece si sono affacciate nuove soluzioni e alternative per la gestione di grosse, anzi enormi quantita` di dati.Il termine NOSQL risale al 1998 per definire un nuovo approccio alla gestione di enormi quantita` di dati e per definire una struttura performante e rigida(quindi facilmente riproducibile).

Facciamo qualche esempio:

Ebay ha necessita di archiviare circa 2 Petabyte di dati (1 Petabyte=1000 Terabyte), la 'Inbox Search di Facebook' fa ricerche su circa 50 Terabyte di dati.I RDBMS classici vanno in difficolta di fronte a simili quantita` di dati e percio` il mercato che e` dominato da grandi Big come Ebay, Facebook,Google, abbia adottato un nuovo standard per la gestione dei propri Sistemi Informativi.
I Database NoSQL sono server-fault-tolerant e` possibile scrivere o leggere anche se i nodi sono down e la velocita` delle read e write e` centinaia se non migliaia di volte piu` veloce dei DB classici in quanto la scrittura viene loggata ed effettuata in RAM (A.M.A.T. *100) solo successivamenti i dati vengono trasferiti sul disco.
La struttura dei dati come array associativi permette una ricerca con complessita temporale lineare O(1)

I DB NoSQL piu` diffusi:

APACHE CouchDB e` un DB server-fault-tolerant schema-free che utilizza API RESTfull basate su HTTP e JSON,tra le caratteristiche:indicizzazione dei dati senza schema fisso, e l`uso di Javascript come linguaggio di interrogazione, CouchDB e` scritto in ERLANG(il linguaggio che9 usa l`AT&T per la gestione dei flussi telefonici,ottimizzato per la programmazione concorrente). Per CouchDB esistono librerie per i linguaggi piu` diffusi.

APACHE CASSANDRA: Inizialmente adottato da Facebook per la sua 'Inbox Search' e` stato rilasciato come progetto OPEN SOURCE su Google Code nel 2008. CASSANDRA al momento e` utilizzato da Digg,Facebook,Google,Ebay,REDDIT,Twitter,

L`INSTALLAZIONE SU LINUX( UBUNTU 9.04) :

Useremo come server una installazione di Ubuntu 9.04 interagendo con PHP e una libreria( Simple Cassie).

1) Per prima cosa modifichiamo il file /etc/apt/sources.list con queste righe:


deb http://www.apache.org/dist/cassandra/debian unstable main
deb-src http://www.apache.org/dist/cassandra/debian unstable main

Salvate e lanciate sudo apt-get update.Noterete gli errori dovuti allamancanza delle chiavi GPG
rimediamo subito lanciando questi comandi:

gpg --keyserver wwwkeys.eu.pgp.net --recv-keys F758CE318D77295D
gpg --export --armor F758CE318D77295D | sudo apt-key add -

adesso fate dinuovo un sudo apt-get update e infine potrete effettuare un sudo apt-get install cassandra.
CASSANDRA e` ora installato. i File di conf li troverete in /etc/cassandra
le opzioni di startup le potrete configurare in /etc/default/cassandra, il file di configurazione /etc/cassandra/storage-conf.xml contiene la maggior parte dei parametri di configuarazione di CASSANDRA.

IL DATA MODEL:

dimenticate tutti i modelli dei classici database relazionali cioe` i concetti di tabella,relazione,attributi,

Nei DB NoSQL e quindi in CASSANDRA abbiamo le column si tratta di una tupla contenente un nome,un valore e un timestamp.


{
name:"emailAddress",
value:"orhos@sannioglug.org",
timestamp: 1234567890

}

Fino adesso e` semplice...

adesso scopriamo la supercolumn:


{
name:"Indirizzo",
value: {
strada: { name:"strada", value:"Via KILL BILL, 123", timestamp:1234567890},
citta`: {name:"citta`", value:"Benevento", timestamp:1234567890},
cap: {name:"cap", value:"80808", timestamp:1234567890},
}
}

come potete notare la supercolumn non ha un suo timestamp ed e` composta da piu` valori column,Passiamo ora ad un`altra struttura superiore, la columnfamily.
Si tratta di un contenitore di columns e supercolumns ,possono essere di tipo standard se contengono columns e di tipo super se contengono supercolumns.
Le strutture delle columnfamily le troviamo in /etc/cassandra/storage-conf.xml.
L`ultima struttura che analizzeremo e` il KeySpace , tutte le columnfamily della vostra applicazione finiscono nel Keyspace (una sorta di namespace) che ha il nome della vostra applicazione. Un keyspace deve essere dichiarato nel file storage-conf.xml all`interno del tag KeySpace:

<Keyspace Name="Applicazione">

<ColumnFamily CompareWith="BytesType" Name="NameColFamily1">
<ColumnFamily CompareWith="BytesType" Name="NameColFamily2">

</Keyspace>

L`attributo CompareWith indica il tipo di ordinamento visto che i Byte in questo DataModel non vengono ordinate tramite query ma si trovano gia` ordinati portando ad un incremento delle prestazioni.

Usare CASSANDRA:

Apriamo una shell e digitiamo sudo cassandra -f,
a questo punto il server si mettera` in ascolto sulla porta 9160
adesso per interrogarlo (nel nostro caso spiegheremo come fare in php anche se esistono classi wrapper per molti linguaggi) scarichiamo la libreria SimpleCassie http://code.google.com/p/simpletools-php/wiki/SimpleCassie e includiamola nel nostro script:

<?php

require_once("SimpleCassie.php");

$cassie=new SimpleCassie("127.0.0.1",9160);

if (!$cassie->isConnected()))

"Impossibile connettersi";
else
"Connessione OK";
?>

creiamo adesso il nostro db vero e proprio..:

creiamo per prima il nostro KeySpace
creeremo una anagrafica studenti.
apriamo /etc/cassandra/system-conf.xml

<Keyspace Name="Studenti">

<ColumnFamily CompareWith="UTF8Type" Name="Studenti"/>
<ColumnFamily CompareWith="UTF8Type" Name="Indirizzo"/>

<ReplicaPlacementStrategy>

org.apache.cassandra.locator.RackUnawareStrategy</ReplicaPlacementStrategy>

<ReplicationFactor>1</ReplicationFactor>

<EndPointSnitch>org.apache.cassandra.locator.EndPointSnitch</EndPointSnitch>

</Keyspace>

i tag <ReplicaPlacementStrategy>e <ReplicationFactor> dicono a cassandra come replicare i dati tra diversi ed eventuali datacenter, nel nostro caso abbiamo solo 1 server quindi ReplicationFactor=1.

vediamo come inserire i dati all`interno del nostro nuovo DB NoSQL:

<?php

require_once("SimpleCassie.php");

$cassie=new SimpleCassie("127.0.0.1",9160);

if (!$cassie->isConnected())
echo "Impossibile connettersi";
else {

$keyspaces= array(

`Anagrafica`=>array(
//Studenti ColumnFamily
`Studenti`=>array(
"Studente1"=>array(
"nome"=>"Antonio",
"cognome"=>"Stallman"),

"Studente2"=>array(
"nome"=>"Luca",
"cognome"=>"Gates",
"admin"="true")
)))

?>

//Inserisco nel DB i dati degli Studenti

foreach($keyspaces as $Keyspace=>$cfs)
foreach($cfs as $cf => $Keys)
foreach($Keys as $Key=>$columns)
foreach ($columns as $name=>$value)
$cassie->Keyspace($Keyspace)->cf($cf)->key($Key)->column($name)->set($value);
}
?>

Operazioni sul DB:

Su ogni DB noi possiamo effetuare le operazioni classiche di delete,update,create,read
Abbiamo appena creato 2 record nella nostra Anagrafica vediamo ora come recuperare questi dati:
dobbiamo passare per il Keyspace,la ColumnFamily e alla column richiesta.


$count=$cassie=>Keyspace(`Anagrafica`)->cf(`Utenti`)->Key(`Studente 1)->count();
var_dump($cassie->key(`Studente 1`)->slice($count,false));

Il contenuro della column sara` un`array associativo
usare i dati diventa facilissimocon le funzioni get(),set(),delete().

E` possibile lavorare con Cassandra anche con altri linguaggi, ci sono tantissime librerie, segnalo
http://github.com/mjpearson/Pandra , e` un` altra libreria che e` possibile usare con php, a differenza dell`approccio degli array associativi usato da SimpleCassie, utilizza un approccio OO per le column e columnFamily

sito di riferimento: http://wiki.apache.org/cassandra/ClientOptions

Comments

Post new comment

The content of this field is kept private and will not be shown publicly.