Chinaunix首页 | 论坛 | 博客
  • 博客访问: 734407
  • 博文数量: 235
  • 博客积分: 4309
  • 博客等级: 中校
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-17 11:25
个人简介

If you don\\\\\\\\\\\\\\\'t wanna do it, you find an EXCUSE; if you do, you\\\\\\\\\\\\\\\'ll find a WAY :-)

文章分类

全部博文(235)

文章存档

2014年(3)

2013年(2)

2012年(31)

2011年(199)

分类: LINUX

2011-02-23 13:42:18

一、总体概述1.1 Bacula简略介绍
Bacula是一款能够由管理员控制数据备份,恢复,完整性验证,并跨不同种网络进行数据传递的软件。它基于Client/Server模式的备份软件,容易使用,效率高,提供许多高级存储管理功能,使得它能够很容易的发现并恢复丢失的或已经损坏的文件。采用的模块化设计使得bacula可以满足从单独的备份恢复管理系统升级到由上百台计算机组成的大型备份网络。

1.2 Bacula适合哪些用户
如果你目前正在使用tardump来备份你的计算机数据,并且你希望拥有一款网络备份,来实现定时备份,数据库记录备份事务,恢复到特定文件级的解决方案的话,那么Bacula是最适合你的选择,它还会给你带来许多额外的你想要的特色功能。
如果你想要让Bacula实现将数据保存到一个已经挂载的磁带机里的话,你会发现Bacula独特的工作方式,它会按照你指定的规则保护你的数据。
有相当数量的Bacula使用者报告说,Bacula的配置和使用都比其他同类产品更加简单。
如果你目前正在使用或者曾经使用过那些久经考验的网络备份软件,比如:legato ARCserveIT, Arkeia, 或者 PerfectBackup+,你将会对Bacula更加的感兴趣,因为它能具备那些商业备份软件相同的功能特色,而且最重要的是它是个在GNU2软件协议下的自由软件。

支持的多种备份方式:
  • 完全备份
  • 差异备份
  • 增量备份

支持多种恢复方式:
  • 恢复某个目录到指定位置,恢复时会自动恢复其父目录树结构。
  • 恢复某个文件到指定位置,恢复时会自动恢复其父目录树结构。
  • 恢复某个时间之后的备份到指定位置,恢复时会自动恢复其父目录树结构。
  • 恢复所有备份的数据到指定位置,恢复时会自动恢复其父目录树结构。
  • 恢复的文件和目录都保持原有的权限和属主,访问时间等。
  • 恢复winNT/winXp/win2K时,会保存原属主和权限。
(注意:如果FD进程system帐户身份运行则目录树结构将保存系统属主和权限,此时恢复的文件可能会发生不允许被非系统用户读取的问题。)
  • 手动恢复,自动定时恢复均可满足。

支持广泛的备份的介质:
  • 支持把备份写到硬盘文件中;
  • 也支持写到磁带中;
  • 支持写到dvd光盘中;
  • 支持光纤存储阵列。

支持多种操作系统:
  • LinuxWe have successfully compiled and used Bacula on RH8.0/RH9/RHEL 3.0/FC3 with GCC 3.4
  • Unix
  • Mac
  • Windows versions (Win98, WinMe, WinNT, WinXP, Win2000, and Windows 2003 systems)(备份win,还不支持恢复到win
支持备份与恢复多种文件系统
ext2, jfs, ntfs, proc, reiserfs, xfs, usbdevfs, sysfs, smbfs, iso9660. For ext3 systems, use ext2.
内部功能强大:
  • 终端控制命令强大;可以配合编写shell程序完成自动话备份和恢复;
  • 自动绘制各种图形报表(备份报表,恢复报表);
  • 原备份文件丢失可以做到自动寻找可用备份文件,完成备份数据的传输;
  • 针对碎片文件(又名稀疏文件),可先进行优化然后备份,恢复后自动整理碎片文件;
  • 支持MD5SHA1两种签名校验;
  • 支持对硬连接的备份控制;
  • 支持正则表达式,可控制是否备份某个符合条件的目录或文件;
  • 支持UnixACL特别权限备份;
  • 定时备份,无须手动干预;
  • 支持针对整个操作系统(包括UnixWindowsLinux)的备份;

备份占用系统资源少,性能高,传输速度快
实际测试,在互联网上在线备份邮件系统的报告
1DirectorStorage端安装在同一台服务器上,该机器运行公司的代理上网程序负责公司20人的上网网关,设备配置如下:
Cpuceleron 1.1G
Memory: 128M
备份时的平均系统占用情况如下图:请注意bacula-sd,和bacula-dir两行。

2)客户端是外网邮件服务器,设备配置如下:
CpuAMD Athlon(tm) XP 2400+
Memory440M
备份时的平均系统占用情况如下图:请注意bacula-fd.

为了测试效果,我们备份的时间是下午1400而且邮件系统的服务都在正常运行,客户收发信件几乎没有任何影响。
结论:备份系统的cpu和内存占用率都是非常少,而且即使用户正在使用也不会影响正常的业务。效果比预想的要好。如果系统有大流量的应用在使用,那么备份程序会让应用优先,等待应用执行完毕后才会开始自己的备份。
断点续传功能
备份时如果出现系统中断或者网络中断的情况也没关系,网络恢复后将会断点续传。
备份程序优先级设定
备份时如果有大流量的应用程序运行,那么备份程序将会把优先级让给应用程序,等待应用执行完毕才开始自己的备份,不影响正常业务。
组成结构
Bacula备份工作有下面五个主要部件组成。
一个是Director Daemon,负责监督所有的备份,恢复,校验和归档操作。运行记录整个系统状况的数据库可以使用MySqlPostgreSql,作者推荐的是mysql。记录连接FDSD端的“资源信息”,控制备份”时间表”,并将以上信息组合成为多个“JOB资源”以备Console来调用,配置文件是bacula-dir.conf
一个是Storage Daemon,它是存储介质端,负责定义备份数据保存到哪里可以是本地硬盘,DVDtap,光纤磁盘阵列,NAS,恢复的时候负责把数据传出去。配置文件是bacula-sd.conf
一个是File Daemon,备份时把文件传出,恢复时接受数据并恢复。属于客户端用的守护进程。配置文件是bacula-fd.conf
Console端连接到Director管理备份与恢复。有三种管理方式,文本shell界面,GNOME GUI管理(不能完全管理),wxWidgets 图形接口。
Monitor端监控。
五个主要组件都可以单独分布部署,关系图如下:

备份与恢复工作流程
  • console端连接到director端下命令;
  • director调用自己的数据库从中取出记录信息,负责协调clientFD)与StorageSD);
  • FD负责验证dirctor操作许可和验证,通过了则连接SD端。
  • FD按照director指定去连接SD端,联通后,允许FD端将数据传到SD指定的存储介质里
注意:存储端SD必须与客户端FD保持网络连接并且能互相访问否则无法备份;恢复时FD将备份介质里的数据再按director指定位置从SD中传回来。
注意:在备份与恢复数据的过程里都是FD(客户端)
  • 发送数据到SD(备份过程)
  • SD拷贝回数据(恢复过程)。
工作流程图如下:

备份恢复需要启动并且配置正确的组件
为了保证备份与恢复的成功,下列组件必须配置正确并保证运行
the Director daemon, the File daemon, the Storage daemon, and the Catalog service (MySQL, PostgreSQL or SQLite作者推荐MySQL).
各组成部分的配置文件之间的相互关系
三个主要的配置文件不是彼此独立的,而是相互影响的,director的文件变动storageclient的文件都要做相应的修改,而storageclient的变动又得在director上修改否则就无法正常控制他们。如下图所示:

二、安装bacula2.1 配置makefile,编译,安装
# ./configure --prefix=/opt/Rhythm_backup
# make ; make install

2. 2 初始化数据库,初始化表,授权对bacula数据库的操作权限
# cd /opt/Rhythm_backup/
# bin/create_mysql_database
# bin/make_mysql_tables
# bin/grant_mysql_privileges

三、启动服务3.1 修改主控制器配置文件bacula-dir.conf
# vi ./bacula-dir.conf
# Generic catalog service 这里是关于数据库的配置
Catalog {
Name = MyCatalog
dbname = bacula; user = bacula; password = ""
DB Address = 192.168.0.210 #不要用localhost,用mysql serverip
DB Port = 33060
}
注意:默认没有DB AddressDB Port两行,所以需要加上才可以正常启动因为端口不是默认的,否则出现错误:
3.2 同时启动所有服务的方法
# ./bacula start 启动director服务,storage服务,client服务
Starting the Bacula Storage daemon
Starting the Bacula File daemon
Starting the Bacula Director daemon
# netstat
0.0.0.0:9101 0.0.0.0:* LISTEN
0.0.0.0:9102 0.0.0.0:* LISTEN
0.0.0.0:9103 0.0.0.0:* LISTEN
说明:9101代表director daemon9102代表file daemon9103代表storage daemon
3.3 分别单独启动dir,sd,fd服务的方法
# ./bacula-ctl-dir
Usage: ./bacula-ctl-dir {start|stop|restart|status}
# ./bacula-ctl-sd
Usage: ./bacula-ctl-sd {start|stop|restart|status}
# ./bacula-ctl-fd
Usage: ./bacula-ctl-fd {start|stop|restart|status}

四、实例
4.1 可以有几种网络备份拓扑
  • Director与client(被备份的目的机),storage(保存备份的介质)在同一台机器上,自己备份自己,保存在本地。
  • Director单独一台控制全局,client多台,storage一台。
  • Director 与storage同一台,client多台。(常见的是一台client,一台director+storage
    4.2 Console端,Director端,FD端,SD端各自有自己的配置文件
每个配置文件内部关系如图:

4.3 配置Console控制端
#
# Bacula User Agent (or Console) Configuration File
#
Director {
Name = backup_mail_server
DIRport = 9101
address = 192.168.0.210
Password = ""
}
4.4 配置director
定义主控制器启动的属性信息
Director { # define myself
Name = "backup_mail_server"
DirAddress = 211.155.251.138 # define special director ip
DIRport = 9101 # where we listen for UA connections
QueryFile = "/opt/Rhythm_backup/bin/query.sql"
WorkingDirectory = "/opt/Rhythm_backup/working"
PidDirectory = "/opt/Rhythm_backup/var"
Maximum Concurrent Jobs = 1
Password = "" # Console password必须与控制端一致。
Messages = backup_messages #这里必须要和下面的Messages里的Name=对应
}

定义主控制器的一个Job资源,里面内容都是下面各属性的组合。可以定义多个,这里是mail的实例
Job { #定义一个备份linuxjoblinux客户机)
Name = "storage_mail"
Type = Backup #可用类型有backuprestoreverifyadmin(周期性的对catalog做修剪)
Level = Incremental #可用的值是Full(全备份),Incremental(增量备份),Differential(差异备份)如果第一次没做Full则会先做Full以后才执行Incremental
Client=mail
FileSet="file_mail"
Storage = storage_mail
Pool = Default
Messages = backup_messages
Schedule = "backup_WeeklyCycle"
}
Job { #定义一个备份winxpjob
Name = "storage_winxp"
Type = Backup
Level = Incremental
Client=winxp_236
FileSet="Windows xp"
Storage = storage_mail
Pool = Default
Messages = backup_messages
Schedule = "backup_WeeklyCycle"
}
Job { #定义一个恢复到linuxjob
Name = "restore_mail"
Type = Restore #对于restore没有可用的Level
Write Bootstrap = "/opt/Rhythm_backup/restore_mail.bsr"
Client=mail
FileSet="file_mail"
Storage = storage_mail
Pool = Default
Messages = restore_messages
Where = /restore
}
Job { #定义一个恢复到WinXPJob资源。
Name = "restore_winxp_236"
Type = Restore
Write Bootstrap = "/opt/Rhythm_backup/working/restore_mail.bsr"
Client = winxp_236
FileSet = "Windows xp"
Schedule = "restore_WeeklyCycle"
Storage = storage_mail
Messages = restore_messages
Pool = Default
Where = "h:/restore"
}
注:如果TypeVerify时,Level可以是InitCatalogCatalogVolumeToCatalogDiskToCatalog

定义FileSet资源,告诉主控制器director应该备份什么文件,排除备份什么文件,可以定义多个FileSet
FileSet {
Name = "file_mail"
Include { #备份邮件数据/mss目录
Options { signature = MD5; Compression= GZIP; keepatime = yes; } #MD5签名并压缩,对于邮件的备份使用keepatime来保持时间,备份前会先备份访问时间,此选项不要用在windows系统上。
File = /mss
}
Exclude { #不备份所有log文件,/proc,/tmp,/.journal,/.fsck目录
*.log
File = /proc
File = /tmp
File = /.journal
File = /.fsck
}
}
FileSet { #备份Catalog日志
Name = "Catalog"
Include {
Options {
signature = MD5
}
File = /opt/Rhythm_backup/working/bacula.sql
}
}
FileSet { #备份一个裸设备,前提必须是该分区没有被挂接或没只读方式挂接
Name = "RawPartition"
Include {
Options { sparse=yes }
File = /dev/hda2
}
}
FileSet { #备份windows系统文件的例子
Name = "Windows xp"
Include {
Options {
signature = MD5
Exclude = yes
IgnoreCase = yes
}
File = "C:/"
File = "D:/"
File = "E:/ftp" #只备份e:\ftp目录
}
}

定义备份哪个客户机的信息,可以定义多个允许备份多台客户机
Client {
Name = mail #这里的信息必须与192.168.0.210机器里bacula-fd.conf文件里相应信息相同。
Address = 192.168.0.210 #要备份的客户机
FDPort = 9102
Catalog = 192.168.0.210 #记录客户机备份情况的日志名
Password = "" # password for FileDaemon,与之相同才行
File Retention = 30 days #保存在数据库的目录多久轮询一次,这里是30天,只影响数据库里的记录不影响备份的文件,下面的JR同理。
Job Retention = 6 months #job保持周期,应该大于FRetention的值
AutoPrune = yes #FR/JR周期满了时是否执行自动删除他们在数据库里的目录。
# Priority = 1 #如果多个client时,定义优先及1-1000,值小的优先。
}
Client { #定义一个winxp的客户机,该机上安装了winbacula
Name = winxp_236
Address = 192.168.0.236
FDPort = 9102
Catalog = MyCatalog
Password = "@client_password@" #注意这个口令不能设空,必须以win机里fd配置文件里的Password为准,因为发现win的配置只能在安装时配置,以后修改不会生效所以安装时一定要配置正确否则只能卸载重装,如果安装时口令为空的话,这里的值是“@client_password@”
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}


定义将客户机的数据保存到哪个存储设备,可以定义多个
Storage {
Name = storage_mail #必须与bacula-sd.conf配置文件里的Name = storage_mail相同
Address = 192.168.0.210 #安装sd服务的服务器ip
SDPort = 9103
Password = "" #访问sd服务器的口令
Device = storage1 #必须与192.168.0.210机器里bacula-sd.conf配置件里的Device { Name = storage1相同。
Media Type = File #必须与bacula-sd.conf配置文件里的Device {Media Type = File相同,这是指定备份介质的地方,最好直接写存储设备名,例“HP DLT8000”,如果有多个相同的存储设备存在,你最好做个区分,这里只标记一个唯一的设备。
Autochanger = yes # enable for autochanger device

定义给Job使用的池属性,即是否循环覆盖备份数据,是否自动清除过期的备份,循环的过期时间
Pool {
Name = Default
Pool Type = Backup #Job里的Type协调可用值ArchiveClonedMigration,CopySave
Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 365 days # one year
}

定义调度时间,每个时间表都可以定义多个Level执行的时间,Job资源的Level=对应那个级别就按哪个时间执行
Schedule {
Name = "backup_WeeklyCycle"
Run = Full 1st sun at 23:05 #定义全备份的时间
Run = Differential 2nd-5th sun at 23:05 #定义差异备份的时间
Run = Incremental mon-sat at 23:05 这里定义的模式和Job资源的Level对应,相应的Level=Incremental按照这里的定时执行。
}
Schedule {
Name = "restore_WeeklyCycle"
Run = Full 1st sun at 23:05
}

定义后台数据库,否则启动不了
Catalog {
Name = MyCatalog
dbname = bacula; user = bacula; password = ""
DB Address = 192.168.0.210 #不要用localhost
DB Port = 33060
}

定义发送报告邮件和记录日志的位置
Messages {
Name = backup_messages #为备份客户端mail主机提供的messages资源。其他客户机改其他名字就行了,下面可以改其他管理员的邮箱,多人用“,”分隔。
mailcommand = "/opt/Rhythm_backup/sbin/bsmtp -h 211.155.251.234 -f \"\(Rhythm_backup备份报告\) %r\" -s \"备份结果: %t %e of %c %l\" %r"
operatorcommand = "/opt/Rhythm_backup/sbin/bsmtp -h 211.155.251.234 -f \"\(Rhythm_backup备份报告\) %r\" -s \"Rhythm_backup: Intervention needed for %j\" %r"
mail = = all, !skipped
operator = = mount
console = all, !skipped, !saved
append = "/opt/Rhythm_backup/var/log/Rhythm_backup.log" = all, !skipped
append ="/opt/Rhythm_backup/var/log/Rhythm_backup_err.log" = error, warning, fatal
}
Messages {
Name = restore_messages #恢复用的messages
mailcommand = "/opt/Rhythm_backup/sbin/bsmtp -h 211.155.251.234 -f \"\(Rhythm_backup恢复报告\) %r\" -s \"恢复结果: %t %e of %c %l\" %r"
operatorcommand = "/opt/Rhythm_backup/sbin/bsmtp -h 211.155.251.234 -f \"\(Rhythm_backup恢复报告\) %r\" -s \"Rhythm_backup: Intervention needed for %j\" %r"
mail = = all, !skipped
operator = = mount
console = all, !skipped, !saved
append = "/opt/Rhythm_backup/var/log/Rhythm_backup.log" = all, !skipped
append ="/opt/Rhythm_backup/var/log/Rhythm_backup_err.log" = error, warning, fatal
}
参考资料:
http://man.chinaunix.net/network/bacula/bacula_manual/Messages_Resource.html


限制console利用tray-monitor获得director的状态信息
Console {
Name = backup_server-mon
Password = ""
CommandACL = status, .status
}
注:JobACL = “mail”,”ftp”定义多个job时用,分隔。没有这个console就不能访问Job资源其他可用访问的资源都是这样定义,如下ClientACL,StorageACL,ScheduleACL,PoolACL,FileSetACL,CatalogACL,CommandACL

4.5 配置SD(storage)
必须定义的资源:
  • Storage -- to define the name of the Storage daemon.
  • Director -- to define the Director's name and his access password.
  • Device -- to define the characteristics of your storage device (tape drive).
  • Messages -- to define where error and information messages are to be sent.
定义一个SD
Storage { # definition of myself
Name = storage_mail
SDAddress = 211.155.251.138 #如果在互联网上互相备份与恢复这里必须是公网ip
SDPort = 9103 # Director's port
WorkingDirectory = "/opt/Rhythm_backup/working"
Pid Directory = "/opt/Rhythm_backup/var"
Maximum Concurrent Jobs = 20
}

定义一个控制StorageDaemondirector
Director {
Name = backup_mail_server
Password = ""
}

定义一个监控端的director
Director {
Name = backup_server-mon
Password = ""
Monitor = yes
}

定义Device
Device {
Name = storage1 #
Drive Index = 0
Media Type = File #这里要保证每个SD有唯一的MediaType
Archive Device = /storage #一般写可移动的设备,如tapcddvd,这里是将备份的数据保存到/storage分区。备份前还得用bconsolelabel命令建立卷文件(保存备份的文件名)
AutomaticMount = yes; # when device opened, read it
AlwaysOpen = yes; #确保tap设备总是可用
RemovableMedia = yes; #是否支持可移动的设备,如tapcd
RandomAccess = no; #支持lseek工具的话,这里设置是否采用随机访问存储介质。
AutoChanger = yes #自动更换tap
Changer Device = /dev/sg0 #如果更换的话,更换到/dev/sg0设备上。
Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'" #tap磁带坏了的话提供的报警命令。
LabelMedia = yes; # lets Bacula label unlabeled media
}

定义一个SD用的messaged
Messages {
Name = messages_mail
director = backup_mail_server = all
}

4.6 配置FD(client)
必须定义的资源

  • Client -- to define what Clients are to be backed up.
  • Director -- to define the Director's name and its access password.
  • Messages -- to define where error and information messages are to be sent.

定义一个允许连接FD的控制端
Director {
Name = backup_mail_server
Password = ""
}

定义一个允许连接FD的监控端
Director {
Name = backup_server-mon
Password = ""
Monitor = yes
}

定义一个FD
FileDaemon { # this is me
Name = mail
FDAddress = 211.155.251.138 # define special FD ip
FDport = 9102 # where we listen for the director
WorkingDirectory = /opt/Rhythm_backup/working
Pid Directory = /opt/Rhythm_backup/var
Maximum Concurrent Jobs = 20
}

定义message
Messages {
Name = messages_mail
director = backup_mail_server = all, !skipped, !restored
}
好了,到此为止,一个完整的bacula运行环境已经搭建好了,下期我们将开始重点介绍Bacula程序服务器端和客户端图形界面安装和配置。


阅读(1344) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~