Auklet 是 OpenStack Swift 对象服务器的重新实现,旨在解决在 OpenStack Swift 中储存海量小文件时存在的问题。Auklet 基于 OpenStack Swift 和 Hummingbird 而生,由爱奇艺开源。
OpenStack Swift 是一个开源的分布式对象存储系统,自2012年起便被用于爱奇艺的视频文件存储业务当中。随着公司业务的发展,除了视频之外,一些其他的类型的存储需求也大了起来,比如说图片,文本等。当这些类型的图片存得越来越多的时候,一些对性能非常敏感的业务就反映性能变得很差。究其原因,是由于 OpenStack Swift 底层持久层的架构所致,对于每个上传的对象,在 Swift 后台都会单独保存成一个 POSIX 文件,更糟糕的是,每个对象都会有一个多级目录,因此每次上传一个对象,都要先创建相关目录,再创建新的文件来保存对象。当文件系统上的对象越来越多,这些操作就会越来越耗时,如果对象很大,那么这部分开销相对于整个读写过程来说是可以忽略的,但是当对象很小的时候,这个问题就会被凸显出来。
Auklet 通过以下方式来解决问题:
对象数据存在大文件上
对象元数据保存在 RocksDB 中
对象在大文件中的偏移量保存到 RocksDB 中
每个 Swift partition 对应一个大文件,这样通过 hash 计算就能知道对象所在大文件的位置,避免了通过中心节点去查询大文件的位置
对象删除采用文件打洞的方式,因此删除一个对象时,空间能够实现即时回收。
Auklet pack engine(打包引擎)架构:
![image](https://oscimg.oschina.net/oscnet/9582fb68fa19e25d91535bd59837076367a.jpg)
性能比较
![image](https://oscimg.oschina.net/oscnet/f569089069eaf6fa882bfa079ef5d411b9c.jpg)
项目介绍整理自:[爱奇艺技术产品团队](https://mp.weixin.qq.com/s/YTiEJLWMjkv-8hScR3nf6w)
- 授权协议:
- Apache 2.0
- 开发语言:
- Google Go 查看源码»
- 操作系统:
- 跨平台