bsplitter – Divisão Dinâmica de FileSets do Bacula para Backups paralelos

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:

bsplitter - Divisão Dinâmica de FileSets do Bacula para Backups paralelos 1Figura 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”

bsplitter - Divisão Dinâmica de FileSets do Bacula para Backups paralelos 2Figura 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: pt-brPortuguêsenEnglish (Inglês)esEspañol (Espanhol)

Deixe uma resposta