Auklet - OpenStack Swift 海量小文件解决方案


Apache 2.0
跨平台
Google Go

软件简介

Auklet 是 OpenSwift Swift 对象服务器的重新实现,旨在解决在 OpenStack Swift 中存储大量小文件时的问题。Auklet
基于 OpenStack Swift 和 Hummingbird,由爱奇艺开源。

功能特性

  • 保留大部分 OpenStack Swift 特性

  • 有效解决 LOSF 问题

  • 对大型的对象存储进行优化

  • 针对复制引擎的惰性迁移(lazy migration),可从现有的 Swift 复制引擎进行零迁移工作。不过仍处于实验性阶段

限制

  • 不支持 EC

OpenStack Swift 是一个开源的分布式对象存储系统,爱奇艺自从2012年便开始使用
Swift,其所具有的简单易运维等特点,非常适合爱奇艺的业务,因此其在爱奇艺发挥了非常重要的作用。

爱奇艺作为一家视频公司,自然而然的 Swift
一开始主要也是用来存储视频文件,随着公司业务的高速发展,除了视频之外,一些其他的类型的存储需求也大了起来,比如说图片,文本等。当这些类型的图片存得越来越多的时候,一些对性能非常敏感的业务就反映性能变得很差。究其原因,是由于
OpenStack Swift 底层持久层的架构所致,对于每个上传的对象,在 Swift 后台都会单独保存成一个 POSIX
文件,更糟糕的是,每个对象都会有一个多级目录,因此每次上传一个对象,都要先创建相关目录,再创建新的文件来保存对象。当文件系统上的对象越来越多,这些操作就会越来越耗时,如果对象很大,那么这部分开销相对于整个读写过程来说是可以忽略的,但是当对象很小的时候,这个问题就会被凸显出来。

Auklet 通过以下方式来解决问题:

  • 对象数据存在大文件上

  • 对象元数据保存在 RocksDB 中

  • 对象在大文件中的偏移量保存到 RocksDB 中

  • 每个 Swift partition 对应一个大文件,这样通过 hash 计算就能知道对象所在大文件的位置,避免了通过中心节点去查询大文件的位置

  • 对象删除采用文件打洞的方式,因此删除一个对象时,空间能够实现即时回收。

Auklet pack engine(打包引擎)架构:

性能比较

项目介绍整理自:爱奇艺技术产品团队