Auklet 是 OpenSwift Swift 对象服务器的重新实现,旨在解决在 OpenStack Swift 中存储大量小文件时的问题。Auklet 基于 OpenStack Swift 和 Hummingbird,由爱奇艺开源。
功能特性
保留大部分 OpenStack Swift 特性
有效解决 LOSF 问题
对大型的对象存储进行优化
针对复制引擎的惰性迁移(lazy migration),可从现有的 Swift 复制引擎进行零迁移工作。不过仍处于实验性阶段
限制
OpenStack Swift 是一个开源的分布式对象存储系统,爱奇艺自从2012年便开始使用 Swift,其所具有的简单易运维等特点,非常适合爱奇艺的业务,因此其在爱奇艺发挥了非常重要的作用。
爱奇艺作为一家视频公司,自然而然的 Swift 一开始主要也是用来存储视频文件,随着公司业务的高速发展,除了视频之外,一些其他的类型的存储需求也大了起来,比如说图片,文本等。当这些类型的图片存得越来越多的时候,一些对性能非常敏感的业务就反映性能变得很差。究其原因,是由于 OpenStack Swift 底层持久层的架构所致,对于每个上传的对象,在 Swift 后台都会单独保存成一个 POSIX 文件,更糟糕的是,每个对象都会有一个多级目录,因此每次上传一个对象,都要先创建相关目录,再创建新的文件来保存对象。当文件系统上的对象越来越多,这些操作就会越来越耗时,如果对象很大,那么这部分开销相对于整个读写过程来说是可以忽略的,但是当对象很小的时候,这个问题就会被凸显出来。
Auklet 通过以下方式来解决问题:
对象数据存在大文件上
对象元数据保存在 RocksDB 中
对象在大文件中的偏移量保存到 RocksDB 中
每个 Swift partition 对应一个大文件,这样通过 hash 计算就能知道对象所在大文件的位置,避免了通过中心节点去查询大文件的位置
对象删除采用文件打洞的方式,因此删除一个对象时,空间能够实现即时回收。
Auklet pack engine(打包引擎)架构:
性能比较
项目介绍整理自:爱奇艺技术产品团队