Este script permite listar dinamicamente subdiretórios e arquivos de um diretório de backup, divindo listas de arquivos para backup classificadas por tamanho.
No exemplo do comando:
/opt/bacula/scripts/bsplitter 3 1 /var/lib/pgsql
- “3” é o número total de Jobs e FileSets. Estes precisam ser criados manualmente pelo administrador, e devem ser configurados para execução em paralelo. Os Jobs devem conter a opção Accurate=yes (Precisão=yes no Bweb).
- “1” é a parcela do backup que será realizado. Então para cada FileSet, você modificará a parcela que será backupeada. Exemplo:
FileSet1: bsplitter 3 1 /var/lib/pgsql
FileSet2: bsplitter 3 2 /var/lib/pgsql
FileSet3: bsplitter 3 3 /var/lib/pgsql
- “/var/lib/pgsql” é o diretório cujo conteúdo do backup será fracionado em parcelas.
Se estiver usando BWeb, como na Figura 1, basta chamar o script a seguir no campo Include do FileSet:
Figura 1. No BWeb, basta inserir no Include: \|/opt/bacula/scripts/bsplitter 3 1 /var/lib/pgsql
Segue o script, a ser salvo idealmente no caminho “/opt/bacula/scripts/bsplitter” de seu host Cliente do backup.
#!/bin/bash # # Autoria: Heitor Faria (Copyleft: all rights reversed). # Orientador: Prof. Julio Neves (http://www.livrate.com.br/). # Testador: xxxx # # Deve ser chamado no sub-recurso INCLUDE do FileSet do bacula-dir.conf, referente ao backup do cliente instalado que deseja fracionar a quantidade de subdiretórios: # # File = "\|/opt/bacula/scripts/bsplitter 3 1 /var/lib/pgsql" # <parallelism><parcel><dir_to_split> # # bwdir="/opt/bacula/working" sname=$(sed 's|/|.|g' <<< $3) # minimum time between new files scan, in minutes. Default 22 hours minupdate=1329 if [ $(find $bwdir/$sname.txt -mmin -$minupdate 2>/dev/null | wc -l) -eq 0 ] then rm -f $bwdir/$sname.part* ListaOrdenada=$(find -L $3 \( -type f -o -type l \) -printf "%s\t%p\n" | sort -nr | cut -f2 | sed 's/ /^/') # subst o espaço por ^ para não quebrar ApontaVet=o Sinal=1 while read Arq do let ApontaVet+=Sinal ((ApontaVet > $1)) && { let ApontaVet-- let Sinal*=-1 } ((ApontaVet < 1)) && { ApontaVet=1 let Sinal*=-1 } eval V$ApontaVet+='($Arq)' done < <(echo "$ListaOrdenada") for ((N=1; N<=$1; N++)) do eval TodosArqs=${V$N[@]} # Gera uma linha com todos arquivos para cada vetor for Nome in $TodosArqs # Desmembra a lista um a um para criar a pilha de arquivos do eval Nome=${Nome//^/ } echo $Nome >> $bwdir/$sname.part$N #/caminho/do/arquivo done done fi cat $bwdir/$sname.part$2
Obs.: FileSets dinâmicos não são compatíveis com o Exclude do bacula. Exclusões devem ser tratadas no próprio script.
No exemplo específico do PostgreSQL, para garantia de integridade, este backup está sendo feito de um snapshot de LVM montado em outra máquina. De outra maneira o banco teria de ser parado durante o backup ou colocado em modo backup (ex.: com o plugin Bacula Enterprise pgsql).
De qualquer maneira, o bsplitter pode ser utilizado para qualquer conjunto grande de arquivos de um mesmo host, para o qual se deseja paralelismo.
Restore
Na restauração, você pode concatenar os n conjuntos de jobs feitos para uma única operação de restore, informando os jobids dos jobs paralelizados. Exemplo bconsole:
restore jobid=x,y,z
No BWeb, como exibido na Figura 2, também é possível concatenar diversos Jobs na tela de seleção de arquivos para restores, desmarcando a opção “Only Selected Fileset”
Figura 2. Restauração múltiplos Jobs BWeb, desmarcando “Only Selected Fileset”
Importante! Para a restauração simultânea de múltiplos backups, estes devem ter sido escritos em volumes/fitas/dispositivos diferentes. Uma das maneiras de garantir isso é submeter o backups das parcelas para Pools diferentes. Outra maneira (mais automática e recomendável mais para backups em disco), é desmarcar a diretiva “PreferMountedVolumes=no” nos Devices de bacula-sd.conf.
Disponível em: PortuguêsEnglish (Inglês)Español (Espanhol)