weedfs 设置文件过期时间

SeaweedFS 是 key-file 存储引擎, 文件支持设置过期时间(TTL)。

用法

需要两步:

  1. 请求master分配一个有TTL 的文件id:

    1
    2
    # curl http://localhost:9333/dir/assign?ttl=3m
    {"count":1,"fid":"5,01637037d6","url":"127.0.0.1:8080","publicUrl":"localhost:8080"}
  2. 使用这个文件id 来存储文件

    1
    curl -F "file=@x.go" http://127.0.0.1:8080/5,01637037d6?ttl=3m

高级用法

上面例子中ttl=3m使用了两次, 一次是分配文件id, 一次是写数据。 第一个是让 master 选择匹配的卷,而第二个是与文件一起写入的。
两次TTL值其实可以不一样, 只要保证 第一次的比第二次大就可以

TTL支持的格式

格式是数字加时间单位的组合, 支持的时间单位: m,h,d,w,M,y。 区分大小写

如:

  • 3m:3分钟
  • 4h:4小时
  • 5d:5天
  • 6w:6周
  • 7M:7个月
  • 8y:8年

性能

TTL这个功能的难点在于过期文件的磁盘空间回收上面,类似JVM GC的工作。

SeaweedFS用了一个简单的设计,高效的解决了此问题:

SeaweedFS的TTL是和卷及每个文件关联的。 分配文件id阶段,文件id会被分配到一个TTL匹配的卷上,SeaweedFS定时(默认5~10秒)检查卷的过期时间, 到了过期时间, 卷里的所有文件都会过期,然后就可以安全的删除这个卷。

所以回收空间是针对卷的, 性能比较好, 缺点应该就是不那么及时,还是就是写文件要分两步。

最佳实践

部署到生产环境,需要认真考虑TTL卷的最大空间设置。

建议不要在一个集群里混用TTL卷和非TTL卷, 把需要过期的数据和不过期的数据存到不同的集群。因为卷的最大空间(默认30G)是在集群级别的主节点上设置的。混用的话, 这些大小就很难设置了