Not Only SQL

NoSQL Database

NoSQL Database

NoSQL è l’acronimo di “Not only SQL” e viene usato generalmente per indicare quei database che non usano un modello di dati relazionale e quindi potrebbero non usare SQL come linguaggio di interrogazione. Dunque il concetto è di per se’ stesso più antico dei RDBMS, eppure è tornato in auge quando, per varie motivazioni, i database non relazionali hanno mostrato diversi vantaggi, rispetto ai database SQL tradizionali.

Una delle principali motivazioni per l’uso di tali database è rappresentata dalla scalabilità. La scalabilità è un requisito sempre più importante per le applicazioni web, e ciò è dovuto a molti fattori: l’esplosione del numero di utenti della rete (letteralmente esponenziale negli ultimi dieci anni secondo i dati del ISC Domain Survey ), la sempre maggiore diffusione di OpenID, quindi la sinergia tra le varie community e tra esse e i fornitori di servizi, ma anche la crescente disponibilità di dispositivi con accesso ad Internet come smartphone, tablet e altri dispositivi portatili.

La scalabilita’ 

La scalabilita’ orizzontale si ha se l’aumento delle risorse si riferisce all’aumento dei nodi nel sistema, cioè il sistema riesce a parallelizzare il carico di lavoro e gestire il

  • fault tolerance
  • load balancing
  • high availability

Avere piu’ macchine per poter disrtibuire e replicare i dati su piu’ nodi, questo lo rende ideale per ambienti quali

  • ambienti distribuiti
  • affidabilita’
  • elevate prestazioni

il tutto in bundle , senza bisogno di software aggiuntivi.

Scalabilità verticale

La scalabilità verticale si ottiene quando, per aumentare le prestazioni dell’intero sistema, si aumentano le risorse di un singolo nodo del sistema, ad esempio utilizzando una CPU con frequenza maggiore o incrementando la memoria disponibile. Il vantaggio di questo tipo di scalabilità è che generalmente non è necessario modificare le applicazioni, ne’ sono richiesti interventi amministrativi. Lo svantaggio consiste innanzitutto nel costo, perche’ l’aggiornamento spinto di una macchina può essere economicamente molto più gravoso dell’acquisto di una ulteriore macchina di pari potenza.

I principali metodi d’implementazione dei database NoSQL sono i seguenti:

Coloumnfamily: i dati sono organizzati in righe e colonne, ma le righe possono avere quante colonne si vogliono e non c’è bisogno di definire le colonne come prima cosa.

Document store: è l’evoluzione del metodo key/value, rispetto ai normali database relazionali invece che immagazzinare i dati in tabelle con dei campi fissi, questi vengono messi in un documento che può contenere illimitati campi di illimitata lunghezza, così se ad esempio di una persona conosciamo solo nome e cognome, ma magari di un’altra persona anche indirizzo, data di nascita e codice fiscale, si evita che per il primo nominativo ci siano campi inutilizzati che occupano inutilmente spazio.

Graph: i dati vengono immagazzinati sotto forma di strutture a grafi, rendendo più performante l’accesso a questi da applicativi orientati agli oggetti.

Key/Value: in questo caso i dati vengono immagazzinati in un elemento che contiene una chiave assieme ai dati veri e propri, questo metodo è il più semplice da implementare, ma anche il più inefficiente se la maggior parte delle operazioni riguardano soltanto una parte di un elemento.

 

Pro e Contro dei database non relazionali

Vantaggi

  • Dato che un elemento contiene tutte le informazioni necessarie non serve usare i dispendiosi (in termini di performance) JOIN come invece avviene per i database relazionali.
  • La semplicità di questi database è uno degli elementi fondamentali, è proprio questo che permette di scalare in orizzontale in maniera così efficiente, molti NRDBMS, infatti, permettono di aggiungere nodi a caldo in maniera impercettibile dall’utente finale.
  • Scegliendo un database adatto alla mappatura più diretta alle object classes del proprio applicativo si possono ridurre di molto i tempi dedicati allo sviluppo del metodo di scambio dati tra il database e l’applicativo stesso (il cosiddetto object-relational mapping che è invece necessario in presenza di database relazionali).

Svantaggi

  • La semplicità di questi database, però, porta anche alla mancanza dei controlli fondamentali sull’integrità dei dati, il compito ricade quindi totalmente sull’applicativo che dialoga col database che ovviamente dovrebbe essere testato in modo molto approfondito prima di essere messo in produzione. Per fare un esempio, se avessimo un database dei clienti coi relativi ordini effettuati immagazzinati in elementi diversi, anche se è possibile definire una relazione attraverso le chiavi, in un database non relazionale alla cancellazione di un cliente tutti gli ordini resterebbero comunque nel database, è quindi l’applicativo che una volta impartito il comando di cancellazione dell’utente X deve anche andare a cancellare tutti i relativi ordini, cosa che invece in un database relazionale è gestita direttamente dal database stesso.
  • La mancanza di uno standard universale (come può essere l’SQL) è un’altra delle pecche di questi database non relazionali, ogni database ha infatti le proprie API e il suo metodo di storing e di accesso ai dati. Detto questo, risulta palese che se lo sviluppo del database sul quale abbiamo basato il nostro applicativo venisse interrotto, il passaggio ad un altro database non sarebbe sicuramente una cosa immediata, ma richiederebbe alcuni cambi più o meno radicali da apportare all’applicativo, è quindi bene tenere in considerazione la cosa al momento del brainstorming iniziale.

Virtualizzazione oltre confini con KVM

kvm-vitrualization

PREMESSA

Una delle crescenti necessità dei grandi sistemi server Linux, cosi come dei piccoli esperimenti casalinghi, è fornire la possibilità ad amministratori, sistemisti ed utenti smanettoni di godere delle funzionalità di più sistemi operativi. Questo genere di richieste può essere soddisfatto dal supporto alla virtualizzazione, ovvero la possibilità di rendere virtuali le risorse hardware di cui un sistema operativo ha bisogno, per poi installare l’intera piattaforma “virtualmente” su di esse. Per capire quanto ciò sia conveniente, si pensi ai dischi che un sistema virtuale utilizza, che in realtà non sono altro che semplici file, e come essi si prestino meglio alle operazioni di backup, ed anche le periferiche virtuali sono facilmente standardizzabili e, quindi, uniformabili; ciò rende l’hardware (che può essere cosi’ molto vario…), “virtualmente compatibile” con qualsiasi sistema virtualizzato, azzerando i problemi di compatibilità, ed è a questo che serve KVM.

KVM = Kernel-based Virtual Machine
(KVM) è un’infrastruttura di virtualizzazione del kernel Linux. KVM attualmente supporta una completa virtualizzazione usando Intel VT o AMD-V. KVM è implementato come un modulo kernel caricabile, e dotato d’interfaccia grafica, un vero e proprio Virtual Manager Interface , per la gestione completa delle vostre VM. Il progetto nato gia nel 2007, grazie all’opera di Moshe Bar (gia fondatore di Xensource) che fonda l’azienda Qumranet per occuparsi dello sviluppo di questo nuovo modo di fare virtualizzazione. La Qumranet verra’ acuistata circa un anno piu’ tardi direttamente da RedHat che passera’ tutti i suoi progetti di virtualizzazione proprio su KVM.

I vantaggi di KVM
come dicevamo poco fa, per prima cosa KVM è integrato nel kernel di Linux, quindi dal punto di vista di un sysadmin, ci sono molti meno problemi, basta effettuare i normali update della tua distribuzione e sei a posto (per Xen invece sono una vagonata di Patch, non incluse nel kernel).

KVM non richiede alcun kernel modificato lato guest, quindi meno problemi e più libertà per gli utenti. Ed in caso di distribuzioni Linux come guest, anche qui fai i normali update della distro, senza preoccuparci di quale kernel installare (sembra una sciocchezza ma non è così.)

Ciascun guest KVM viene visto a livello di sistema come un normalissimo processo e puo’ essere gestito con i comandi più consueti (top, ps, kill, etc). Xen ad esempio ti obbliga ad usare una vagonata di strumenti e per sapere quanto sta occupando un domU sei costretto ad installare i tools lato client.

KVM è più flessibile in ambienti eterogenei, ad esempio puoi migrare da un nodo 32 bit verso un 64 e viceversa (ovviamente il guest può essere solo a 32 in questo caso, un 64 su un 32 non può andare mentre il 32 può andare sul 64). Puoi migrare da AMD a Intel e viceversa. Xen ti obbliga ad avere un cluster di nodi tutti uguali, o per meglio dire *identici*.

Verificare il supporto alla virtualizzazione

KVM sfrutta il supporto hardware alla virtualizzazione che il processore installato nel PC deve, necessariamente, poter implementare. Molte delle moderne CPU soddisfano questo requisito, considerando che sia AMD che Intel (che insieme raggiungono circa il 98% del mercato dei processori) includono da tempo le tecnologie AMD-V ed Intel VT-x rispettivamente, in grado proprio di supportare la virtualizzazione. Ciò è fondamentale, poiché senza tale supporto hardware, KVM non può funzionare.

Quindi, prima d’installare KVM dobbiamo verificare che l’hardware supporti la virtualizzazione. Per farlo, possiamo digitare, sul terminale, il comando seguente:

Per farlo, possiamo digitare, sul terminale, il comando seguente:

egrep -c ‘(svm|vmx)’ /proc/cpuinfo

Se l’output è diverso da 0, siamo certi che la nostra CPU è compatibile con la virtualizzazione, e possiamo passare al processo di installazione vera e propria. Altrimenti, ahimé, non sarà possibile sfruttare questo potentissimo strumento.

Installare KVM

A questo punto possiamo finalmente installare KVM. La procedura è abbastanza semplice, soprattutto se si utilizzano le maggiori distribuzioni server :

# apt-get install qemu-kvm libvirt-bin bridge-utils virt-manager

Se, invece, non è così, e possiamo avvalerci di yum, utilizzeremo i comandi seguenti:

# yum groupinstall "Virtualisation Tools" "Virtualization Platform"
# yum install python-virtinst

oppure, in alternativa:

# yum install kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools

Terminata l’installazione, c’è ancora un dettaglio da tenere in considerazione. Di norma, le virtual machine di KVM possono essere gestite ed utilizzate soltanto dall’utente root, o da tutti gli utenti appartenenti al gruppo libvirtd. Per questo motivo, se vogliamo utilizzare KVM con il nostro account (diciamo, ad esempio, con l’account pippo), dovremo ultimare l’installazione con il comando seguente:

# adduser pippo libvirtd

Fatto ciò, possiamo verificare che KVM sia stato correttamente installato, riavviando il sistema e verificando che il comando seguente:

$ virsh -c qemu:///system list
@lorenzo:~# virsh -c qemu:///system list
Id    Nome                           Stato
—————————————————-

Se ciò non dovesse accadere, potrebbe non essere stato avviato libvirtd, il demone che gestisce il sistema di virtualizzazione. Possiamo avviarlo con i seguenti comandi:

# chkconfig libvirtd on
# service libvirtd start

A questo punto non resta che configurare in maniera esauriente KVM, ed iniziare a creare ed avviare le macchine virtuali. Se abbiamo a disposizione un ambiente grafico, possiamo affidarci a virt-manager.

virt-manager

Una volta avviato, possiamo subito creare una nuova virtual machine, cliccando sul primo pulsante da sinistra, sulla barra principale della finestra di virt-manager. Qui possiamo:

  • inserire il nome della macchina virtuale
  • scegliere come installare il sistema operativo guest (se utilizzando un’immagine ISO locale, o se effettuare un’installazione via network)
  • selezionare il tipo di sistema operativo che stiamo installando
  • impostare la quantità di memoria RAM da assegnare al sistema, nonché il numero di CPU
  • definire alcune impostazioni avanzate, come l’architettura del sistema, nonché le preferenze di rete

Una nota importante riguarda proprio queste ultime impostazioni relative alla rete. Per default, la virtual machine accede ad internet non come macchina a sé stante, ma tramite un NAT bridge che la rende, dal punto di vista della rete, un tutt’uno col sistema host. E’ possibile modificare questa impostazione tramite le Opzioni avanzate subito prima della fine del processo di creazione della macchina virtuale. Ciò può risultare molto utile se si vuole utilizzare la macchina virtuale come server accessibile all’esterno (una situazione abbastanza tipica). Non resta che giocarci il piu’ possibile ed impratichirsi con tutte le opzioni a disposizione. Buon divertimento.

Cloud Si o Cloud No ?

Opera-browserE se foste voi i gestori del vostro Cloud ?

Una volta i fedeli sudditi Inglesi recitavo un sentito “God save the Queen“, oggi nell’era del cloud computing tutti noi abbiamo i nostri dati conservati su server locati chissà dove nel mondo, le nostre piattaforme di comunicazione sono proprieta’ di aziende mega-multinazionali che ci assicureranno i loro servizi fino a quando ne trarranno profitto, e cosi’ molti di noi hanno sostituito lo status update di Facebook al vecchio diario/agenda, e il nostro account GMail contiene informazioni fondamentali alla nostra vita. Tutto questo spaventa se si pensa che in conclusione, non abbiamo nessun controllo fisico sui nostri dati.

Dare una soluzione alternativa e’ il fulcro del progetto Opera Unite sviluppato dall’omonima azienda Norvegese che nel lontano 1994 creo’ il browser Opera che ad oggi e’ tra i migliori 4 al mondo.  OP (opera unite) non e’ un nuovo browser ma un plugin a Opera browser che trasforma il vostro terminale in un WebServer, ma andiamo nel dettaglio.

Scaricando la versione per PC/Mac/Linux di Opera Unite (questo e’ il link) sarete in grado di usufruire di una piattaforma di condivisione che non si basa più sul cloud computing, ma che rende la vostra macchina un server user friendly. Attraverso Opera Unite infatti sarete in grado di creare chat room, condividere file, musica, foto, avere un Wall sul quale, secondo i permessi da voi impostati, gli altri utenti saranno in grado di lasciare delle note.

La cosa interessante di questo Browser è che non prevede la necessità per gli altri utenti di utilizzare lo stesso software per interagire con i servizi da voi offerti, ma genera delle URL liberamente diffondibili a chiunque disponga di una connessione internet. Inoltre ha un approccio Widget Based, con la possibilità di utilizzare delle API che permetteranno alla community di sviluppare ogni tipo di gadget dovesse mancare dalla casa madre.

 In soldoni, Opera Unite permette le seguenti funzioni :

  • File Sharing:
    «Condivisione sicura di file dal tuo personal computer senza aspettare alcun upload. Scegli la cartella da cui vuoi condividere i file e Opera Unite generera’ un url diretto a tale cartella. Girando il link ai tuoi amici, potrai condividerli senza passare per un servizio di terze parti»;
  • Web Server:
    «Fai girare un intero sito web dal tuo computer locale con Opera Unite Web Server. Dopo aver selezionato la cartella contenente il sito web, potrai condividere facilmente inoltrando ” l’Opera Unite URL “. Opera Unite troverà automaticamente il file index e creerà il sito web per come lo hai sviluppato»;
  • Media Player:
    «Opera Unite permette addirittura l’ascolto da remoto, permettendo così di accedere ai propri file anche al di fuori della portata della macchina ospitante»;
  • Photo Sharing:
    «Condividi le tue foto direttamente dal tuo pc, senza caricarle online. Una volta selezionata la cartella, il servizio creera’ una galleria di thumbnail delle tue foto. Cliccando sulle thumbnail si vedrà la foto nella sua risoluzione originale»;
  • The Lounge:
    «The Lounge è un servizio di chat interno che gira sul tuo computer. I tuoi amici/colleghi potranno accedere alla chat room tramite link diretto, senza che venga richiesta alcuna iscrizione al servizio. A seconda delle tue impostazioni sulla privacy, potrà essere richiesta soltanto una password per il log in nella tua chat room»;
  • Fridge:
    Scrivi una nota sul “frigorifero” (Wall) dei tuoi amici virtuali. Condividendo il link del tuo “frigorifero”, tu e i tuoi amici, famigliari o colleghi potrete scambiarvi appunti in sicurezza e privatamente, in tempo reale».

BitNami: CMS impacchettati per tutti

bitnamiBitnami 

Bitnami è una libreria di applicazioni server popolari e ambienti di sviluppo che possono essere installati con un solo click, sia in un computer portatile, in una macchina virtuale o ospitato nel cloud. Nel pacchetto che sceglierete d’installare, che sia un WebServer od un ambiente CMS,  trovere gia’ compilate e configurate tutte le librerie necessarie a rendere da subito utilizzabile il vostro nuovo ambiente di lavoro / test.

Bitnami LAMP Stack (ossia come allestire un Server Web con un clic)

Introduzione

In questo articolo vedremo come installare in pochi e semplici passaggi un server web (Apache), che si occupa di ricevere ed elaborare le richieste di caricamento delle pagine, e un database (MySQL o PostgreSQL), su cui verranno memorizzate le informazioni associate all’applicazione web; sono disponibili svariati pacchetti che offrono la possibilità di allestire facilmente e con pochi clic un ambiente completo, preconfigurato e perfettamente funzionante.

Le combinazioni di piattaforme più comuni vengono denominate ” xAMP “, ove la prima lettera x indica il sistema operativo utilizzato (L = Linux, M = MacOS e W = Windows i più comuni), la seconda si riferisce al server web (A = Apache), la terza al database (M = MySQL, P = PostgreSQL) e la quarta ai linguaggi usati per scrivere le pagine web (P = Perl/PHP/Python); tra i numerosi pacchetti disponibili, si segnalano per completezza e facilità d’installazione ed utilizzo XAMPP e BitNami xAMP Stack, entrambi disponibili per Linux, MacOS e Windows e con la possibilità di installarne copie multiple ed indipendenti sulla stessa macchina.

La scelta è ricaduta su BitNami LAMP Stack per tre motivi principali:

  • l’installazione non richiede privilegi amministrativi in ambiente Linux;
  • è espandibile mediante moduli (consente ad esempio di installare con un clic Drupal, WordPress, Ruby-Rails…);
  • supporta non solo MySQL ma anche PostgreSQL e ne rende possibile l’installazione contemporanea.

Installazione

Per prima cosa dovremo accedere alle pagine di download del pacchetto per Linux (qui) o Windows (qui): la scelta del database è ricaduta su MySQL semplicemente  in virtù della sua maggiore diffusione, ma raccomando caldamente di provare PostgreSQL (quando affronteremo l’accesso ai database da PHP cercherò di fornire indicazioni e istruzioni per entrambi); in ogni caso le istruzioni di installazione riportate di seguito rimangono sostanzialmente valide anche per il pacchetto denominato LAPP e basato su PostgreSQL.

Raggiungete la tabella riportata nella sezione Native della pagina indicata sopra e individuate la riga corrispondente alla versione desiderata (al momento LAMPStack 5.4.30-0): fate clic sul link in corrispondenza della colonna che riporta la versione del vostro sistema operativo (a 32 o 64 bit).

Terminato il download del file, dovrete controllare dove è stato scaricato ed eseguirlo; in ambiente Linux la procedura richiede invece qualche comando da terminale:

chmod +x Scaricati/bitnami-lampstack-5.4.30-0-linux-x64-installer.bin
./Scaricati/bitnami-lampstack-5.4.30-0-linux-x64-installer.bin

Nel mio caso (Ubuntu 14.04) il file è nella cartella Scaricati e si chiama bitnami-lampstack-5.4.30-0-linux-x64-installer.bin.

Si avvierà una procedura d’installazione guidata che richiede la cartella di destinazione , la password da utilizzare per l’utente amministratore (root su MySQL, postgres su PostgreSQL) del database e la porta logica riservata al server web; per il primo e ultimo parametro potete lasciare il valore predefinito.

Al termine della procedura verrà aperta la pagina principale del server web sul vostro browser predefinito e, nella barra degli indirizzi, potrete vedere una stringa del tipo http://127.0.0.1:8080/
127.0.0.1 rappresenta l’indirizzo del computer locale e 8080 indica la porta indicata in precedenza e su cui è in ascolto il server web. Se esplorate la cartella in cui avete scelto di installare il pacchetto, troverete svariati file e cartelle: le pagine web andranno salvate all’interno della cartella (esempio) /var/www/htdocs/   o in una qualsiasi sottocartella; ad esempio, supponiamo di aver creato una cartella ” prova “ e al suo interno il file pagina.php, per aprire quest’ultimo nel browser dovrò digitare nella barra degli indirizzi:

 

http://127.0.0.1:8080/prova/pagina.php

Trovate un esauriente elenco di tutte le applicazione “stack” che potrete installare grazie ai pacchetti forniti da Bitnami al seguente indirizzo : https://bitnami.com/stacks

Naviga piu’ veloce

dnsVelocizzare la navigazione in Internet con un Proxy DNS

Avvertite l’esigenza di provare una navigazione sempre piu’ veolce ? I DNS del vostro provider fanno i capricci e voi siete stufi di dover navigare a singhiozzo ? Avete due alternative: usare i DNS messi a disposizione dal progetto OpenDNS ( anche se comunque, di “aperto” non ha proprio nulla ) oppure installare sul vostro PC o sul vostro gateway pdnsd.

pdnsd è un proxy DNS che, grazie alla sua cache su disco, consente di memorizzare le coppie indirizzo IP / nome host, evitando di dover effettuare ogni volta la risoluzione DNS e migliorando leggermente la velocità di navigazione. L’installazione risulta agevole su tutte le distribuzioni, essendo limitata alla modifica del file /etc/resolv.conf ed all’editing del file di configurazione di pdnsd: per le distro Ubuntu & Debian il tutto si risolve con un classico : sudo apt-get istall pdnsd 

Prima di modificare qualunque file di sistema il consiglio e’ sempre quello : ” fate una copia di BACKUP “.

  • sudo cp /etc/pdnsd.conf /etc/pdnsd.conf.orig
  • sudo cp /etc/resolv.conf /etc/resolv.conf.orig

 

Editando il file /etc/resolv.conf , questo dovra’ avere come unica voce nameserver il solo valore 127.0.0.1 

Prima di attivare il servizio facciamo un test di risoluzione DNS, che ripeteremo una volta ultimate le modifiche ed attivato il nuovo servizio cosi’ da poter capire se e di quanto sia variata la risoluzione, quindi eseguiamo questo comando :

# dig www.distrowatch.org | grep "Query time"
;; Query time: 322 msec

Attivare il servizio

Modificare il file /etc/default/pdnsd attivando il daemon e disattivando i restanti due parametri:

# do we start pdnsd ?
START_DAEMON=yes
# auto-mode, overrides /etc/pdsnd.conf if set [see /usr/share/pdnsd/]
#AUTO_MODE=
# optional CLI options to pass to pdnsd(8)
#START_OPTIONS=

E’ importante soprattutto commentare AUTO_MODE in quando, come descritto nella riga di commento che lo precede, il file di configurazione “principale” verrebbe altrimenti ignorato.

Configurare PDNSD

Il file di configurazione è /etc/pdnsd.conf. Qui ci si può sbizzarrire con i vari parametri di configurazione. Questa è la mia configurazione:

global {
perm_cache=2048;
cache_dir="/var/cache/pdnsd";
run_as="pdnsd";
server_ip = any;
paranoid=on;
min_ttl=15m;
max_ttl=1w;
timeout=10;
}

server {
label=”OpenDNS”;
ip=208.67.222.222,208.67.220.220;
timeout=30;
interval=30;
uptest=ping;
ping_timeout=30;
purge_cache=off;
}

source {
owner=localhost;
file=”/etc/hosts”;
}

rr {
name=localhost;
reverse=on;
a=127.0.0.1;
owner=localhost;
soa=localhost,root.localhost,42,86400,900,86400,86400;
}

Pronti a partire

Non resta che avviare il daemon:

/etc/init.d/pdnsd start

 

La differenza

La stessa query di cui sopra eseguita in cache:

# dig www.distrowatch.org | grep "Query time"
;; Query time: 2 msec

Inutile dire che i tempi di risoluzione degli hosts sono più che rapidi, e la navigazione su internet è decisamente più veloce.