Btrfs快照

如果你熟悉 macOS ,就会知道苹果公司的macOS是基于 FreeBSD 开发的DarWin内核,其中有一个突出功能就是 TimeMachine 备份。这项技术结合了

快照是为了避免数据被误删除的本地备份: 举例,上述 /data 数据卷,需要定时每天做一次快照:

btrfs subvolume snapshot /data /data/data_snapshot_`date +%Y_%m_%d_%H:%M:%S`

提示信息:

Create a snapshot of '/data' in '/data/data_snapshot_2022_11_30_00:17:57'
  • 如果需要恢复数据:

    mkdir -p /snapshot/data_snapshot_2022_11_30_00:17:57
    mount -t btrfs -o subvol=data_snapshot_2022_11_30_00:17:57 /dev/nvme0n1p7 /snapshot/data_snapshot_2022_11_30_00:17:57
    

此时就可以到快照目录下去找数据进行恢复(如果你不幸误删除了某些重要数据)

备注

你可以写一个简单的每日快照脚本,只要在快照前记录下时间戳,并且快照名是按照时间戳来命名的,就很容易恢复到某个快照备份数据。

使用快照进行软件发布

虽然使用 Btrfs子卷 可以为 Btrfs NFS 提供卷数据 在Kubernetes中部署NFS ,但是还不够完美:

  • Btrfs子卷 默认是读写模式,而对于软件发布,我们希望只读输出

  • Btrfs子卷 是可修改的,并且随着时间会变化,非常容易误修改,不符合软件发布一旦relase就不可更改的特性

快照子卷 的特殊形式:

  • 一旦建立快照,除非删除,否则不可修改

  • 几乎无限的快照数量,可以满足版本迭代以及任意回滚

  • 可以和 gittag 或者 GitHub的 release 完美契合,实现发布

实现逻辑

  • 执行 git-flow发布工作流 将软件变更提交,执行 Jenkins 持续集成

    • 如果是git仓库直接发布,则在git仓库上执行Btrfs快照,并将快照挂载到快照目录

    • 如果是编译发布(通过 Jenkins ),则下载编译后的二进制程序到发布目录,在发布目录上执行Btrfs快照,并将快照挂载到快照目录

  • 构建 Btrfs NFS

  • 构建 在Kubernetes中部署NFS ,发布更新NFS卷的Pod实现WEB网站更新

备注

本文实践采用了简化的发布流程,没有集成 git-flow发布工作流 (我还没有时间和精力折腾)。但是,核心思想是共通的,后续可以再改进。

参考