Backup incrementali tar - Server di calcolo

Ho un server destinato a effettuare calcoli matematici impegnativi. Teoricamente una macchina di questo tipo non ha bisogno di backup in quanto utilizzata solo per la sua forza bruta: i risultati vengono poi trasferiti altrove per le analisi.

Poniamo comunque caso che si voglia effettuare un backup della home in maniera "intelligente".
L'idea iniziale era la solita di fare un backup completo la prima domenica del mese, dei backup incrementali le domeniche successive e iterare, andando a integrare anche con una logica di conservazione/pulizia dei vecchi backup.
Così facendo, ovvero effettuando il backup in momenti prestabiliti, c'è però la seria possibilità che lo script venga lanciato proprio durante l'esecuzione di un calcolo e ne vada a alterare la durata.
Ho così pensato a uno script un po' diverso, che viene lanciato ogni giorno a una certa ora della notte, controlla se le cpu stanno lavorando, e, se sono scariche, allora effettua il backup secondo una certa logica.

Vediamo alcuni passaggi dello script che poi riporto nella sua interezza

1- tar incrementali
Effettuare backup incrementali con tar è davvero molto semplice. Basta leggere con attenzione questa guida di gnu-tar
http://www.gnu.org/software/tar/manual/html_node/Incremental-Dumps.html
L' unica considerazione degna di nota che mi sento di fare è che in fase di creazione bisogna specificare --listed-incremental, in fase di listing o di estrazione si può utilizzare il vecchio parametro --incremental.

Io vado a creare
- un backup di livello 0 (il completo) col comando

dove il file $SNAPSHOT non c'è.
- n backup incrementali di livello n col comando (0<n<4)

dove $SNAPSHOT è il file con gli indici del backup precedente (o il completo o l'incrementale della "settimana" prima).

2- tar Multithread
Per velocizzare un po' le operazioni vado a utilizzare pigz
-  pigz-2.3.3-1.el7.centos.x86_64 : Parallel implementation of gzip
che, a fronte di una piccola riduzione nel fattore di compressione velocizza di molto le operazioni.
Esempio 1: 2.4GiB  in 10000 file - cpu con 12 core
gzip: 1minuto e 34 secondi
pgzip: 12 secondi
Esempio 2: 171GiB - 174656MiB in 460000 file - cpu con 8 core
gzip: 12248 secondi  - 125GiB
pgzip: 4949 secondi - 127GiB

Il comando che vado a utilizzare, dopo aver installato via pigz (banalmente con yum), sarà

3- Carico cpu
Per misurare il carico della cpu e decidere, in base alla misurazione, se procedere col backup oppure no, utilizzo il comando mpstat

20  -> Effettua la misurazione durante 20 secondi
1 -> Una sola ripetizione

senza grep e awk il risultato è una cosa del tipo:

grep e awk cercano solo i valori medi e stampo a video 100-%idle, che dovrebbe dirmi la % di cpu utilizzata nei 20 secondi.
N.B Se non specifichi 20 1 e dai semplicemente mpstat lui ti mostra i valori medi dall'ultimo riavvio.

4 - mount,umount,check_mount
Per effettuare il montaggio dell'hdd esterno utilizzo l'UUID dello stesso che ottengo digitando blkid.

$DRIVE poi conterrà /dev/sdX (seguo il link simbolico fino al device) in modo da poter effettuare il montaggio.
Per controllare che $DRIVE sia montato.

In sostanza guardo se il device c'è in /proc/mounts.

5 - listing di un backup incrementale

Il comando

Fa un elenco di tutte le directory col loro contenuto al momento della creazione dell'archivio tar. I file sono preceduti da (N, non cambiato, Y, cambiato) e le directory da D (guarda sempre la guida di GNU linkata poco sopra).
Se faccio un grep "Y" trovo i file cambiati. Uno script un filo più intelligente mi permette di stampare i file modificati e la directory in cui si trovano.

Il separatore è lo spazio. Per ogni riga che comincia con d (^d, ovvero le directory) salva la riga $0 nella variabile directory. Per le righe che iniziano per Y (^Y, ovvero i file modificati) stampo la variabile directory, a capo (\n) e la riga stessa.
(ok, non sono un fenomeno a scrivere script awk).

SCRIPT COMPLETO

 

 

Print Friendly, PDF & Email