giu 112011
 

Bene, acquistare un servizio PaaS “non LAMP” non vi convince e volete realizzarvi il vostro sistema per ospitare il nuovo Twitter. Intanto in bocca al lupo! Vediamo quali sono gli elementi di una piattaforma destinata ad ospitare servizi “di un certo livello”, in modo che possiate ragionare su quali scelte dovrete affrontare.

1) Infrastruttura IaaS
Il livello più basso è quello relativo al servizio IaaS, cioè l’hardware virtuale che ospiterà la nostra piattaforma sulla quale creeremo l’applicazione. E’ possibile scegliere di utilizzare un fornitore come RackSpace, Amazon, ecc. oppure crearsi il proprio cloud privato/ibrido con sistemi come OpenNebula, OpenStack o Eucalyptus. Riguardo la scalabilità, dal punto di vista hardware tutti i fornitori di servizi IaaS hanno infrastrutture hardware in grado di scalare all’occorrenza, mentre nel caso di cloud privati dobbiamo anche preoccuparci di avere una base hardware adeguata e di monitorarne l’utilizzo per aggiungere nuovo hardware all’occorrenza.
Riguardo a come scalerà il nostro sistema, come dicevo nel precedente articolo, innanzi tutto dobbiamo programmare un sistema che prevede la possibilità di essere scalabile: avere una infrastruttura che ci permette di “accendere una nuova macchina” all’occorrenza, ma che poi rimane ferma perchè noi non abbiamo previsto tecnicamente la sua accensione, serve a poco.
Fatta questa ovvia precisazione, tutti i fornitori di servizi cloud IaaS prevedono la possibilità di interfacciarsi attraverso delle REST API in modo da poter accendere e spegnere le macchine virtuali all’occorrenza. Quindi scegliamo attentamente il sistema di cloud che ci permetterà, in caso, i minori problemi in caso di future migrazioni: le API più diffuse sono quelle di Amazon, ma stanno prendendo piede velocemente le API OCCI.
Se non ci si vuole affidare alla programmazione usando le API, è possibile usare sistemi meno sofisticati per raggiungere il medesimo obiettivo: affidarsi ad un sistema di monitoraggio esterno come Nagios per programmare l’accensione e lo spegnimento di istanze a VM al raggiungimento di determinati livelli di utilizzo.

2) Sistema Operativo
Ovvio, no? Si parte dal basso e in una infrastruttura IaaS bisogna scegliere anche questo elemento :-)
E’ inutile spendere troppe parole su questo: resta bene inteso che è necessario scegliere Microsoft Windows Server nel caso in cui si voglia programmare in .net ;-)
Se invece pensate di utilizzare altri linguaggi, utilizzate la distribuzione Linux che preferite.

3) Linguaggio di programmazione
Python, Rails o Java/Scala, quello che preferite, sono tutti adatti; se volete seguire il trend del momento scegliete Rails.

4) Framework e componenti aggiuntivi
Dipende dal linguaggio, ovviamente: Ruby nel caso di Rails, Django nel caso di Python, Lift in caso di Java/Scala. Se avete scelto Ruby on Rails, ricordatevi di installare su tutti i server che eseguiranno l’applicazione le gemme necessarie.
E’ importante prevedere un sistema di code per eseguire le operazioni più lunghe in background; se utilizzate Ruby on Rails, ci sono delle gemme già pronte allo scopo: resque, BackgroundJob e delayed_job. Se volete un gestore di code non legato a ruby valutate RabbitMQ; se volete un servizio esterno “bello e pronto” e avete deciso di essere ospitati su Amazon, potete utilizzare SQS.

Infine, se avete scelto di ospitare la vostra App su un cloud privato OpenNebula e avete scelto di programmare con Ruby on Rails, non fatevi sfuggire la gemma per utilizzare le OCCI API per comandare il cloud OpenNebula!

5) Frontend Web
Si tratta del “web server” che risponderà alle richieste e le rigirerà ai server ospitanti l’applicazioni in load balancing: nginx è la soluzione più utilizzata, anche se in passato ho avuto ottime esperienze con HAProxy. Infine potete valutare Rack o Mongrel nel caso in cui abbiate scelto Rails.
Se scegliete di usare nginx, una buona idea è di far servire i contenuti statici (ad es. immagini, file .js, file .css ecc) direttamente dal frontend web e di rigirare ai server con l’applicativo solo le richieste dirette verso i contenuti dinamici. In passato ho scritto un articolo su come proxare le richieste di file PHP con nginx, l’articolo può servire come base epr il setup di questo componente.

6) Proxy e database per i dati
In una applicazione “on-the-cloud” è vietatissimo salvare i dati sul disco locale: questi devono obbligatoriamente risedere all’interno di un database. Se così non fosse, si avrebbe un “disallineamento” tra i server che fanno girare l’applicazione, mentre avendo i dati salvati all’interno di un database gli stessi sono condivisi tra tutte le istanze delle VM che faranno girare l’applicazione e pronti per essere disponibili anche alle eventuali VM spente.
Pertanto risulta evidente che i servizi di “disco virtuale” dei servizi IaaS, non servono per contenere i dati, ma per contenere l’applicazione. Unico elemento “borderline” potrebbe essere un servizio di storage a blob come Amazon S3 o OpenStack Swift per memorizzare elementi statici come immagini, file js, ecc.
Inutile dire che i database relazionali più comuni sono PostgreSQL e MySQL e che probabilmente saranno sufficienti alla Vostra applicazione in quanto comunque possono entrambi scalare in lettura, bilanciando quindi il carico di lavoro delle query. Se però abbiamo necessità di scalare in maniera molto più elastica, stanno emergendo nuove basi dati come MongoDB o NoSQL.
Ultima possibilità, Amazon mette a disposizione il servizio Simple DB ed RDS.
Ovviamente l’utilizzo intensivo di un database è estremamente dispendioso per cui è praticamente obbligatorio installare un sistema di cache locale: il sistema più utilizzato è senza dubbio memcached.

Ora che abbiamo descritto cosa vi serve per programmare… happy coding!

apr 172011
 

Il tema del cloud è molto sentito in questo momento e sono numerosi i pacchetti linux in grado di crearlo.
Per linux esistono almeno quattro differenti metodi per realizzarlo, analizziamoli per capirne meglio le differenze.

Eucalyptus
É il sistema di cloud piú conosciuto ed é usato da Ubuntu Enterprise Cloud e RedHat. La sua filosofia è quella di produrre una emulazione opensource di Amazon EC2. Nella sua implementazione, un host è dedicato a controllare il cluster e il cloud e su ogni nodo è necessario installare del software specifico perchè comunichino con il Cluster/Cloud Controller.

Punti di forza:

  • La miglior emulazione delle API di Amazon EC2, S3 ed EBS
  • Software già pachettizzato in RPMS, installazione facilitata in caso di piccoli setup
  • Amministrazione del cloud facilitata attraverso il plugin HybridFox per Firefox

Punti deboli:

  • Protocollo teoricamente scalabile, ma non nella pratica per come è stato implementato
  • La maggior parte del traffico e dell’I7O del disco passa per il Cloud Controller che quindi diventa un Single Point of Failure
  • Quando si riavvia il Cloud Controller, tutte le istanze vengono perdute
  • Non è flessibile sul tipo di VM che si possono creare
  • Per scalare è necessario aquistare la licenza
  • Per salvare lo stato di una VM è necessario agire manualmente
  • Nessuna possibilità di eseguire azioni schedulate

Nimbus
Nimbus è un sistema di cloud che deriva dal progetto “Globus Virtual Workspace” che pertanto include l’interfaccia WSRF per la gestione dei certificati di autenticazione. Nimbus si definisce un “Science Cloud” cioè un sistema di cloud destinato principalmente a scienziati e laboratori.

Punti di forza:

  • Gestione dei certificati di autenticazione
  • Gestione degli utenti e delle quote
  • Gestione delle VM reservation
  • Possibilità di gestire le VM attraverso processi schedulati con assegnazione di priorità per l’avvio
  • Comunità di sviluppo molto aperta a collaborazioni

Punti deboli:

  • Documentazione incompleta e spesso errata
  • E’ necessario aprire molti permessi al socket libvirt e sul file /etc/sudoers perchè funzioni

OpenNebula
Abbiamo già parlato diffusamente di OpenNebula su questo blog e, a mio avviso, è il miglior compromesso tra i sistemi di Cloud presi in esame. OpenNebula fa parte del progetto europeo “Resevoir” che è iniziato come un sistema di gestione dell’infrastruttura e successivamente ha implementato le API.

Punti di forza:

  • Miglior flessibilità nella creazione di VM
  • Comunità di sviluppo ampia e grande quantità di installazioni
  • Elevate performance e scalabilità, testate sul sistema di Cloud del CERN
  • Buon sistema di schedulazione
  • Installazione davvero semplice
  • Cloud con il minor numero di Single Point of Failure
  • Estremamente robusto, riesce a recuperare lo stato dopo un riavvio

Punti deboli:

  • Di defaut è abbastanza aperto
  • Compatibilità con le ReST API di Amazon limitata, SOAP API non ancora implementate (ma previste)

OpenStack

Anche Openstack è stato trattato diffusamente in questo blog: si tratta di un sistema molto promettente, tanto è vero che la stessa Ubuntu pensa di migrare da Eucalyptus ad Openstack nelle prossime release della sua distribuione. Il progetto è nato dalla fusione del sistema di cloud di RackSpace con il progetto Nebula di NASA

Punti di forza:

  • Numerose aziende di livello importante collaborano attivamente allo sviluppo del progetto: NASA e RackSpace sono i “fondatori”, a cui se ne sono aggiunti molti altri quali Cisco e Dell.
  • Sistema estremamente scalabile, povero di Single Point of Failure
  • Ampissima compatibilità con gli HyperVisor (KVM, Xenserver, VMWare, HyperV, OpenVZ e molti altri)

Punti deboli

  • Progetto ancora poco maturo, con poche installazioni funzionanti
  • Documentazione poco efficace in quanto il codice è in continuo mutamento
  • Richiede una gran quantità di hardware differenziando i sistemi per lo storage delle immagini (S3) e i sistemi per i dispositivi a blocchi (EBS)

 

apr 012011
 

Dopo l’articolo dedicato ad Openstack Swift, sistema per creare storage ridondati e distribuiti geograficamente, analizzamo un nascente protocollo concettualemte simile ma molto più innovativo, il SoS.

SoS è l’acronimo di Storage over Smartphone e si tratta di un protocollo nato dalla collaborazione dell’americana AT&T e la svedese Nokia con Microsoft, in grado di realizzare uno storage ridondato distribuito sugli smartphone.

L’idea è quella di utilizzare lo spazio per lo più inutilizzato delle schede SD degli smartphone di ultima generazione collegati in maniera ormai costante alla rete internet per realizzare uno storage distribuito. Per spiegarlo in maniera semplice, ogni smartphone “cede” una partizione di 1 GB sulla propria SD card alle funzionalità SoS; ogni dato memorizzato all’interno del servizio SoS viene replicato almeno su tre partizioni (e quindi su almeno tre apparecchi smartphone) per garantirne l’alta affidabilità anche in caso di spegnimento o mancata raggiungibilità del telefono.

Un server centrale si occupa di gestire lo storage e quindi di distribuire automaticamente il dato in scrittura all’interno del maggior numero di smartphone possibile e di “proxare” le richieste in lettura in modo da rendere il sistema più veloce: difatti questo server viene aggiornato costantemente anche sulla posizione geografica dei vari nodi, ed è quindi in grado di capire se l’apparecchio che richiede il dato può comunicare direttamente con un apparecchio in cui il dato è presente, anche con connessioni bluetooth o wifi locale e senza passare quindi attraverso la rete telefonica dell’operatire: lo scopo è quello di rendere lo stesso dato disponibile sul maggior numero di apparecchi possibile (tendenza all’infinito) in modo da sfruttare la parallelizzazione dei download per quando il dato deve essere letto.

Sicuramente l’idea che sta alla base è geniale, in quanto si tratta di un sistema di storage distribuito simile concettualmente ai vecchi sistemi di peer-to-peer e quindi virtualmente infinito e ridondato. I dubbi riguardano essenzialmente la capacità di banda consumata dal protocollo in relazione a quella a disposizione degli SmartPhone che potrebbe far “sedere” le reti degli operatori mobili, facendo apparire sul display degli smartphone un messaggio simile a questo:

mar 242011
 

In questo articolo installeremo OpenStack Glance, il componente di OpenStack in grado di interfacciarsi con il pool di server Nova per fornire loro le immagini delle macchine virtuali.

Glance può utilizzare diversi datastore per registrare le immagini delle macchine virtuali, tra cui OpenStack Swift; in questo articolo, però, per semplicità, utilizzeremo semplicemente l’hard disk locale. In successivi articoli spiegheremo come far collaborare al meglio assieme i componenti di OpenStack.

Per l’installazione, e consigliabile utilizzare come distribuzione Ubuntu Linux Server 10.10. E’ possibile utilizzare un server separato e ridondarlo, assumiamo però di utilizzare lo stesso cloud controller dell’esempio precedente (172.16.0.1). E’ semper importante eseguire i comandi come utente root

Download ed installazione di Glance

Iniziamo con aggiungere la repository apt ed installare il pacchetto

add-apt-repository ppa:glance-core/trunk
apt-get update
apt-get install glance

Quindi creiamo la directory con il file di configurazione:

cd /etc
mkdir glance
cd glance

Configurazione dei servizi

Creiamo quindi il file glance.conf con la configurazione:

/etc/glance/glance.conf
[DEFAULT]
# Show more verbose log output (sets INFO log level output)
verbose = True

# Show debugging output in logs (sets DEBUG log level output)
debug = False

[app:glance-api]
paste.app_factory = glance.server:app_factory

# Directory that the Filesystem backend store
# writes image data to
filesystem_store_datadir=/var/lib/glance/images/

# Which backend store should Glance use by default is not specified
# in a request to add a new image to Glance? Default: 'file'
# Available choices are 'file', 'swift', and 's3'
default_store = file

# Address to bind the API server
bind_host = 0.0.0.0

# Port the bind the API server to
bind_port = 9292

# Address to find the registry server
registry_host = 0.0.0.0

# Port the registry server is listening on
registry_port = 9191

[app:glance-registry]
paste.app_factory = glance.registry.server:app_factory

# Address to bind the registry server
bind_host = 0.0.0.0

# Port the bind the registry server to
bind_port = 9191
# SQLAlchemy connection string for the reference implementation
# registry server. Any valid SQLAlchemy connection string is fine.
# See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine
sql_connection = sqlite:///glance.sqlite

# Period in seconds after which SQLAlchemy should reestablish its connection
# to the database.
#
# MySQL uses a default `wait_timeout` of 8 hours, after which it will drop
# idle connections. This can result in 'MySQL Gone Away' exceptions. If you
# notice this, you can lower this value to ensure that SQLAlchemy reconnects
# before MySQL can drop the connection.
sql_idle_timeout = 3600

Ora aggiungiamo ad /etc/rc.local il seguente comando per avviare glance automaticamente:

/usr/bin/glance-control all start

Altra modifica da effettuare riguarda il file /etc/nova/nova.conf: bisogna levare i riferimenti a nova-objectsore che non sarà più utilizzato e aggiungere quelli relativi a glance:

/etc/nova/nova.conf

Levare:
--s3_host=172.16.0.1

Aggiungere:
--glance_host=172.16.0.1
--glance_port=9292
--image_service=nova.image.glance.GlanceImageService

Per non sprecare risorse inutili, consiglio di levare il servizio glance-objectstore dall’avvio automatico. A questo punto abbiamo finito con le configurazioni e possiamo procedere a riavviare il nostro server.

Utilizzo di Glance

Per utilizzare il servizio glance, è necessario pubblicare le immagini sul server con il comando glance-upload:

wget http://smoser.brickies.net/ubuntu/ttylinux-uec/ttylinux-uec-amd64-12.1_2.6.35-22_1.tar.gz
tar zxvf ttylinux-uec-amd64-12.1_2.6.35-22_1.tar.gz
glance-upload --disk-format=ari --container-format=ari --type=ramdisk ttylinux-uec-amd64-12.1_2.6.35-22_1-initrd ramdisk
glance-upload --disk-format=aki --container-format=aki --type=kernel ttylinux-uec-amd64-12.1_2.6.35-22_1-vmlinuz kernel
glance-upload --disk-format=ami --container-format=ami --type=machine --ramdisk=1 --kernel=2 ttylinux-uec-amd64-12.1_2.6.35-22_1.img

Per controllare le istanze, d’ora in poi utilizzaremo direttamente il comando nova. Ad esempio:

nova flavor-list
nova image-list
nova boot pippo --flavor 2 --image 3

It’s all folks, but stay tuned!

mar 222011
 

In questo secondo HowTo eseguiremo una installazione di un nodo computazionale di OpenStack Nova utilizzando Ubuntu Server 10.10 nella versione a 64 bit e un comodo script di autoinstallzione.
Questo HowTo è liberamente tratto da questo articolo.

Per eseguire questo HowTo ammetteremo di aver già installato il cloud controller seguendo le istruzioni del precedente articolo.

Come nel caso precedente, per eseguire i comandi citati in questo articolo, è necessario essere “root”; visto che Ubuntu non consente l’accesso all’utente root, dopo il login utente è necessario lanciare

sudo su -

Innanzi tutto è necessario installare Ubuntu Server base (senza alcun modulo aggiuntivo) sul server, scegliendo la lingua inglese per una questione di compatibilità con lo script di installazione.
Al termine dell’installazione, aggiorniamo il sistema ed installiamo alcuni pacchetti utili per la gestione del server:

apt-get update
apt-get upgrade
apt-get install ssh ntp mc vlan

Utilizzaremo due interfaccie di rete: una “pubblica” attraverso la quale sarà possibile interfacciarsi con le macchine virtuali (eth0 con IP statico 172.16.0.2) e una seconda attraverso la quale il server comunicherà con Internet in dhcp.

/etc/network/interfaces
auto eth0
iface eth0 inet static
    address 172.16.0.2
    netmask 255.255.255.0
auto eth1
iface eth1 inet dhcp

A questo punto riavviamo il server:

reboot

Una volta completato il riavvio procediamo al download dello script di installazione e lanciamolo:

wget --no-check-certificate http://www.hybridclouds.co.uk/OSinstall.sh
bash ./OSinstall.sh -A $(whoami) -T compute -C 172.16.0.1

Come nel precedente esempio aggiungiamo il parametro -N nel caso in cui la rete interna “10.0.0.0″ contenga la vostra reale rete.
Al termine dell’operazione di installazione non c’è null’altro da configurare e il nodo è già operativo. Per verificare l’effettiva funzionalità, sul Cloud Controller eseguire i comandi:

mysql -uroot -pnova nova -e 'select * from services;'
nova-manage service list

Dovreste vedere il vostro nuovo host aggiunto come “compute node”. Nel caso in cui non abbiate un dns che risolva il nome host del compute node, aggiugetelo nel file hosts:

/etc/hosts
172.16.0.1 nova01

Infine sul nuovo compute node andiamo ad allineare il database delle VM con:

nova-manage db sync

L’installazione del sistema è ultimata. Nel caso in cui vogliate aggiungere nuovi nodi al cloud è sufficiente ripetere i passi qui descritti sul nuovo server.

In qualsiasi caso, bisogna sottolineare che in questa installazioni le immagini delle macchine virtuali sono su una directory locale sul cloud controller (/var/lib/nova/images), pertanto non possono essere eseguite su un secondo compute node se non condividendo la directory tramite NFS. Vedremo in un prossimo articolo come utilizzare OpenStack Swift e OpenStack Glance per creare un datastore condiviso per le immagini delle VM.