外包网站,wordpress hello dolly,wordpress 上下篇,上海手机网站建设哪家好在Foreach#xff0c;我们拥有Synology RS815 来存储所有备份。 这些备份来自我们网络中的不同来源#xff0c;例如路由器#xff0c;交换机#xff0c;数据库服务器#xff0c;Web服务器#xff0c;应用程序日志文件#xff0c;邮件服务器等等。 Synology NAS使配置这… 在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 。 请参阅文档以获取更多信息。 buildfinalNamecheckback/finalNamepluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexecutabletrue/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重新启动其补丁程序您的应用程序就会启动。 usersynology:/volume1/checkback/init.d$ ./checkback.sh status
Running [18657]
usersynology:/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: #infraquota-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: .*\.pstgroupByPattern: .*\/backups\/(\d{4}-\d{2}-\d{2})\/groupByPatternHasDatePattern: yyyy-MM-dddeletePolicy: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;
} 现在我们有了配额限制我们只需要计算目录的大小即可。 而不是依靠brtfs或du 我们只是让Java NIO来完成这项工作。 AtomicLong totalSize new AtomicLong();
Files.walkFileTree(f, new SimpleFileVisitorPath() {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