18 ottobre 2008

Backup "istantaneo" con Oracle e ZFS

Continuiamo la miniserie di post su ZFS, l'ottimo filesystem di Solaris e OpenSolaris.

La proprietà di poter fare lo snapshot di un filesystem consente di utilizzare il backup a caldo del database via ALTER DATABASE BEGIN BACKUP con Oracle 10g.
In Oracle 10g, infatti, è possibile mettere tutto il db in backup mode con un solo comando, invece di farlo singolarmente per ogni tablespace.

Ecco il log di un backup effettuato a caldo con uno snapshot su una macchina Solaris 10:
Connected to:
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

SQL> set timing on
SQL> alter database begin backup;

Database altered.

Elapsed: 00:00:00.62

SQL> host sudo zfs destroy u01/oradata@`date +%A`
cannot open 'u01/oradata@Thursday': dataset does not exist

SQL> host sudo zfs snapshot u01/oradata@`date +%A`

SQL> alter database end backup;

Database altered.

Elapsed: 00:00:00.44
SQL>

Il tutto è durato pochi secondi, e comunque la durata dello snapshot è quasi indipendente dalle dimensioni del database.
Lo snapshot è ora pronto su disco da copiare su un altro server. Questo è il passo che richiederà più tempo, ma il backup è praticamente già fatto.

$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
u01 17.2G 49.7G 80.6M /u01
u01/oradata 17.1G 49.7G 17.1G /u01/oradata
u01/oradata@Thursday 526K - 17.1G -
u02 16.9G 79.6G 14.3G /u02
u02/oradata 2.59G 79.6G 2.59G /u02/oradata

Per il trasferimento dello snapshot su nastro o su altri dischi o server si possono usare i comandi tradizionali, oppure "rigenerare" lo snapshot direttamente su un altro filesystem ZFS di un altro server via ssh con zfs send.
Ma vi lascio scoprire questa magica e gustosa feature da soli per esercizio :-)

Come è possibile tutto ciò?
Come si può vedere lo snapshot, dopo qualche secondo dalla creazione, occupa circa 500 KB, e le sue dimensioni continuano a crescere.
ZFS alloca lo spazio su disco in "record" (analoghi ai blocchi dei filesystem tradizionali), grandi di default 128 KB.
In pratica ZFS fa in modo di tenere validi su disco i record appartenenti al filesystem al momento dello snapshot, occupando nuovo spazio per i blocchi che vengono modificati o aggiunti al filesystem originario. Il nuovo spazio allocato, man mano che passa il tempo, compare nella lista come occupazione dello snapshot. Ricorda il funzionamento degli snapshot LVM. Geniale.

08 ottobre 2008

RAC su macchine virtuali: ma ha senso?

Leggo volentieri da Techblast che Oracle ha certificato RAC su macchine virtuali Oracle VM.

Avere un cluster su macchine virtuali va un po' contro l'idea di alta affidabilità insita nel concetto di cluster.

La parte interessante nel documento Oracle è ovviamente l'architettura. E le chicche non mancano.

In sintesi l'architettura è spiegata dall'immagine seguente:
È evidente come la virtualizzazione venga utilizzata per ospitare più nodi virtuali (di cluster diversi) su un solo server fisico, ma il meccanismo di alta affidabilità viene conservato poichè ogni nodo di uno stesso database cluster risiede su un server fisico diverso.

Lo storage condiviso di RAC viene gestito in domain0:
Il multipathing viene utilizzato solamente sul percorso fisico dei dati da e verso i dischi, non su quello virtuale da domain0 ai domini virtuali.

Analogamente, le interfacce di rete sono in bond solo sulle porte fisiche, mentre i bridge virtuali di xenbr0 e xenbr1, sempre in domain0, sono rispettivamente la rete pubblica e la rete privata del RAC.
Essendo le istanze del RAC su nodi fisici differenti, anche per la comunicazione su rete privata si passa da rete fisica; ciò non è necessario invece nel caso di nodi sullo stesso server, che comunicherebbero direttamente attraverso il bridge 1; ma questa non è assolutamente una configurazione ragionevole per un ambiente HA.

Date le premesse del documento Oracle, sotto quest'ottica la soluzione RAC su macchine virtuali diventa tutt'altro che insensata in vari ambienti, soprattutto per consolidare server e sfruttare al massimo la potenza di elaborazione dei server attuali, facendo economia di scala.