创建一个坚固的备份系统

在Foreach,我们拥有Synology RS815 +来存储所有备份。 这些备份来自我们网络中的不同来源,例如路由器,交换机,数据库服务器,Web服务器,应用程序日志文件,邮件服务器等等。

Synology NAS使配置这些备份的文件共享和配额变得非常容易。 但是,它缺少一些功能:

  • 监视文件共享上的配额(硬配额以及没有配额的文件共享)。
  • 删除由保留策略预定义的过时备份文件。
  • 验证备份文件,以确保我们实际收到了备份文件。

在此博客文章中,我们将概述如何设置一个Spring Boot 2应用程序,该应用程序公开一个GUI,并可以使用(例如)Zabbix进行监视。

哦,备份,您在哪里?

您可能会认识到以下问题:

您需要还原备份并仅转到备份位置以查看备份文件不存在。 您开始四处寻找,发现备份从未到达您的NAS,因为超出了共享文件夹的配额。 或更糟糕的是,您的整个NAS实际上已满。 该死的! 我们应该清理3年前的备份文件!

如果神灵对您有好处,您实际上会找到备份文件,但是该文件可能已过时或过旧而无法还原。 您所需的数据最多需要几天,而不是三周前。 达尼特! 我们应该检查备份任务是否真的有效!

尤里卡!

为了解决这个问题,我们创建了一个Spring Boot 2.0应用程序,该应用程序具有多个角色:

  • 它公开了一个基于Bootstrap的GUI(可以对我们(是)读取)和一个监视平台(在我们的情况下为Zabbix)。
  • 它监视Synology中配置的所有文件共享,并在接近配额限制时向我们发出警告。
  • 它根据保留策略从文件共享中删除旧的备份文件。
  • 它会验证备份文件并确保文件足够新,并且有一定数量的历史记录可用。

最终结果如下所示:

高级设置

我们使用Spring Initialzr用Java 8和Spring Boot 2.0生成了一个Maven项目。 Thymeleaf 3和Bootstrap 3用于创建概述页面。

使用jquery / bootstrap webjar,我们能够在短短几分钟内设置一个Controller和原型布局。

Global status: OK是由Zabbix监视的必需字符串。 如果任何基础状态失败,则全局状态也将失败。

我们使用Spring Boot胖子在自己的文件共享中部署了应用程序(您不希望应用程序日志文件填充其他备份文件共享,对吗?)。 要创建可执行jar,请将以下内容添加到pom.xml 。 请参阅文档以获取更多信息。

<build><finalName>checkback</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable></configuration></plugin></plugins>
</build>

Synology NAS并未真正提供标准的System V环境。 为了利用嵌入在可执行jar中的启动/停止脚本,我去阅读了嵌入式启动脚本的实际工作方式。 您可以在GitHub上找到它。

这里的重点是:

# Follow symlinks to find the real jar and detect init.d script
cd "$(dirname "$0")" || exit 1
[ [ -z "$jarfile" ] ] && jarfile=$(pwd)/$(basename "$0")
while [ [ -L "$jarfile" ] ]; doif [ [ "$jarfile" =~ init\.d ] ]; theninit_script=$(basename "$jarfile")elseconfigfile="${jarfile%.*}.conf"# shellcheck source=/dev/null[ [ -r ${configfile} ] ] && source "${configfile}"fijarfile=$(readlink "$jarfile")cd "$(dirname "$jarfile")" || exit 1jarfile=$(pwd)/$(basename "$jarfile")
done

基本上,它检查.jar文件所在的位置。 如果.jar文件实际上位于一个名为“init.d中”目录(位置并不一定是/etc/init.d中),它将作为启动/停止脚本来处理。 您只需要在某个地方创建一个init.d目录,并创建一个从开始/停止脚本到可执行jar的符号链接。

在我们的环境中,我们最终为应用程序提供了以下结构:

/volume1/checkback (此应用程序的文件共享)

/volume1/checkback/checkback.jar Boot可执行jar)

/volume1/checkback/checkback.conf Boot应用程序配置文件)

/volume1/checkback/init.d/checkback.sh (到/volume1/checkback/checkback.jar的符号链接)

有了这个,我们可以启动/停止并查看我们的Spring Boot应用程序的状态。 还可以在Synology NAS中创建启动触发器,这样,只要您的Synology重新启动其补丁程序,您的应用程序就会启动。

user@synology:/volume1/checkback/init.d$ ./checkback.sh status
Running [18657]
user@synology:/volume1/checkback/init.d$

checkback.conf文件包含我们的生产配置文件的位置,并且还指定了日志文件夹(而不是默认的/ var / log位置)

bash-4.3# cat checkback.conf
RUN_ARGS="--spring.config.location=/volume1/checkback/synology-config.yml"
LOG_FOLDER="/volume1/checkback"
bash-4.3#

现在我们已经建立并运行了结构,我们可以开始编码测试了。 每当我开发应用程序时,我都希望它具有一些测试数据或生产数据的快照。 为此,您可以阅读有关模拟用于JUnit测试的Synology数据的博客 。

现在,让我们开始编码。 我们的应用程序使用YAML文件来定义要检查配额的文件夹以及需要验证的备份集。 它们由Spring映射到@ConfigurationProperties 。 配置看起来像这样:

checkback:cron: '0 0 10 * * *'slack.channel: '#infra'quota-configs:- path: /volume1excludePattern: '^@.*'backup-set-configs:- name: Mikrotik Backupsuri: /volume1/backupftp/mikrotik_backuptype: DISKfile-set:- name: fe-prodnet01 exportfilterPattern: '.*fe-prodnet01-.*\.rsc'- name: fe-prodnet11 backupfilterPattern: '.*fe-prodnet11.*\.backup'- name: Exchange Backupsuri: /volume1/pex/backupstype: DISKfile-set:- name: Exchange pstsfilterPattern: '.*\.pst'groupByPattern: '.*\/backups\/(\d{4}-\d{2}-\d{2})\/'groupByPatternHasDatePattern: 'yyyy-MM-dd'deletePolicy:deleteEmptyDirectories: true

如您所见,我们每天10:00更新状态,这由YAML中的cron条目定义。 如果有任何警告,我们也会将其发布到我们的Slack频道。 为此,我们使用jSlack ,但还有许多其他选择。

检查配额

为了检查配额,我们定义了检查配额的路径。 默认情况下,我们排除以“ @”开头的目录,它们是Synology特定的目录。

quota-configs:- path: /volume1excludePattern: '^@.*'

在Synology上,您可以为特定文件共享指定配额。 我们称这些硬配额。 如果您未设置配额(或忘记设置配额),则默认设置为20GB; 这就是我们所说的软配额。

要检查Synology的配额,可以使用btrfs命令:

bash-4.3# /sbin/btrfs qgroup show -f /volume1/share -f -r --raw
WARNING: Qgroup data inconsistent, rescan recommended
qgroupid       rfer      excl   max_rfer
--------       ----      ----   --------
0/1931   2559573532672         0 4398046511104

这种方法有一个问题:

  • 从警告中可以看到, btrfs根据时间表计算当前使用量,并且数据不一致。 要获得准确的近实时值,您将必须执行brtfs quota rescan <path> ,等待其完成,然后在rfer字段中获取估计的大小。

由于brtfs的计算不一致,因此我们的应用程序将按目录执行命令,并且仅考虑max_rfer 。 如果max_rfer等于none ,则未设置配额,默认值为20GB。

以下一段Java代码执行此命令并解析输出。

ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("/sbin/btrfs", "qgroup", "show", "-f", f.toString(), "-r", "--raw");
String MAX_RFER = "";LOG.info("executing command: " + f.toString());
try (InputStreamReader inputStreamReader = new InputStreamReader(processBuilder.start().getInputStream())) {
try (LineNumberReader reader = new LineNumberReader(inputStreamReader)) {String line;while ((line = reader.readLine()) != null) {LOG.info(reader.getLineNumber() + " : " + line);if (reader.getLineNumber() == 3) {MAX_RFER = line.split("\\s+")[3];break;}}
}
} catch (IOException ignore) {
LOG.error("Exception getting quota from btrfs command", ignore);
}
try {return Long.parseLong(MAX_RFER);
} catch (NumberFormatException ignore) {return 0;
}

现在我们有了配额限制,我们只需要计算目录的大小即可。 而不是依靠brtfsdu ,我们只是让Java NIO来完成这项工作。

AtomicLong totalSize = new AtomicLong();
Files.walkFileTree(f, new SimpleFileVisitor<Path>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {totalSize.addAndGet(Files.size(file));return FileVisitResult.CONTINUE;}
});quotaStatus.used(totalSize.get());

剩下要做的就是计算剩余的百分比并将其显示在Bootstrap进度栏中 。

可以使用Apache Commons FileUtils的byteCountToDisplaySize来格式化字节,以使它们可以被人类读取 。 但是,此方法具有以不一致的方式四舍五入值的不好的感觉。

作为替代方案,我们使用字节单位 ,并通过以下方式使用它来获得非常可选的两点十进制值:

public class FileSizeUtil {public static String readableFileSize(long size) {return BinaryByteUnit.format(size,"#,##0.##");}
}

如果您认为我们已经完成了,那么您会忘记一个警告。 要在应用程序内部执行brtfs命令,您必须是root用户。 幸运的是,此应用程序位于我们的内部网络上,这样做的风险是有限的。

如果您的Synology与互联网建立公共连接,请不要以root用户身份运行应用程序。

要运行Spring启动应用程序的根,刚chown文件为 。 Spring Boot将为您完成其余工作,因为它始终在拥有jar文件的用户下运行应用程序。

bash-4.3# chown root:root checkback.jar

你完成了! 我们都准备检查配额。

下周再回来查看有关如何监视备份集的摘要。

翻译自: https://www.javacodegeeks.com/2018/05/creating-a-sturdy-backup-system.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

班级网站-前端网页技术精美完整源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;班级网站 获取完整源码&#xff08;打开即可用&#xff09; 效果图①首页主页 效果图②关于页面 效果图③联系方式及留言 效果图④我们的画廊展示 其余及源码详见微信公众号下载&#xff01; <!DOCTYPE html> <html…

医药协会网站-前端网页技术设计HTML+CSS精美完整网页网站源码

微信公众号&#xff1a;创享日记 发送&#xff1a;医药协会网站 获取完整源码 效果图预览①主页首页 效果图预览②资源下载中心 效果图预览③登录/注册 效果图预览④文章资讯详情 效果图预览⑤文章资讯列表 效果图预览⑥留言板 效果图预览⑦图文列表 效果图预览⑧图文详情 源码…

数字通信系统仿真的MATLAB实现(QPSK)

关注公号【逆向通信猿】更精彩!!! 仿真结果 本文以QPSK为调制体制进行仿真,以下结果为比特信噪比Eb/N0=10dB(此时符号信噪比Es/N0=13dB,SNR信噪比=3.98dB,换算关系在代码中为第44行)时的各步骤结果图

动漫网站-前端网页技术精美网站源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;动漫网站 获取完整源码&#xff08;打开即可用&#xff09; 效果图①主页首页 效果图②作品列表展示页 效果图③作品详情展示页 效果图④联系我们 效果图⑤博客列表 效果图⑥博客详情 效果图⑦其它 其它及源码详见微信公众号下…

【2021.02.09更新】数学常用基本公式

泰勒级数 条件不多说了&#xff0c;函数f(x)f(x)f(x)在点xx0x {x_0}xx0​出展开为 f(x0)f′(x0)(x−x0)f′′(x0)2!(x−x0)2⋯f(n)(x0)n!(x−x0)n⋯f({x_0}) f({x_0})(x - {x_0}) \frac{{f({x_0})}}{{2!}}{(x - {x_0})^2} \cdots \frac{{{f^{(n)}}({x_0})}}{{n!}}{(x - {…

服装商城电商-前端网页技术精美完整源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;服装电商 获取完整源码&#xff08;打开即可用&#xff09; 效果①主页首页 效果②登录页 效果③注册页 效果④结算结账页 效果⑤联系页 效果⑥找不到资源页 效果⑦商品列表页 效果⑧商品详情页 效果⑨心愿清单页 其余及源码详…

【2021.02.09更新】数字信号处理公式推导

卷积 h(t)⊗x(t)∫−∞∞h(τ)x(t−τ)dτh(t) \otimes x(t) \int_{ - \infty }^{ \infty } {h(\tau )x(t - \tau )d\tau }h(t)⊗x(t)∫−∞∞​h(τ)x(t−τ)dτ 令τut2\tau u \frac{t}{2}τu2t​&#xff0c;则 h(t)⊗x(t)∫−∞∞h(ut2)x(−ut2)duh(t) \otimes x(t) …

旅游展示网站-前端网页设计技术完整精美源码HTML+CSS+JS

微信公众号&#xff1a;创享日记 发送&#xff1a;旅游网站 获取完整源码&#xff08;打开即可用&#xff09; 效果①首页主页 效果②关于我们页 效果③提供的服务页 效果④我们的能力页 /*页面重置*/ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote…

【2021.01.01】人生中很重要的一个十年,差强人意

回顾整个2020年&#xff0c;是疯狂的一年&#xff0c;也是令人难忘的一年&#xff0c;对于我也是比较励志的一年&#xff0c;绝对是自己人生中的一个里程碑。完成了人生中最重要的一件大事&#xff0c;感谢有你一直陪着我&#xff0c;愿天下有情人终成眷属&#xff0c;最终走到…

数字信号处理实验一 系统响应及系统稳定性

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;响应及稳定…

数字信号处理实验二 IIR数字滤波器设计及软件实现

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;iir滤波器 …

高级java开发_适用于高级Java开发人员的十大书籍

高级java开发Java是当今最流行的编程语言之一。 有很多适合初学者的书籍。 但是对于那些使用Java进行过一段时间编程的人来说&#xff0c;其中有些人看起来有些简单和多余。 初学者的书没有带来新鲜有趣的想法。 但是&#xff0c;高级Java书籍并不总是就在眼前&#xff0c;并非…

数字信号处理实验三 FIR数字滤波器设计与软件实现

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;fir滤波器 …

无线定位技术实验一 TDOA-FDOA联合定位

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;联合定位 获…

无线定位技术实验二 TDOA最小二乘定位法

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;tdoa最小二…

无线定位技术实验三 基于信号强度的位置指纹定位仿真

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;指纹定位 获…

信号处理系统综合设计-最小阶数的IIR数字高通滤波器

微信公众号&#xff1a;创享日记 发送&#xff1a;最小阶 获取完整报告&#xff08;含源代码程序结果分析&#xff09; 设计一个最小阶数的IIR数字高通滤波器&#xff0c;指标要求如下&#xff1a; 以小于1dB的衰减通过150Hz的分量&#xff1b;以至少40dB抑制100Hz的分量&…

java 设计模式 示例_Java中的策略设计模式-示例教程

java 设计模式 示例策略模式是行为设计模式之一 。 当我们对一个特定的任务有多种算法并且客户决定在运行时使用的实际实现时&#xff0c;将使用策略模式。 策略模式也称为策略模式 。 我们定义了多种算法&#xff0c;并让客户端应用程序将算法用作参数。 此模式的最佳示例之一…

电磁场与电磁波实验二 熟悉Matlab PDEtool在二维电磁问题的应用

微信公众号&#xff1a;创享日记 发送&#xff1a;二维电磁 获取完整报告&#xff08;含源程序代码结果分析&#xff09; 一、实验过程 1.命令行输入pdetool打开工具箱 2.使用矩形工具拖动绘制矩形。 3.点击 4.双击矩形框上边&#xff0c;设置参数如下&#xff1a; 二、实验…

Spring Boot&JPA&Hibernate&Oracle

在本教程中&#xff0c;我们将展示如何创建一个Spring Boot应用程序&#xff0c;该应用程序通过Hibernate与Oracle数据源进行通信。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1-创建Maven项目 打开eclipse&#xff0c;然后创…