bacula 备份小技巧

简介:

 bacula 是个优秀的开源备份软件,支持各种客户端,将使用的经验分享如下:

 

1、为防止中间人攻击,尤其是在公网备份时,使用pwgen生成高强度的随机密码,通过ssl加密,客户端指定服务端地址,iptables防火墙做点对点信任;

 

2、给存储卷(volume)帖上标签,更容易识别;

1
Label Format =  "www-"

 

3、如果使用虚拟机做bacula,可以定期给虚拟机做快照,因为一旦bacula自己坏了,那就非常麻烦;


4、备份bacula的mysql库,mysql保存的是bacula-dir的核心数据内容,比如某年某月备份了XX服务器上的YYY,备份到了zzz存储卷上。这些信息在对于bacula还原非常关键。


5、文件校验不要使用sha1,那个非常耗费CPU,也可酌情使用md5校验或不做校验;

不建议使用gzip压缩,可酌情使用LZO压缩算法,牺牲一点CPU获得较为可观的数据压缩。


6、bconsole是控制服务端用的,不要跟客户端配在一起,在windows客户端上尤其要注意,它会默认安装bconsole;

 

7、每次bacula完成备份都会发邮件给root,可以根据需要填写成你的地址

Mail = root@localhost = all, !skipped

如果希望bacula只有在备份出错时才报警,那么将上面那行改为

1
MailOnError = root@localhost = all, !skipped

 

8、如果你使用了logwatch,logwatch可能没权限检查日志,那么bacula的日志地址可能要改一下将

append = "/var/spool/bacula/log" = all, !skipped

改为

1
append =  "/var/log/bacula.log"  = all, !skipped

 

9、做好备份计划,个人认为,默认的WeeklyCycle已经比较完美,结合了全备、差备和增备的优点,任何时候都可以快速的恢复源文件。


对于某些周期性的环境,比如月初和月末业务量比较大,由于完全备份比较耗时,我们不希望这个时间段进行完全备份。因此可以设计备份计划为如下:

1
2
3
4
5
6
7
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
}


或者

1
2
3
4
5
6
7
8
9
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有好几个让人眼花缭乱的参数用于淘汰过期的备份

1
2
3
4
比如,一个存储卷只使用一次,Maximum Volume Jobs =1 ;
比如,限制单个存储卷大小,Maximum Volume Bytes = 10G  ;
又如,设置存储卷的生命周期,Volume Retention = 60 days ;
再如,限制存储池的存储卷数量,Maximum Volumes = 120 ;


这些参数确实让人无所适从,个人觉得比较好的办法是这样的:


假设硬盘容量为10TB,每个存储卷为10G,我们把磁盘的90%用于存储备份,那么最多可以容纳900个存储卷,每当存储卷不够用时,会自动回收最老的存储卷。这样就能保证磁盘利用率永远不会高于90% 。

一个存储卷的容量不宜过大,建议设置成一次增量备份的大小,但也不宜过小,不小于1G

大文件的好处是顺序读写,速度快,节省IOPS。但是如果过大,备份无法及时淘汰。


记住,不要给每个每个客户端单独分一个存储池,不要给每次任务单独一个存储卷,这样容易会让容量规划失控。也就是说所有备份都放入默认的存储池。bacula已经把存储过程抽象化成了存储卷了,不再需要我们去单独触碰存储卷了,通常来说,不必担心一个目录下存储卷太多,除非你一个目录下有几千几万个存储卷。如果那样,你应该考虑其他存储方式了,比如分布式文件系统。


11、对于非常繁重的备份任务,需要在job中进行时间限制,避免在白天用户高峰期备份,影响性能。

JobDefs {
  ...
  Max Run Time = 12h
  ...
}

 

12、bacula默认不会跨文件系统备份,假设/data/log是一个单独的挂载点,bacula备份/data时,会跳过/data/log,使用onefs=no ,可以避免这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
FileSet {
     Name = "my-fileset"
     Include {
         Options {
             signature = MD5
             onefs = no
             compression = LZO
         }
         File = /etc
         File = /data
         File = /var/log
     }
}

 

 

13、如果使用高版本的rpm安装,bacula-dir 可能无法到mysql数据库,日志里却显示无法连接到postgresql,那是因为使用了错误的驱动,使用下面的命令解决。

1
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 文末加上一行

1
@| "sh -c 'for f in /etc/bacula/conf.d/*.cfg ;do echo @${f};done'"

这是一个shell,这个做法相当于

1
include  /etc/bacula/conf .d/*.cfg


15、如果硬盘容量规划失败,磁盘爆满,下面这个脚本可以救你,请根据需要修改,也可以搞个定时计划,每天或每周执行一次

1
2
3
4
5
6
7
8
9
#!/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跳过该文件夹的备份。

1
2
3
4
5
6
7
8
9
10
11
12
13
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客户端的某个目录创建标识文件

1
touch  /data/mysql/ .excludeme

加一点注释

1
echo  "Don't remove this file unless you really want to backup this directory."  > /data/mysql/ .excludeme

这种方法也相对灵活,但需要事先约定好。


18、理解bacula的增量备份

bacula的增量备份是根据文件时间戳来判断文件是否应该备份。对于大文件应该特别注意,比如日志文件。每天增加了几十万行内容很正常,日积月累很容易变成几十G。bacula每天备份都需要全部备份一遍,比如tomcat的catalina.out,再如nginx的access.log,一定要记得定期切割轮转。


19、使用nmap和配置文件模板,定时扫描并自动添加新的客户端

示例模板文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat /etc/bacula/host-template.conf 
Client {
     Name = 127.0.0.1-fd
     Address = 127.0.0.1
     FDPort = 9102
     Catalog = MyCatalog
     Password = "eeeeeeeeeee"
     File Retention = 90 days
     Job Retention = 3 months
     AutoPrune = yes
}
 
Job {
     Name    = "Backup-127.0.0.1"
     JobDefs = "my-backup-job"
     Enabled = yes
     FileSet = "my-fileset"
     Client  = 127.0.0.1-fd
}

自动发现脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  cat fd-autodiscovery.sh
#!/usr/bin/env bash
 
if [ ! -f /usr/bin/nmap ];then
   echo -e "\e[1;31mError: /usr/bin/nmap not found  \e[0m"
   exit 1
fi
 
template=/etc/bacula/host-template.conf
dir=/etc/bacula/conf.d
network=$1
really_restart_dir=no
 
if [ x$network == "x" ];then
   echo -e "\e[1;31mUsage: $0 [ip|ip-range|network] \e[0m"
   echo -e "\n"
   echo -e "example1: \e[1;32m $0 192.168.0.100 \e[0m"
   echo -e "example2: \e[1;32m $0 192.168.1-200 \e[0m"
   echo -e "example3: \e[1;32m $0 192.168.2.0/24 \e[0m"
   echo -e "\n"
   exit 0
fi
 
 
clients=`nmap -n -sS -p 9102 --open $network |awk '/Nmap scan report for/{print $5}'`
 
for host in $clients ;do
   if [ -f $dir/${host}.cfg ]; then
     :
   else
     echo "New bacula client found: $host "
     cp $template $dir/$host.cfg
     sed -i "s/127.0.0.1/$host/g" $dir/$host.cfg
     really_restart_dir=yes
   fi
done
 
if [ $really_restart_dir == "yes" ];then
   echo -e "restarting bacula-dir"
   systemctl restart bacula-dir
fi
 
exit 0



写的很杂,各位见谅,欢迎留言。










本文转自 紫色葡萄 51CTO博客,原文链接:http://blog.51cto.com/purplegrape/1168787,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
关系型数据库 API 数据库
盘点Flask与数据库的交互插件——Flask-Sqlalchemy
盘点Flask与数据库的交互插件——Flask-Sqlalchemy
585 0
|
5月前
|
Java Linux 编译器
linux安装 jdk-7u25-linux-x64.tar.gz 详细步骤(解压配置环境变量)
本文详细介绍了在 CentOS 7 上手动安装 JDK 7u25 的完整流程:从下载官方镜像包、解压至 `/usr/local/java`,到配置 `JAVA_HOME` 等环境变量,最后验证 `java -version` 与 `javac -version`。步骤清晰,含常见问题排查,适用于兼容旧项目的场景。(239字)
|
10月前
|
Oracle 关系型数据库 Linux
Oracle Linux 10.1 发布 - Oracle 提供支持 RHEL 兼容发行版
Oracle Linux 10.1 发布 - Oracle 提供支持 RHEL 兼容发行版
315 0
Oracle Linux 10.1 发布 - Oracle 提供支持 RHEL 兼容发行版
|
10月前
|
安全 Cloud Native 数据中心
Windows Server 2019 中文版、英文版下载 (2025 年 12 月更新)
Windows Server 2019 x64 Version 1809 (updated Dec 2025)
1124 0
Windows Server 2019 中文版、英文版下载 (2025 年 12 月更新)
|
11月前
|
Rust 算法 Linux
Rocky Linux 10.1 发布 - RHEL 100% 1:1 兼容免费发行版
Rocky Linux 10.1 发布 - RHEL 100% 1:1 兼容免费发行版
807 0
Rocky Linux 10.1 发布 - RHEL 100% 1:1 兼容免费发行版
|
人工智能 自然语言处理 JavaScript
CodeGeeX的开发者是谁?
【8月更文挑战第30天】CodeGeeX的开发者是谁?
998 10
|
11月前
|
人工智能 数据可视化 测试技术
Coze, Dify, N8N:三款主流AI工作流平台在测试中的应用对比
在敏捷开发背景下,Coze、Dify和n8n三大AI工作流平台正革新测试自动化。Coze零代码易上手,适合AI密集型任务;Dify支持私有化部署,适配企业级复杂流程;n8n开源可控,擅长系统集成。三者各有优势,助力测试团队实现高效人机协同,提升测试效能。
|
域名解析 存储 缓存
计算机网络选择题填空题判断题整理
计算机网络选择题填空题判断题整理
计算机网络选择题填空题判断题整理
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
存储 关系型数据库 分布式数据库
【赵渝强老师】基于PostgreSQL的分布式数据库:Citus
Citus 是基于 PostgreSQL 的开源分布式数据库,采用 shared nothing 架构,具备良好的扩展性。它以插件形式集成,部署简单,适用于处理大规模数据和高并发场景。本文介绍了 Citus 的基础概念、安装配置步骤及其在单机环境下的集群搭建方法。
1130 2

热门文章

最新文章