我在不同的服务器上有多个相同应用程序的环境。目录结构非常相似,所以我想对所有目录使用一个文件集。例如:
- server1: /opt/env1/app/logs
- server1: /opt/env1/app/bin
- server1: /opt/env1/app/temp
- server1: /opt/env1/app/lib
- server2: /opt/env2/app/logs
- server2: /opt/env2/app/bin
- server2: /opt/env2/app/temp
- server2: /opt/env2/app/lib
- server2: /opt/env3/app/logs
- server2: /opt/env3/app/bin
- server2: /opt/env3/app/temp
- server2: /opt/env3/app/lib
我想要类似的东西:
FileSet {
Name = "APP"
Include {
Options {
signature = MD5
Compression = GZIP
}
File = "/opt/${env}/app"
}
Exclude {
File = "/opt/${env}/app/logs"
File = "/opt/${env}/app/temp"
}
}
然后:
Job {
Name = "JOBENV1"
#somehow set env variable as env1
FileSet="APP"
...
}
Job {
Name = "JOBENV2"
#somehow set env variable as env2
FileSet="APP"
...
}
Job {
Name = "JOBENV3"
#somehow set env variable as env3
FileSet="APP"
...
}
使用解决方案几天后,它似乎在工作,所以这里是:
举个例子,假设我们有以下工作:
然后假设 --job 作为约定,文件集应该如下所示:
有关文件集中命令执行的更多信息,请参阅文档
完整和增量备份运行正常。
我不相信你能做到这一点 - Bacula 的配置文件是配置文件,而不是编程语言或 shell。
您的实际选择是:
在每台机器上使用相同的目录结构
从 Bacula 的角度来看,这是最实用的解决方案。它需要在 Bacula 配置文件中进行最少的额外工作,如果您的应用程序是“相同的”,那么它最有意义。
每台机器使用一个文件集
这比选项 (1) 更烦人,因为您现在要维护一堆几乎相同的文件集。如果您使用其他可以自动创建文件集的进程生成 Bacula 配置,这是最实用的。
使用一个列出所有目录的文件集
这行得通,但是任何时候添加一台新机器(因此添加一个新
env#
目录)时,您都将更改全局文件集并触发完整备份。使用
ClientRunBeforeJob
指令将文件放在统一位置这有点脏,但它有效——在 Bacula
rsync
进行备份之前将应用程序环境转移到另一个位置。(如果你在 Linux 系统上,你也可以mount --bind
将应用程序放在一个统一的位置而不影响其他任何东西。)这种方法的主要缺点是你的存储需求加倍:你有应用程序的运行生产副本,并且Bacula 制作的卷影副本以进行备份。