bacula 是个优秀的开源备份软件,支持各种客户端,将使用的经验分享如下:
1、为防止中间人攻击,尤其是在公网备份时,使用pwgen生成高强度的随机密码,通过ssl加密,客户端指定服务端地址,iptables防火墙做点对点信任;
2、给存储卷(volume)帖上标签,更容易识别;
Label Format = "www-"
3、除非任务非常繁重,建议使用虚拟机专门做bacula,然后挂载实体存储,定期给虚拟机做快照,因为一旦bacula自己坏了,那就非常麻烦,但这种情况通常不会,视各人的人品而定;
4、备份bacula的mysql库,mysql保存的是源文件的索引,这个非常关键;
5、文件校验不要使用sha1,那个非常耗费CPU,也可酌情使用md5校验或不做校验;
6、bconsole是控制服务端用的,不要跟客户端配在一起,在windows客户端上尤其要注意,它会默认安装bconsole;
7、每次bacula完成备份都会发邮件给root,可以根据需要填写成你的地址
Mail = root@localhost = all, !skipped
如果希望bacula只有在备份出错时才报警,那么将上面那行改为
MailOnError = root@localhost = all, !skipped
8、如果你使用了logwatch,logwatch可能没权限检查日志,那么bacula的日志地址可能要改一下将
append = "/var/spool/bacula/log" = all, !skipped
改为
append = "/var/log/bacula.log" = all, !skipped
9、做好备份计划,个人认为,默认的WeeklyCycle已经比较完美,结合了全备、差备和增备的优点,任何时候都可以快速的恢复源文件。
对于某些周期性的环境,比如月初和月末业务量比较大,由于完全备份比较耗时,我们不希望这个时间段进行完全备份。因此可以设计备份计划为如下:
Schedule { Name = "WeeklyCycle" Run = Differential 1st sat at 2:05 Run = Full 2nd sat at 2:05 Run = Differential 3rd-4th sat at 2:05 Run = Incremental sun-fri at 2:05 }
或者
Schedule { Name = "monthly" Run = Differential on 1 at 2:05 Run = Incremental on 2-10 at 2:05 Run = Full on 11 at 2:05 Run = Incremental on 12-20 at 2:05 Run = Differential on 21 at 2:05 Run = Incremental on 22-31 at 2:05 }
10、做好容量管理
bacula有好几个让人眼花缭乱的参数用于淘汰过期的备份
比如,一个存储卷只使用一次,Maximum Volume Jobs =1 ; 比如,限制单个存储卷大小,Maximum Volume Bytes = 50G ; 又如,设置存储卷的生命周期,Volume Retention = 60 days ; 再如,限制存储池的存储卷数量,Maximum Volumes = 120 ;
这些参数确实让人无所适从,个人觉得比较好的办法是这样的:
假设硬盘容量为10TB,每个存储卷为10G,我们把磁盘的90%用于存储备份,那么最多可以容纳900个存储卷,每当存储卷不够用时,会自动回收最老的存储卷。这样就能保证磁盘利用率永远不会高于90% 。
记住,不要给每个每个客户端单独分一个存储池,不要给每次任务单独一个存储卷,这样容易会让容量规划失控。也就是说所有备份都放入默认的存储池。bacula已经把存储过程抽象化成了存储卷了,不再需要我们去单独触碰存储卷了,通常来说,不必担心一个目录下存储卷太多,除非你一个目录下有几千几万个存储卷。如果那样,你应该考虑其他存储方式了,比如分布式文件系统。
11、对于非常繁重的备份任务,需要在job中延长时间限制,以免任务被中断
Max Run Time = 1d
12、熟悉命令行,对于bacula操作很有帮助,简单列举一些
#查询类 show filesets show messages show jobs show clients show devices show directors show pools show storages show all list pools list volumes list jobs list jobtotals llist jobs llist joblog jobid=25 llist pools #创建存储池 create #运行任务 run #还原备份 restore
13、如果使用高版本的rpm安装,bacula-dir 可能无法到mysql数据库,日志里却显示无法连接到postgresql,那是因为使用了错误的驱动,使用下面的命令解决。
alternatives --set libbaccats.so /usr/lib64/libbaccats-mysql.so
详见 https://www.centos.org/forums/viewtopic.php?f=48&t=47735
14、在bacula客户端较多的情况下,服务端主配置文件动不动几百上千行,难以维护。
bacula 开发团队比较懒,配置文件语法不支持include,但是可以用另类办法实现,在bacula-dir.conf 文末加上一行
@|"sh -c 'for f in /etc/bacula/conf.d/*.cfg ;do echo @${f};done'"
这是一个shell,这个做法相当于
include /etc/bacula/conf.d/*.cfg
15、如果硬盘容量规划失败,磁盘爆满,下面这个脚本可以救你,请根据需要修改,也可以搞个定时计划,每天或每周执行一次
#!/usr/bin/env bash /usr/sbin/bconsole >/dev/null << EOF @output /dev/null prune expired volume yes truncate expired volume pool=File storage=File1 yes truncate expired volume pool=File storage=File2 yes @quit EOF
16、备份思路问题
在机器数量较少的情况下,对于备份任务,我们常常想到的问题是:“我要备份哪些东西?”,解决方法通常是加法,将需要备份的目录逐个列出来然后执行备份。
在机器数量变得庞大的时候,由于系统管理员的数量也会增加,并且系统管理员们也面临分工协作,或分管网络,或操作系统,或安全,或数据库,或具体业务。这种情况下,加法会面临困境,负责备份的管理员不知道每台机器具体需要备份哪些目录,并且逐个维护每台机器的具体备份路径也十分吃力,也容易失误,遗漏关键备份内容。
这个时候的解决办法,应该是回答问题“我不需要备份哪些东西?”,即减法。将不需要备份的目录列出来,然后统统执行备份,在部署业务时,只需主动规避上述目录即可。这个办法还可以解决一些历史遗留问题,即所有人都对机器上的业务没有完整认识。
17、另一种思路
如果你使用的是baucla 7.x的版本,该版本有个新功能Exclude Dir Containing,可以通过在文件夹里创建一个标识,让bacula跳过该文件夹的备份。
FileSet { Name = "192.168.1.23-fileset" Include { Options { signature = MD5 compression = LZO } File = /etc File = /var/log File = /data Exclude Dir Containing = .excludeme } }
然后在bacula客户端的某个目录创建标识文件
touch /data/mysql/.excludeme
加一点注释
echo "Don't remove this file unless you really want to backup this directory." >/data/mysql/.excludeme
这种方法也相对灵活,但需要事先约定好。
写的很杂,各位见谅,欢迎留言。