找回密码
 立即注册
搜索

CPack仓库清理实践

sx_lityliao 2024-7-22 10:10:00


01
背景

根据规则清理制品库中符合条件的制品,并结合后台定时任务删除磁盘文件,达到释放磁盘空间的目的。


02
制品数据存储结构和磁盘清理机制说明

2.1制品数据存储结构

二进制制品(generic仓库):                              

  • 一个文件对应一个节点(node)

  • 一个非文件夹节点对应一个磁盘文件

  • file_reference 记录磁盘文件被引用的次数,即当用户上传一个文件时,如果该文件已存在制品库的存储目录中,则使该文件的 file_reference 记录的引用数量+1,如果是删除文件,则对应的引用数 -1

  • 存在多个节点(node)引用同一个磁盘文件的情况,这样做的目的是去重存储,节省磁盘空间

d5ad69e1ead448964058fe2115e63d43.png

依赖源制品:                               

  • 一个依赖源制品对应多个文件

  • 文件与 node 和 file_reference 的关系与二进制制品一致

2ec6db4103584e797185651da8b6a9b1.png

2.2 磁盘清理机制

1.制品被删除后,其对应的 node 会被标记为【已删除】,即逻辑删除

2.默认配置下,被标记为【已删除】的 node 会被保留14天,14天后该节点变为【已过期】的节点,需要进行删除,即物理删除                            

  • 【已删除】的 node 保留的天数可通过配置进行修改

# 在 repository.yaml 配置文件中,增加如下配置# 如果该配置不存在,则默认为14天# 如果该配置小于0,则永远不进行物理删除repository: 
  deletedNodeReserveDays: 14

3.磁盘清理由两个后台任务配合完成

  • 删除【已过期】节点的后台任务

1) 根据 deletedNodeReserveDays 配置的天数,找出【已过期】的节点2) 物理删除【已过期】的节点,并减少文件对应的 file_reference 的引用数(count)

该后台任务的执行时间为:        2点        8点        14点        20点

4.删除【引用数为0】的文件

1) 删除file_referen【引用数为0】的磁盘文件2) 删除对应 file_reference 的数据库记录

该后台任务的执行时间为:        4点        10点        16点        22点

注:仓库清理与页面删除操作效果一致(即逻辑删除),不会立即触发【磁盘清理机制】


03
依赖源仓库清理

只支持4种依赖源仓库                                  

  • MAVEN

  • DOCKER

  • NPM

  • HELM

7de8f251c95b4b355adea82cec95bbb3.png

3.1 保留条件的优先级

保留条件有3个:                                                

  • 保留版本数:根据【创建时间排序】

  • 保留天数:根据 【创建时间】 和 【最近使用时间】

                  最近使用时间:下载制品即更新该时间

                                               
  • 元数据保留规则

保留流程示例:假设一个包有20个版本,符合【元数据保留规则】的版本是5个,那么除【符合元数据保留规则的5个版本】之外剩余的15个版本进行【保留版本数】条件判断,假设【保留版本数=5】,那么剩下的10个版本进行【保留天数】条件判断,如果符合【保留天数】的版本为5个,那么最终剩余的5个版本将会被清理

0eba38b53c46482559bff6060e767295-resize1920 (1).png


04
二进制仓库清理

二进制仓库清理存在两个版本(通过页面配置即可分辨),功能存在差异

d040ecfd65d84547624d96c5eb0e8d94-resize1920.png


注:

  • V1版本的二进制仓库清理的【保留天数】根据:【制品创建时间】、【制品最近使用时间】两个时间取来判断,即这两个时间超过【保留天数】才会被清理

  • V2版本的二进制仓库清理的【文件暂存时间】根据:【制品创建时间】、【制品更新时间】、【制品最近使用时间】三个时间取来判断,即这三个时间超过【文件暂存时间】才会被清理



4.1 二进制仓库清理V1

07cca9a3500d4f404e79b98ac78a7b15.png

4.2 二进制仓库清理V2

与V1版本仓库清理相比,V2版本支持对每个目录做不同的保留规则配置

2c26c1ed6d6b4c5d508895bb5c8da84f.png
  • 在目录下符合保留规则的文件永久不会被清理,文件不符合任意保留规则但是存储未超过暂存时间不会被清理,文件被下载、编辑将刷新保留时间。

  • 开启自动清理后,未设置保留规则和暂存时间的文件,将按照文件目录1(仓库全局规则)的暂存时间与规则做保留,文件目录1不可删除。

  • 添加文件目录后,文件目录下的所有文件按照所属目录的暂存时间与规则做保留,不再按照全局规则做保留。(就近原则)

  • 在父目录存在多个子目录与保留规则时,添加子目录1保留规则,仅子目录1内的文件按照子目录1的规则进行保留,其他子目录按照父目录规则做保留(就近原则)


05
清理定时任务未生效原因

5.1 定时任务被锁定(若定时任务在执行过程中,被打断则锁定,7天内无法再进行,除非删数据)

检查方式:查看shed_lock表(减少引用定时任务名称:DeletedNodeCleanupJob,磁盘清理定时任务名称:FileReferenceCleanupJob)

#mongodb查看任务锁定命令
db.shed_lock.find({  _id  :  FileReferenceCleanupJob  })
#mongodb删除任务锁定命令
db.shed_lock.deleteOne({  _id  :  FileReferenceCleanupJob  })

案例:
清理磁盘定时任务无响应问题,FileReferenceCleanupJob定时任务被锁定,锁定时间8月30日2点,解锁时间9月7日20点;

9410917e6be54e2767dc3c24e2014bc0.png



您需要登录后才可以回帖 立即登录
共收到 0 条点评
返回顶部