Bacula e vários dispositivos de fita, e assim por diante

7

Bacula não fará uso de 2 dispositivos de fita simultaneamente. (Pesquise # - # - # pelo TL; DR)

Um pouco de experiência, talvez.

No processo de tentar obter uma solução de backup de trabalho decente (fazer backup de> 20 TB não é barato ou fácil) $dayjob, compramos várias coisas para fazê-lo funcionar.

Em primeiro lugar, há um trocador automático Spectra Logic T50e, 40 slots de qualidade LTO5, e esse robô tem um par de unidades IBM HH5 Ultrium LTO5, conectadas via FibreChannel Arbitrated Loop ao nosso servidor de backup.

Existe o servidor de backup. Um Dell R715 com 2x CPUs AMD 62xx de 16 núcleos e 32 GB de RAM. Gostoso. Esse servidor possui 2 placas Emulex FCe-12000E e uma NIC de porta dupla Intel X520-SR 10GE.

Também vendemos o Commvault Backup (não NDMP).

Aqui é onde fica realmente complicado.

A Spectra Logic e a Commvault enviaram os respectivos engenheiros, que montaram a biblioteca e o software. O Commvault estava funcionando bem, na medida em que o controlador estava funcionando bem. O servidor Dell possui um servidor Ubuntu 12.04, executa o MediaAgent for CommVault e monta nosso NAS BlueArc como NFS em alguns pontos de montagem, como /homee outras coisas /mnt.

Ao fazer backup dos pontos de montagem do NFS, estávamos vendo ~ = 290GB/hrtaxa de transferência. É o CRAP, considerando que temos 20 TB diferentes para passar, em uma janela de backup <48 horas. O máximo nominal no BlueArc é 700MB/s( 2460GB/hr), a velocidade máxima de gravação nominal nos dispositivos de fita é de 140 MB / s, por unidade, então é 492GB/hr(ou o dobro, para a taxa de transferência total).

Portanto, o próximo passo foi comparar o desempenho do NFS com o IOzone, e obtemos um desempenho épico de gravação (em mais de 20 threads), e é como 1,5-2,5 TB / h de gravação, mas o desempenho da leitura é quase impossível. Eu nunca consegui exceder 343 GB / h no máximo. Então, vamos supor que esse 343GB/hrseja um máximo teórico para o desempenho de leitura no NAS; portanto, poderíamos, em teoria, obter esse desempenho de a) CommVault eb) de qualquer outro agente de backup.

Não é o caso. O Commvault parece apenas me dar 200-250GB/hrrendimento e, após a experimentação, instalei o Bacula para ver qual é o estado da situação. Se, por exemplo, o Bacula apresentasse consistentemente melhores desempenhos e velocidades do que o Commvault, poderíamos dizer"**$.$ Refunds Plz $.$**"

# - # - #

Infelizmente, encontrei um problema diferente com o Bacula. O Commvault parece muito feliz em ler de uma parte do ponto de montagem com um thread e transmiti-lo para um dispositivo Tape, enquanto lê de algum outro diretório com o outro thread e grava na segunda unidade no autochanger.

Durante toda a minha vida, não consigo fazer com que Bacula monte e grave em duas unidades de fita simultaneamente .

Coisas que tentei:

  • Configuração Maximum Concurrent Jobs = 20nos Daemons Director, Arquivo e Armazenamento
  • Configuração Prefer Mounted Volumes = nona definição de tarefa
  • Definindo vários dispositivos no recurso Autochanger.

A documentação parece ser muito centrada em uma unidade, e parece que amarramos um foguete a um hamster, com este. A maioria dos exemplos de configurações do Bacula são para unidades DDS4, troca manual de fita e sistemas FreeBSD ou IRIX.

Provavelmente devo acrescentar que não estou muito incomodado se isso não for possível, mas ficaria surpreso. Basicamente, quero usar o Bacula como prova para grudar nos fornecedores de software que eles são muito caros;)

Li em algum lugar que @KyleBrandt fez algo semelhante com uma solução de fita moderna ..

Arquivos de configuração: bacula-dir.conf

#
# Default Bacula Director Configuration file

Director {                            # define myself
  Name = backuphost-1-dir
  DIRport = 9101                # where we listen for UA connections
  QueryFile = "/etc/bacula/scripts/query.sql"
  WorkingDirectory = "/var/lib/bacula"
  PidDirectory = "/var/run/bacula"
  Maximum Concurrent Jobs = 20
  Password = "yourekiddingright"         # Console password
  Messages = Daemon
  DirAddress = 0.0.0.0
  #DirAddress = 127.0.0.1
}

JobDefs {
  Name = "DefaultFileJob"
  Type = Backup
  Level = Incremental
  Client = backuphost-1-fd 
  FileSet = "Full Set"
  Schedule = "WeeklyCycle"
  Storage = File
  Messages = Standard
  Pool = File
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
}

JobDefs {
  Name = "DefaultTapeJob"
  Type = Backup
  Level = Incremental
  Client = backuphost-1-fd
  FileSet = "Full Set"
  Schedule = "WeeklyCycle"
  Storage = "SpectraLogic"
  Messages = Standard
  Pool = AllTapes
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
  Prefer Mounted Volumes = no

}

#
# Define the main nightly save backup job
#   By default, this job will back up to disk in /nonexistant/path/to/file/archive/dir
Job {
  Name = "BackupClient1"
  JobDefs = "DefaultFileJob"
}

Job {
  Name = "BackupThisVolume"
  JobDefs = "DefaultTapeJob"
  FileSet = "SpecialVolume"
}
#Job {
#  Name = "BackupClient2"
#  Client = backuphost-12-fd
#  JobDefs = "DefaultJob"
#}

# Backup the catalog database (after the nightly save)
Job {
  Name = "BackupCatalog"
  JobDefs = "DefaultFileJob"
  Level = Full
  FileSet="Catalog"
  Schedule = "WeeklyCycleAfterBackup"
  # This creates an ASCII copy of the catalog
  # Arguments to make_catalog_backup.pl are:
  #  make_catalog_backup.pl <catalog-name>
  RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup.pl MyCatalog"
  # This deletes the copy of the catalog
  RunAfterJob  = "/etc/bacula/scripts/delete_catalog_backup"
  Write Bootstrap = "/var/lib/bacula/%n.bsr"
  Priority = 11                   # run after main backup
}

#
# Standard Restore template, to be changed by Console program
#  Only one such job is needed for all Jobs/Clients/Storage ...
#
Job {
  Name = "RestoreFiles"
  Type = Restore
  Client=backuphost-1-fd                 
  FileSet="Full Set"                  
  Storage = File                      
  Pool = Default
  Messages = Standard
  Where = /srv/bacula/restore
}

FileSet {
  Name = "SpecialVolume"
  Include {
    Options {
      signature = MD5
    }
  File = /mnt/SpecialVolume
  }
  Exclude {
    File = /var/lib/bacula
    File = /nonexistant/path/to/file/archive/dir
    File = /proc
    File = /tmp
    File = /.journal
    File = /.fsck
  }
}


# List of files to be backed up
FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
    }
    File = /usr/sbin
  }

  Exclude {
    File = /var/lib/bacula
    File = /nonexistant/path/to/file/archive/dir
    File = /proc
    File = /tmp
    File = /.journal
    File = /.fsck
  }
}

Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sun at 23:05
  Run = Differential 2nd-5th sun at 23:05
  Run = Incremental mon-sat at 23:05
}

# This schedule does the catalog. It starts after the WeeklyCycle
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 23:10
}

# This is the backup of the catalog
FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/lib/bacula/bacula.sql"
  }
}

# Client (File Services) to backup
Client {
  Name = backuphost-1-fd
  Address = localhost
  FDPort = 9102
  Catalog = MyCatalog
  Password = "surelyyourejoking"          # password for FileDaemon
  File Retention = 30 days            # 30 days
  Job Retention = 6 months            # six months
  AutoPrune = yes                     # Prune expired Jobs/Files
}

#
# Second Client (File Services) to backup
#  You should change Name, Address, and Password before using
#
#Client {
#  Name = backuphost-12-fd                
#  Address = localhost2
#  FDPort = 9102
#  Catalog = MyCatalog
#  Password = "i'mnotjokinganddontcallmeshirley"         # password for FileDaemon 2
#  File Retention = 30 days            # 30 days
#  Job Retention = 6 months            # six months
#  AutoPrune = yes                     # Prune expired Jobs/Files
#}


# Definition of file storage device
Storage {
  Name = File
# Do not use "localhost" here    
  Address = localhost                # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "lalalalala"
  Device = FileStorage
  Media Type = File
}

Storage {
  Name = "SpectraLogic"
  Address = localhost
  SDPort = 9103
  Password = "linkedinmakethebestpasswords"
  Device = Drive-1
  Device = Drive-2
  Media Type = LTO5
  Autochanger = yes
}



# Generic catalog service
Catalog {
  Name = MyCatalog
# Uncomment the following line if you want the dbi driver
# dbdriver = "dbi:sqlite3"; dbaddress = 127.0.0.1; dbport =  
  dbname = "bacula"; DB Address = ""; dbuser = "bacula"; dbpassword = ""
}

# Reasonable message delivery -- send most everything to email address
#  and to the console
Messages {
  Name = Standard

  mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = root@localhost = all, !skipped            
  operator = root@localhost = mount
  console = all, !skipped, !saved
#
# WARNING! the following will create a file that you must cycle from
#          time to time as it will grow indefinitely. However, it will
#          also keep all your messages if they scroll off the console.
#
  append = "/var/lib/bacula/log" = all, !skipped
  catalog = all
}


#
# Message delivery for daemon messages (no job).
Messages {
  Name = Daemon
  mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = root@localhost = all, !skipped            
  console = all, !skipped, !saved
  append = "/var/lib/bacula/log" = all, !skipped
}

# Default pool definition
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365 days         # one year
}

# File Pool definition
Pool {
  Name = File
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365 days         # one year
  Maximum Volume Bytes = 50G          # Limit Volume size to something reasonable
  Maximum Volumes = 100               # Limit number of Volumes in Pool
}

Pool {
  Name = AllTapes
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 31 days         # one Moth
}

# Scratch pool definition
Pool {
  Name = Scratch
  Pool Type = Backup
}

#
# Restricted console used by tray-monitor to get the status of the director
#
Console {
  Name = backuphost-1-mon
  Password = "LastFMalsostorePasswordsLikeThis"
  CommandACL = status, .status
}

bacula-sd.conf

#
# Default Bacula Storage Daemon Configuration file
#

Storage {                             # definition of myself
  Name = backuphost-1-sd
  SDPort = 9103                  # Director's port      
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/var/run/bacula"
  Maximum Concurrent Jobs = 20
  SDAddress = 0.0.0.0
#  SDAddress = 127.0.0.1
}

#
# List Directors who are permitted to contact Storage daemon
#
Director {
  Name = backuphost-1-dir
  Password = "passwordslinplaintext"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the storage daemon
#
Director {
  Name = backuphost-1-mon
  Password = "totalinsecurityabound"
  Monitor = yes
}


Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /srv/bacula/archive
  LabelMedia = yes;                   # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes;               # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
}


Autochanger {
   Name = SpectraLogic
   Device = Drive-1
   Device = Drive-2
   Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d"
   Changer Device = /dev/sg4
}

Device {
   Name = Drive-1
   Drive Index = 0
   Archive Device = /dev/nst0
   Changer Device = /dev/sg4
   Media Type = LTO5
   AutoChanger = yes
   RemovableMedia = yes;
   AutomaticMount = yes;
   AlwaysOpen = yes;
   RandomAccess = no;
   LabelMedia = yes

}

Device {
   Name = Drive-2
   Drive Index = 1
   Archive Device = /dev/nst1
   Changer Device = /dev/sg4
   Media Type = LTO5
   AutoChanger = yes
   RemovableMedia = yes;
   AutomaticMount = yes;
   AlwaysOpen = yes;
   RandomAccess = no;
   LabelMedia = yes
}

# 
# Send all messages to the Director, 
# mount messages also are sent to the email address
#
Messages {
  Name = Standard
  director = backuphost-1-dir = all
}

bacula-fd.conf

#
# Default  Bacula File Daemon Configuration file
#

#
# List Directors who are permitted to contact this File daemon
#
Director {
  Name = backuphost-1-dir
  Password = "hahahahahaha"
}

#
# Restricted Director, used by tray-monitor to get the
#   status of the file daemon
#
Director {
  Name = backuphost-1-mon
  Password = "hohohohohho"
  Monitor = yes
}

#
# "Global" File daemon configuration specifications
#
FileDaemon {                          # this is me
  Name = backuphost-1-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20
  #FDAddress = 127.0.0.1
  FDAddress = 0.0.0.0
}

# Send all messages except skipped files back to Director
Messages {
  Name = Standard
  director = backuphost-1-dir = all, !skipped, !restored
}
Tom O'Connor
fonte
Para esclarecer - você está tentando ter um único trabalho gravando nos dois slots no trocador automático? Eu não acho que você pode fazer isso, mas eu fazer pensar que vários trabalhos vai escrever para dispositivos separados ...
voretaq7
1
O Commvault permite que um único trabalho grave nos dois slots. Não acho injusto esperar que outros softwares façam o mesmo.
21430 Tom O'Connor
1
Se o que você está tentando fazer é provar o desempenho, por que não executar apenas 2 tarefas ao mesmo tempo em dispositivos diferentes, isso provará o que você deseja.
precisa
1
Só porque o Commvault o registra em um trabalho, não significa que não o está separando. Por exemplo, o Syncsort backup express faz isso pelo ponto de montagem e normalmente esgotará todos os pontos de montagem fornecidos para segmentos separados (no mesmo trabalho) antes de estender um único trabalho entre duas fitas. Eu acho que existem algumas boas razões para isso ... não me pergunte o que eles são :)
SpaceManSpiff
1
Estou pensando em abandonar esta questão e o VTC Too Localized.
Tom O'Connor

Respostas:

1

Quando você configura um conjunto de arquivos no bacula, ele literalmente lê o pathspec linha por linha e faz o backup dessa maneira.

Ele não cria dois threads para ler os diferentes caminhos de arquivo no agente.

Como o @SpacemanSpiff disse, se você quisesse fazer isso, o caminho a seguir seria configurar trabalhos diferentes, um para cada arquivo que você deseja fazer backup.

Matthew Ife
fonte
0

Eu tenho três dicas para você:

  • Use vários daemons de armazenamento. Você pode executar vários daemons de armazenamento em portas diferentes na mesma máquina.
  • Use trabalhos de base para deduplicação. Economiza tempo e espaço.
  • Use a compactação - se as suas unidades de fita fizerem boa e boa compactação, mas talvez seja necessário pesá-la e experimentar a compactação bacula-fd. Isso acontece no cliente e, consequentemente, economiza largura de banda também para um pequeno sacrifício de tempo da CPU.
nearora
fonte