来头
租 Minecraft 面板服和小伙伴们一起玩的时候,我希望至少存档数据能把握在自己手上,想找个备份插件来定时备份存档进行上传。但当时咱发现很多服务商会限制硬盘用量,而市面上很多成熟的备份插件都是先本地压缩打包再上传的模式,如果我存档数据本身已经有将近 10G ,而硬盘空间限制 10G ,那么打包过程中就已经会占满硬盘导致上传失败。因此我决定还是自己写个插件,按自己的设想去加上必要的功能,PotatoSack 就这样诞生了。
关于全量和增量备份
为了方便描述全量和增量备份,我将 [一个全量备份 + 其后的增量备份 (直至下一次全量备份前的)] 抽象成了一个“一组备份”的概念。每产生一次全量备份就会新创建“一组备份”,随后直至下次全量备份前的增量备份都会算在这一组里。
基本特性
PotatoSack 同时支持传统的备份模式以及流式压缩+传输模式,后者会在内存中维护一个小缓冲区,边压缩数据边上传,这样就能几乎不占用额外的硬盘空间。
最开始这个插件是针对 OneDrive 来写的,而 OneDrive 很坑爹的一点是分块上传 API 要求提前知道文件大小,为此我采用了时间换空间思路,先模拟跑一遍压缩计算大小,再开始正式的压缩和传输流程。这个期间就算暂停世界自动保存,异步线程可能也会持续刷写剩下的区域文件,因此我也加入了文件完整性校验。流式传输过程中还可能因为网络问题中断,期间的“兜底”处理我也尽量考虑到了,详见备份机制说明文档。
时至今日,插件目前已经支持 OneDrive, Dropbox 和兼容 S3 的对象存储服务。
除此之外,插件还有这些特性:
- 支持区块级的变更追踪,有效减小增量备份压缩包的体积,详见 README - 概念介绍;
- 支持使用 Unix Cron 安排备份时间;
- 支持在没有玩家的时候暂停备份,节省空间;
- 支持
.potatosackignore以类似.gitignore的语法忽略不需要备份的文件。
项目信息
- ✨ 开源地址,欢迎点 Star Orz: https://github.com/Bottle-M/PotatoSack
- 📥 下载地址 (包含备份合并工具): https://github.com/Bottle-M/PotatoSack/releases/latest
- 📄 中文文档: https://github.com/Bottle-M/PotatoSack/blob/main/README.zh-CN.md
这个插件也维护了好几年了,在咱的服务器上一直在发光发热,希望能多多少少帮助到大家吧。
