weedfs 设置文件过期时间
SeaweedFS 是 key-file 存储引擎, 文件支持设置过期时间(TTL)。
用法
需要两步:
请求
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"}使用这个文件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)是在集群级别的主节点上设置的。混用的话, 这些大小就很难设置了