技术分享
Bacula 实战:从部署到使用
2021-06-29
Bacula 是一款开源的跨平台网络备份工具,它提供了基于企业级的客户端/服务器的备份恢复解决方案。通过它,系统管理人员可以对数据进行备份、恢复,以及完整性验证等操作。同时,它还提供了许多高级存储管理功能,使系统管理人员能够很容易发现并恢复丢失的或已经损坏的文件。正因为如此,Bacula 也被誉为最好的开源企业级备份工具。
本Chat将会带来:
Bacula 总体结构概览。
在 Centos 部署安装 Bacula。
Bacula-Gui(Baculum)安装部署。
实战:Bacula 跨平台(Windows,Linux)备份配置。
Bacula 配置和使用中要注意的坑。
Bacula
是一款开源的跨平台网络备份工具,它提供了基于企业级的客户端/服务器的备份恢复解决方案。通过它,系统管理人员可以对数据进行备份、恢复,以及完整性验证等操作。同时,它还提供了许多高级存储管理功能,使系统管理人员能够很容易发现并恢复丢失的或已经损坏的文件。
正因为如此,Bacula 也被誉为最好的开源企业级备份工具。
Overview
Bacula 由 5 个主要服务构成:Director,Console,File,Storage,and Monitor services。
废话少说,先上一张官网上的结构图
Director
Dir 是 Bacula 的核心,也是整个系统的中心节点,负责管理所有的备份、恢复、验证、归档作业。系统管理员可以使用 Bacula Director 制定备份计划。Director 作为一个服务运行在后台。
Console
管理控制台,用户可以通过这个控制台连接到 Director Daemon 进行管理备份与恢复操作,有三种管理方式:console、 QT 编写的界面和 wxWidgets 的图形界面。
第一种:最易用的 console,大多数系统管理员会发现它完全能满足需求。
第二种:GNOME 图形界面,一个半吊子产品,还没开发完,但是包含了大部分口控制台提供的功能。
第三种:wxWidget GUI,提供交互式的文件恢复。它也包含了 console 的大部分功能,并且实现了tab键自动补全命令,智能提示。(在没有 gui 的 linux,后两种都是扯淡,不过可以在 windows 安装连接到远程 director)
Database-server
(catalog,它不在官方介绍的五大部件里,但是我觉得有必要介绍一下)
恢复目录包括用于维护所有备份文件索引的程序和数据库,它可以使管理员或用户快速定位和恢复受损的文件。恢复目录的引入使得 Bacula 和简单备份程序(tar,bru)区别开来,因为恢复目录维护了一个所有使用卷的记录,所有的计划任务,目标文件,提供高效的还原管理。
catalog支持三种数据库,MysqlSql、PostgreSQL 和 SQLite,前两种必须在编译时指定,推荐使用前两种因为 SQLite 功能太少,性能太差。
File(client)
安装在需要备份数据的机器上的客户端软件。它运行在特定的操作系统上,并且为 director 备份提供可靠的数据和文件信息,client 也负责在目标机器上执行恢复操作。fd 作为一个后台服务运行在 linux 机器上,同样也有 windows 版本。
Storage
sd 是一组程序,负责实际读写存储介质。
Monitor services
(我倒不觉得它是重要部件之一)linux gnome/kde 桌面程序,进程监控端,负责监控 Director Daemon、Storage Daemon 和 File Daemon 的守护进程。
(可有可无,没装图形界面的 linux 安装不了,推荐使用 web 端的监控)
下面我们从一个备份作业理解一下上面这张图,一个作业可以是手动从 console 发起的,也可以是在 dir 的配置文件中配置的 job 自动发起的。
当 dir 收到一个 job 后,会将具体的指令发送给 File server,接下来的文件传输则不再经过 dir,而是由 File server 直接传向 storage。
Installation & Deployment
为什么要用这么大篇幅说安装和部署呢?相信我们都有过这种痛苦的经历,在上手一个新东西的时候,花大量的时间在环境搭建上。
Bacula 可以安装部署在 Linux、Windows 或者是 Mac,这里我们以 Centos6 为例。
准备工作
源码
需要下载两个包,Source Files 是即将用到的,GUI 稍后会用到。
C 和 C++ 编译器
yum install -y gcc gcc-c++
MySQL,我们需要准备一个 MySQ L数据库,如果没有需要另行安装一下,本次的重点不在这里就不过多介绍。
因为要使用 MySQL 作为 database server,所以还需要安装 mysql-devel。
下面进入正题——安装
源码解压后进入到源码所在目录编译、安装。官方文档中的安装引导页,我们略过直接上干货,其实只需要一个命令参数就可以
./configure --with-mysql
make && make install
安装结束后可以到
/etc/bacula
目录下验证一下,可以看到在这里建立了好多文件。建立数据库和数据表,我们假设已经存在一个 MySQL 数据库在 mysql.dev 上,在
/etc/bacula/
下找到这两个脚本:create_bacula_database make_bacula_tables
./create_bacula_database -ubacula -pbacula -h mysql.dev -P 3306
./make_bacula_tables -ubacula -pbacula -h mysql.dev -P 3306
执行成功后会出现这样的提示:Creation of bacula database succeeded.Creation of Bacula MySQL tables succeeded.
到这其实我们已经可以算安装完成了,为了验证一下安装是否正确,再简单配置一下。Bacula 安装完会在
/etc/bacula/
目录下默认建立全套的配置文件示例,就算什么也不配置,用它也是可以启动的。在 bacula-dir.conf 中找到 Catalog 配置,具体配置什么你懂的,就像这样dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula";DB Address = "mysql.dev";DB Port = "3306"
启动它,走起:
看一下状态
也可以用 bconsole 看一下
Baculum
Baculum 是基于 Baculum-API 的 Bacula Web。 GUI,有了它,一些简单的和一次性的作业就可以在 web 页面上直接操作,所见即所得,省去了使用 bconsole 命令行的麻烦(这些命令可能也记不住...)。 看文档,我觉得这是使用任何工具的前提。
准备工作
Apache。
PHP5.3.4 以上,我选择安装的是 5.6,这里有一个 rpm 源地址,省去了源码安装的繁琐。
PHP 模块要求,说的很清楚,照着安装就好,再不济缺什么装什么呗。
这是我安装的模块
yum install -y php56w php56w-bcmath php56w-common php56w-devel php56w-gd php56w-mbstring php56w-mysqlnd php56w-xml mysql mysql-devel
源码,在上一部分里提到过,对就是它,如果你感兴趣可以查查 Baculum 的含义,哈哈哈!!!
部署 Baculum 的机器上要有 bconsole(懂了吧,它也是在操作 bconsole)
Baculum-API
解压 Bacula-gui,文件夹中的 INSTALL 文件是一个帮助文档,
make DESTDIR=/var/www/html/baculum
,执行这条命令把 bacula-api 和 bacula-web 释放到 /var/www/html/baculum/ 下。接下来配置下 Baculum-api 和 Baculum-web 两个站点到 /var/www/html/baculum/etc/httpd/conf.d/ 文件夹下,有两个配置文件,一个是 bacula-api 站点的配置,一个是 bacula-web 站点的配置,包含到 apache 的配置文件里。
注意配置文件中的路径,修改成你自己 bacula - gui 的真实路径
在
/var/www/html/baculum/etc/baculum/Config-api-apache/
下,找到baculum.users
,复制到/var/www/html/baculum/usr/share/baculum/htdocs/protected/API/Config/
下;到
/var/www/html/baculum/etc/baculum/Config-web-apache/
下,找到baculum.users
,复制到/var/www/html/baculum/usr/share/baculum/htdocs/protected/Web/Config/
下;
注意权限问题,这两个文件需要权限
重启 apache,首先配置 baculum - API,打开 9096 端口页面,提示输入用户名和密码,这两个用户文件的用户名密码都是 admin,接下来按照提示一步步输入即可,每一步都有 test 哪里有问题会提示,按照提示解决。需要注意的地方是配置 bconsole,让 apache 运行的用户可以执行 bconsole 命令,在 /etc/sudoers.d/ 添加一个 baculum 文件,内容如下:
Defaults:apache !requirettyapache ALL=NOPASSWD: /sbin/bconsoleapache ALL=NOPASSWD: /sbin/bdirjsonapache ALL=NOPASSWD: /sbin/bsdjsonapache ALL=NOPASSWD: /sbin/bfdjsonapache ALL=NOPASSWD: /sbin/bbconsjson
注意用户和路径要根据实际安装情况修改
Baculum - web
没什么说的,访问 9095 端口,记住上一步 Bacula-api 的用户名密码,按照提示一路下一步即可。如果看到了下面的界面,恭喜大功告成!
配置
Bacula 的配置往往让新手不知所措,改了好多却依然不好用,所以我们有必要梳理一下各个部分我们都需要配置些什么。有很多小伙伴不喜欢看文档,或者看到英文文档就直接略过,我觉得这不是个好的习惯,作为一个程序猿,英语还是多少要学一点。有了这张图是不是清晰很多。
fd 配置
Director { Name = bacula.dev-dir #注意这里,要写上dir的name Password = "+lDzc0vGYfhQt9P0Q3J+FsXP+GaYlvyjAoFz/o38H83U" #不要太在意这么长的密码,自动生成的。。。 #这个密码要记住,配置dir里client的时候要和这个一致,否则dir连接不上client}FileDaemon { Name = bacula.dev-fd FDport = 9102 WorkingDirectory = /opt/bacula/working Pid Directory = /var/run Maximum Concurrent Jobs = 20 Plugin Directory = /usr/lib64}Messages { Name = Standard director = bacula.dev-dir = all, !skipped, !restored}
sd 配置
#这是一个最简单的配置,直接将归档写到本地文件夹中。Bacula支持的Device还有很多种(如磁带),也支持从sd到sd的复制,具体用到的时候可以到文档中查看。Storage { Name = bacula.dev-sd SDPort = 9103 WorkingDirectory = "/opt/bacula/working" Pid Directory = "/var/run" Plugin Directory = "/usr/lib64" Maximum Concurrent Jobs = 20}Director { Name = bacula.dev-dir #注意这里,要写上dir的name Password = "yrEaxD7O3LNeCStufxt7tWWvKuWXNs2KPpKMdh+ohHFq" #这个密码要记住,配置dir里storage的时候要和这个一致}Device { Name = "hdd_storage" Media Type = File Archive Device = /var/bacula_backup #sd写入文件的位置 LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; Maximum Concurrent Jobs = 5}Messages { Name = Standard director = bacula.dev-dir = all}
dir 配置
Director { Name = bacula.dev-dir DIRport = 9101 QueryFile = "/etc/bacula/query.sql" WorkingDirectory = "/opt/bacula/working" PidDirectory = "/var/run" Maximum Concurrent Jobs = 20 Password = "ZIXaEJfNiYhM3Y59arWnMePalh9kIkOHPFKCRywWfXMf" #这个password要和bconsole配置文件里的一致 Messages = Daemon}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}Schedule { Name = "WeeklyCycleAfterBackup" Run = Full sun-sat at 23:10}Storage { Name = "hdd_storage" Address = bacula.dev #这里要填局域网内可以访问的ip,不可以填类似127.0.0.1或localhost SDPort = 9103 Password = "yrEaxD7O3LNeCStufxt7tWWvKuWXNs2KPpKMdh+ohHFq" #与SD配置中一致 Device = "hdd_storage" #SD配置中Device的name Media Type = File Maximum Concurrent Jobs = 10}Catalog { Name = MyCatalog dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula"; DB Address = "mysql.dev"; DB Port = "3306"}Messages { Name = Daemon mailcommand = "/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r" mail = root@localhost = all, !skipped console = all, !skipped, !saved append = "/opt/bacula/log/bacula.log" = all, !skipped}Messages { Name = webhook mailcommand = "python /var/shell/webhook.py #这个mailcommand不只是可以发邮件,其实它可以执行任何脚本,这就给了我们很大自由度,参数详见文档 mail = root@localhost = all, !skipped console = all, !skipped, !saved append = "/opt/bacula/log/bacula.log" = all, !skipped catalog = all}Pool { Name = File Pool Type = Backup Recycle = yes # Bacula can automatically recycle Volumes AutoPrune = yes # Prune expired volumes Volume Retention = 90 days # one year Maximum Volume Bytes = 10G # Limit Volume size to something reasonable Maximum Volumes = 100 # Limit number of Volumes in Pool Label Format = "Vol-" # Auto label}Client { Name = bacula.dev-fd #FD配置中的name Address = bacula.dev FDPort = 9102 Catalog = MyCatalog Password = "wbVV1z7mv+/KEuMUOIuHnWVgzPHzJWuW4Nvo/07uxgN7" #这个密码要和FD配置中的一致 File Retention = 60 days # 60 days Job Retention = 6 months # six months AutoPrune = yes # Prune expired Jobs/Files}FileSet { Name = "apachewebsite" Include { Options { signature = MD5 compression = LZO noatime = yes sparse = yes } File = /var/www/html/ } Exclude { File = /var/www/html/log/ ...... }}Job { Name = "apachewebsite" Type = Backup Level = Incremental Client = bacula.dev-fd # FileSet = "apachewebsite" #fileset的name Schedule = "WeeklyCycle" Storage = hdd_storage #dir中Storage的name而不是SD配置里的name Messages = webhook #这样就可以实现任务消息自定义 Pool = File SpoolAttributes = yes Priority = 10} #@|"sh -c 'for f in /etc/bacula/conf.d/*.conf ; do echo @${f} ; done'" #注意这段,所有配置都写在一个conf中显然太长不易阅读,可以用这种方式include配置文件
FAQ
配置中各个部分的 name、ip 地址和密码一定要对应好,分布式应用往往是网状结构的,这里一定自己理清头绪。所以在命名的时候尽量有一定的命名规则,例如使用主机名作为前缀。
如果 DIR 和 SD 在同一台机器上,配置 Dir 的 Storage 段时一定注意,不可以使用 localhost 或者 127.0.0.1 这样的本机地址,因为这个地址会被发送到 FD 用于 FD 直接与 SD 通信。
DIR 中 Message 段的配置不只是可以用于发邮件,也可以调用任何脚本使用 webhook 推送通知。
Bacula 的开发人员比较偷懒,配置文件没有类似 include 的语法,但是观法给出了替代方案。比如在 DIR 的配置文件中加入一句代码
@|"sh -c 'for f in /etc/bacula/conf.d/*.conf ; do echo @${f} ; done'"
,就可以实现 include。如果有 windows 需要备份,所有在 windows 中的路径中不可以用反斜杠(\),要使用一个正斜杠(/),windows 端的 FD 安装也很简单,官方已经贴心的做成了安装包。
其实 Bacula 的文档已经很全面了,如果你足够有耐心把它看完,大部分我们需要的内容都可以在官方的文档中找到。

- 标签:
-
其他