Yig

S3 协议兼容的分布式对象存储系统
授权协议 Apache 2.0
开发语言 Google Go
所属分类 服务器软件、 分布式应用/网格
软件类型 开源软件
地区 国产
投 递 者 朱建弼
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Yet another Index Gateway

Yig 是 S3 协议兼容的分布式对象存储系统。它脱胎于开源软件 ceph ,在多年的商业化运维中, 针对运维中出现的问题和功能上的新需求,重新实现了一遍 radosgw 用于解决以下问题:

  1. 单 bucket 下面文件数目的限制

  2. 大幅度提高小文件的存储能力

  3. bucket 下面文件过多时,list 操作延迟变高

  4. 后台 ceph 集群在做 recovery 或者 backfill 时极大影响系统性能

  5. 提高大文件上传并发效率

Yig 设计

设计一个新的存储系统解决以上问题,无非这些思路

  1. 隔离后台 rebalance 影响

  2. 根据 haystack 的论文,默认的 filestore 或者 bludestore ,并不特别适合小文件存储,需要新的存储引擎

  3. radosgw 对 librados 提高的 omap 和 cls 用得太重,我们如何简化架构,让代码更容易懂,也更不容易出错。

  4. 更加统一的 cache 层,提高读性能

架构如图所见:

image

从整体看,分为2层:

  1. S3 API layer,负责 S3 API 的解析,处理。所有元数据存储在 hbase 中,元数据包括 bucket 的信息,object 的元数据(如ACL,contenttype),multipart 的切片信息,权限管理,BLOB Storage 的权值和调度。所以的元数据都 cache 在统一的 cache 层。可以看到所有元数据都存储在 hbase 中,并且有统一的 cache ,相比于 radosgw 大大提高的对元数据操作的可控性,也提高了元数据查询的速度。

  2. BLOB Storage 层,可以并行的存在多个 Ceph Cluster 。只使用 rados_read/rados_write 的 API 。如果其中一个 ceph cluster 正在做 rebalance ,可以把它上面所有写请求调度到其他 ceph 集群,减少写的压力,让 rebalance 迅速完成。从用户角度看,所有的写入并没有影响,只是到这个正在 rebalance 的 ceph cluster 上的读请求会慢一点儿。大规模扩容也非常容易,比如存在这种情况,初期上线了5台服务器做存储,发现容量增加很快,希望加到50台,但是在原 ceph 集群上一下添加45台新服务器,rebalance 的压力太大。在 yig 的环境中,只要新建一个45台的 ceph 集群,接入 yig 的环境就行,可以快速无缝的添加容量。

在 ceph 层提升性能

使用 libradosstriper API 提升大文件读取写入性能

对于大文件,相比与 radosgw 每次使用 512K 的 buf ,用 rados_write 的 API 写入 ceph 集群,yig 使用动态的 buf ,根据用户上传的速度的大小调整 buf 在 (512K~1M) 之间。 并且使用 rados striping 的 API 提高写入的并发程度。让更多的 OSD 参与到大文件的写入,提高并发程度。 拆分方法如图:

 image

使用 kvstore 提升小文件存储性能

针对小文件,直接使用 kvstore 存储,底层使用 rocksdb ,这个方案相比与 bluestore 或者 filestore 更轻。性能更好。但是要注意2点:

  1. 默认的 kvstore 并没有打开布隆过滤器,需要在 ceph 的配置文件中配置打开,否则读性能会很差

  2. 在 Ceph 的 replicatePG 层,每次写 object 之前,都会尝试读取原 Object ,然后在写入。这个对于 rbd 这种大文件的应用影响不大,但是对于小文件写入就非常糟糕。 所以我们在 rados 的请求中加入的一个新的 FLAG: LIBRADOS_OP_FLAG_FADVISE_NEWOBJ,在 replicatedPG 中会检查是否有这个 FLAG ,如果有,就不会尝试读取不存在的小文件。通过这个 patch ,可以极大的提升小文件的写入性能和降低 cpu 的利用率。

测试

功能测试

因为采用了标准的 S3 接口,可以使用标准的工具。

  1. 采用标准的 python boto 库测试 yig

  2. 复用 ceph 社区的 s3-test 项目测试 yig

性能测试

  1. ceph cluster 性能测试原始 ceph 性能,使用 rados bench 测试4k小文件的随机读写。

  2. 使用 wrk 配合 lua 脚本测试 S3 API

  3. 使用 ycsb 测试 S3 API 性能

部分性能测试数据: 测试平台: 后台3台物理机,ceph 采用普通硬盘,hbase 采用普通硬盘,3副本方案 测试场景:写入1K小文件,然后测试在 90% read 和 10% write 的情况下(类似有于线上环境)的性能数据 测试结果:

load 数据阶段性能: 可以看到即使是在3副本的情况下,S3 写入 iops 仍然很高,可以注意到没割一段时间,iops 的的性能会下降,这是由于 rocksdb 后台在做 compaction 。


模拟线上环境性能:

由于是读多写少的环境,iops 相比于纯写入有很大提升,也不容易发生 compact ,所以 iops 能维持在较高的水平。延迟情况是90%以上的请求延迟小于1s,平均延迟就更小了。

 相关资料
  • 一、介绍 HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。 二、HDFS 设计原理 2.1 HDFS 架构 HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成: NameNode : 负责执行有关 文件系统命名空间 的操作,例如打开,

  • 每个 Redisson 对象都绑定到一个 Redis 键(即对象名称),且可以通过 getName 方法读取。 RMap map = redisson.getMap("mymap"); map.getName(); // = mymap 所有和 Redis 键相关的操作被抽象到了 RKeys 接口: RKeys keys = redisson.getKeys(); Iterable<String>

  • 本文向大家介绍Hadoop 分布式存储系统 HDFS的实例详解,包括了Hadoop 分布式存储系统 HDFS的实例详解的使用技巧和注意事项,需要的朋友参考一下 HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系统。 一、HDFS的优缺点 1.HDFS优点:   a.高容错性     .数据保存多个副本     .数据丢的失后自动恢复

  • jvm的对象头是如何存储的? 对象头中有哪些信息? 对象头里面的东西:运行时元数据,类型指针:Hashcode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳。如果是数组的化还需要记录长度 就比如下面的代码来看,内存分布情况: 由于是static的main方法所有局部变量表没有this,如果是非静态方法的话第一个放this。 其次: 栈帧:局部变量表,操作数栈,动态链接,方法返回

  • 一面 11.1 分布式存储 阿里天池比赛,问了一些模块的优化 问存储项目 问TinyKV 项目 操作系统:cpu cache,false sharing,gdb C++:移动语义,std::map,rbtree和b+tree区别。 perf 观察程序性能 算法题:二叉树的路径和 二面 11.2 leader 面 开局先选方向:DB,分布式,操作系统,体系结构,计算机网络。选了分布式,狂问raft

  • 之前的秋招面经:深信服 Go 开发面经(已 offer) bg:专升本+ACM银牌+三个项目(一个毕设的KV分离LSM-Tree,一个6824的分布式KV,一个OJ) 某小厂,存储方向技术积累还不错,避免定位就不写具体名字了。自己也一直比较憧憬做 infra 吧,不想写 CRUD 业务,所以就投了。面试内容都是事后回忆,可能有遗漏或记错的 一面 50min 自我介绍 项目实现细节、设计考量、优化(

  • 我将一些电子邮件附件保存到Azure Blob中。 我现在正在尝试编写一个Azure Functions应用程序,它将连接到blob存储,运行一些脚本并重新保存文件。 但是,在为函数选择存储帐户时,我无法选择我的blob存储帐户。 我上了网站,上面写着: 创建函数应用时,必须创建或链接到支持 Blob、队列和表存储的常规用途 Azure 存储帐户。某些存储帐户不支持队列和表。这些帐户包括仅 blo

  • 本文向大家介绍各种协议与HTTP协议之间的关系?相关面试题,主要包含被问及各种协议与HTTP协议之间的关系?时的应答技巧和注意事项,需要的朋友参考一下 一般面试官会通过这样的问题来考察你对计算机网络知识体系的理解。 图片来源:《图解HTTP》