Bacula는 2 개의 테이프 장치를 동시에 사용하지 않습니다. ( TL; DR에 대한 #-#-# 검색 )
아마도 작은 배경 일 것입니다.
에서 합리적인 수준의 백업 솔루션 (20TB 이상을 백업하는 것이 저렴하거나 쉽지 않음)을 얻는 과정에서 $dayjob
많은 작업을 수행하여 작동했습니다.
첫째, Spectra Logic T50e 오토 체인저, 40 슬롯의 LTO5 우수성이 있으며 로봇에는 FibreChannel Arbitrated Loop를 통해 백업 서버에 연결된 한 쌍의 IBM HH5 Ultrium LTO5 드라이브가 있습니다.
백업 서버가 있습니다. 2x 16 코어 AMD 62xx CPU 및 32GB RAM을 갖춘 Dell R715. 맛있는. 이 서버에는 2 개의 Emulex FCe-12000E 카드와 Intel X520-SR 듀얼 포트 10GE NIC가 있습니다.
Commvault Backup (비 -NDMP)도 판매되었습니다.
여기가 정말 복잡해집니다.
Spectra Logic과 Commvault는 각각 라이브러리와 소프트웨어를 설정하는 각 엔지니어를 보냈습니다. 컨트롤러가 정상적으로 작동하는 한 Commvault가 정상적으로 실행되었습니다. 델 서버는 우분투 12.04 서버를 가지고 있으며, 컴 볼트의 MediaAgent를 실행, 몇 마운트 포인트, 등으로 NFS 우리의 블루 아크 NAS를 장착 /home
하고, 몇 가지 물건 /mnt
.
NFS 마운트 포인트에서 백업 할 때 290GB/hr
처리량이 ~ = 인 것으로 나타났습니다 . <48 시간 백업 창에서 20 홀 TB를 처리 할 수 있다는 점을 고려하면 CRAP입니다. BlueArc의 정격 최대 값은 700MB/s
( 2460GB/hr
), 테이프 장치의 정격 최대 쓰기 속도는 드라이브 당 140MB / s이므로 492GB/hr
전체 처리량의 두 배입니다.
따라서 다음 단계는 IOzone을 사용하여 NFS 성능을 벤치마킹하는 것이 었으며, 20 개 이상의 스레드에서 뛰어난 쓰기 성능을 얻었으며, 1.5-2.5TB / hr 쓰기와 비슷하지만 읽기 성능은 절망적입니다. 나는 최대 343GB / 시간 이상을 얻을 수 없었습니다. 따라서 343GB/hr
이것이 NAS의 읽기 성능에 대한 이론상 최대 값 이라고 가정 하면 이론적으로 a) CommVault 및 b) 다른 백업 에이전트에서 해당 성능을 얻을 수 있어야합니다 .
그렇지 않습니다. Commvault는 200-250GB/hr
처리량 만 제공하는 것으로 보이며 실험을 통해 Bacula를 설치하여 플레이 상태를 확인했습니다. 예를 들어 Bacula가 Commvault보다 지속적으로 더 나은 성능과 속도를 제공했다면"**$.$ Refunds Plz $.$**"
#-#-#
아아, 나는 Bacula와 다른 문제를 발견했다. Commvault는 마운트 지점의 한 부분에서 하나의 스레드로 읽고 다른 스레드가있는 다른 디렉토리에서 읽고 Autochanger의 두 번째 드라이브에 쓰는 동안 테이프 장치로 스트리밍하는 것이 매우 기쁜 것 같습니다.
나는 내 인생에서 Bacula가 두 개의 테이프 드라이브에 동시에 마운트하고 쓸 수는 없다 .
내가 시도한 것 :
Maximum Concurrent Jobs = 20
디렉터, 파일 및 스토리지 데몬에서의 설정Prefer Mounted Volumes = no
작업 정의에서 설정- Autochanger 리소스에서 여러 장치 설정
문서는 단일 드라이브 중심적인 것으로 보이며, 로켓을 햄스터에 묶은 것처럼 느낍니다. Bacula 구성의 예는 대부분 DDS4 드라이브, 수동 테이프 스와핑 및 FreeBSD 또는 IRIX 시스템을위한 것입니다.
아마이 경우 내가 너무 귀찮게 아니에요 추가해야 하지 가능하지만 놀랄 것입니다. 기본적으로 Bacula를 소프트웨어 공급 업체에 고가의 증거로 사용하고 싶습니다.)
@KyleBrandt가 현대 테이프 솔루션과 비슷한 것을 수행 한 곳을 읽었습니다.
구성 파일 : 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
}