just my technical opinion

martedì 13 aprile 2010

Streaming di database

Mi trovo nella condizione di dover trasferire un database Oracle tra due sedi remote abbastanza distanti. Due sono le opzioni possibili:
  • La prima opzione prevede di esportare il DB, trasferirlo su cassetta, trasportare fisicamente la cassetta nella nuova sede, recuperare il database da cassetta e procedere con l'importazione. Data la dimensione del database, e il trasferimento fisico della cassetta, questa modalità richiederebbe non meno di due giorni.
  • La seconda opzione prevede di lavorare con uno stream di dati, effettuando tutte le varie fasi contemporaneamente. In particolare un sistema (dba) provvederà ad effettuare l'export dei dati e passarlo via NetCat ad un secondo sistema (sys) che provvederà a comprimerlo il più possibile, trasferendolo via rete geografica ad un terzo sistema (dbb) che provvederà a decomprimerlo e ad importarlo.
Sono diversi i componenti in gioco che ci permetteranno di portare il database da una parte all'altra; vediamoli:
  • exp: utility di Oracle che ci permette di esportare un database su un file;
  • imp: utility di Oracle che ci permette di importare un database da un file;
  • mknod: utility di Linux che ci permette di portare un file in stdin/stdout;
  • nc: (NetCat) utility che ci permette di trasferire dati via rete e stdin/stdout.
Vediamo come mettere assieme i vari pezzi (in ordine):
  • sul sistema finale (dbb) riceveremo i dati via rete e li redirigeremo su un file speciale di pipe dal quale imp importerà il database:

    mknod /tmp/pipe p
    imp ... file=/tmp/pipe
    nc -l -p 5000 | gunzip -c -9 | tee /tmp/dump.db > /tmp/pipe
  • sul sistema di transito (sys) riceveremo i dati dal database server e li comprimeremo; questo sistema di transito è utile per alleviare il database primario dall'onere computazione dovuto alla compressione, velocizzando così tutto il processo:

    nc -l -p 4000 | gzip -c | nc dbb.example.com 5000
  • sul sistema sorgente (dba) esporteremo il database su un file speciale di pipe che sarà letto e spedito via rete per la compressione:

    mknod /tmp/pipe p
    cat /tmp/pipe | nc sys.example.com 4000
    exp ... file=/tmp/pipe
Eventualmente possiamo usare il comando tee per mantenere un dump del database locale, in modo da monitorare lo stato del trasferimento; teniamo presente che questo può comportare un esaurimento del buffer relativo al pipe successivo rendendo impossibile il trasferimento.

Al termine del dump netcat non esce automaticamente, ma rimane in attesa di dati ulteriori, infatti è possibile notare che la dimensione dei due file dump.db dei sistemi sys e dbb differiscono. Occorre quindi tenere presente che il trasferimento dei dati non è ancora completato, poiché parte dei dati è rimasta nel buffer. Per svuotare tale buffer e ottenere una consistenza dei dati ci sono due possibilità:
  • terminare NetCat sulla macchina dba mediante CTRL+C o "kill -1 ";
  • eseguire NetCat col parametro "-w10" che termina NetCat dopo 10 secondi di timeout sullo stdin.

0 commenti: