Ceph是一个开源的PB级文件系统,最早是加州大学Santa Cruz分校的一个研究项目,项目创始人sage weil是该校的一名博士。ceph包括一个兼容POSIX的分布式文件CephFS,一个分布式对象存储系统RADOS(Reliable Autonomic Distributed Object Storage),并基于RADOS实现了一个且兼容Swift和S3的存储系统radosgw,以及一个块设备驱动RBD。根据官网介绍,RADOS/radosgw/RBD比较稳定,CephFS还不足以应用到产品环境,此外Ceph稳定性收到btrfs限制。linux内核2.6.34版本开始包含ceph client,这说明ceph已经得到开源社区的认可,发展前景看好。

元数据集群MDS,分布式对象存储系统RADOS是Ceph最关键的两项技术。其中RADOS是一个支持海量存储对象的分布式对象存储系统。RADOS最大的特色是使用CRUSH算法维护存储对象与存储服务器的对应关系,并采用了无Master设计,对象复制,集群扩容,数据迁移,故障检测和处理复杂功能由OSD提供,既避免了单点失败,又提升了集群扩展性。

数据定位

RADOS采用两层映射关系,第一层映射将存储对象映射到一个PG(Placement Group),PG是一组存储对象集合,是复制和负载均衡的最基本单位。一级映射pgid=hash(o)&m的输入是对象表示o,一级掩码m,m限定系统内最大PG个数为2的整数次幂(实际上是三个参数,这里忽略副本个数r)。虽然先定了最大PG个数,但是不对系统扩容造成影响,原因是PG可以一分为二。但是会出现将所有PG分裂造成大量数据迁移,为避免这种情况,使用类似linear hashing的方式对一级映射做了修正,允许每次只分裂一个PG可以实现渐进式扩容。
第二层映射是基于CRUSH(Controlled Replication UnderScalabe Hashing)哈希算法映射pg到多个OSD,这些OSD构成复制关系。这些OSD构成复制关系。CRUSH的输入是cluster map,placement rule,以及pgid,其中cluster map描述集群中所有OSD信息、状态及其逻辑关系,placement rule限定了副本个数,以及副本放置规则,例如所有副本必须放在不同机架。与普通哈希不同,CRUSH较为稳定,增加或者减少OSD,不会导致大量数据迁移,此外CRUSH允许根据OSD存储能力,设定权重。
以PG作为复制和负载均衡的基本单位,有两个好处,一是有效减少复制的管理难度,二是对错误进行一定程度隔离(一个OSD故障影响到有限个其他OSD)。当然,为了保证数据可靠性,必须控制PG大小,提高恢复并行度,保证集群内部有充足的资源参与恢复。

基于PG和CRUSH的存储对象定位方式是RADOS比较重要的一个创新点,无需全局维护对象到OSD之间的映射关系,集群中任何服务器,无论是client亦或是OSD,均能独立完成数据定位。
主要优势有:
1)元数据小,支持海量小文件存储某系统扩展性非常好;
2)支持对等集群,将复制,故障检测,故障处理交给只能OSD处理;
3)算法较为灵活,能支持权重和placment rule。
不足之处有:
1)负载均衡不够灵活,服务器性能差异较大时,难以设置合理的权重;
2)新节点加入集群时,必须迁移数据

集群成员关系

cluster map是描述OSD状态信息以及集群拓扑结构的元数据信息。
OSD状态涉及up/down和in/out两个维度,up/down表示OSD是否工作正常,in/out表示OSD是否包含有效数据。

复制和一致性

RADOS实现了三种复制方案:primary-copy/chain/splay。
primary-copy方式下,读写操作都发往primary,primary确定写操作的顺序并转发到所有其他副本,等到其他副本写操作完成之后,primary写本地对象,然后返回ack到客户端。(由于存在并发访问可能性,必须从primary读取数据,否则可能读到不一致数据)。
chain方式下,类似Google文件系统,OSD构成一个链,写请求发往第一个OSD,该OSD指定写操作之后转发请求到后一个OSD,最后一个OSD完成写操作之后发送ack到客户端。读请求发往最后一个OSD,保证读取到的数据都有充足的副本。
splay方式则更为复杂,是chain和primary-copy的结合体。
primary-copy是最常用的复制方式,一次本文只关注这样方式。

RADOS基于版本和日志实现副本一致性。每个存储对象对应一个版本(apoch,v),其中epoch是cluster map版本,v是递增的数字,每次写操作都会增加v。PG也对应一个最后更新版本last_update,las_update等于PG中最新修改对象的版本。每个PG都记录近期更新日志,日志项包括存储对象名,操作类型,对象版本和客户端标识。在RADOS中,一次更新操作设计写log,修改版本,修改数据几个动作,EOBFS通过事务保证log与数据的一致性。

写操作过程跳过不可用的副本,这可能导致不一致,一致性恢复分为两个阶段:
第一个阶段是peering。这一阶段的目的是让所有副本得到PG最新状态,所有相关OSD想primary汇报最近一段时间的log,primary汇集自上次peering依赖的所有更新日志,并将增量日志发往所有其他副本。第一家短阻塞读写请求,一般来说peering较为轻量级,对可用性影响不算大。
第二个阶段是恢复阶段,primary根据各副本状态从其他副本拷贝存储对象或者发送存储对象到其他副本。恢复阶段与应用IO可以并行,若应用访问了primary中待恢复的存储对象,则将对象恢复优先级提高,并阻塞请求指导该对象恢复完成。

RADOS只保存也只能保存最近一段时间内的更新,新节点加入集群或者节点永久性故障时,某些副本需要从零开始全量恢复,解决办法是扫描PG内所有存储对象,生成backlog,根据backlog和近期log完成恢复。

读写请求带有epoch,只有epoch匹配时才允许更新,若不匹配响应方返回cluster map增量更新,请求方重新确定副本位置。只要参与更新的OSD和client具有相同的epoch,即使这个epoch与cluster map最新epoch不同,更新也能成功,也能保证一致性,原因是此时新的primary还没有开始peering,不会产生丢失更新问题。

读操作的一致性难以保证,比如网络故障情况将某个client和prmary与其他副本隔离,而且primary已经被cluster map标记为down,由于primary和client之间的网络是正常的,该client的读请求总是能执行成功。为了尽可能降低这种情况出现,primary和其他副本之间定期发送心跳,若primary一段时间未接收到其他副本的心跳消息,则阻塞读操作,则阻塞读操作。芮然读操作存在不一致,但是产生的概率比较小。实际上,只要这段时间内单个存储对象上没有读写并发,则读操作还是能保证一致。

存储

如上所述,RADOS通过对象版本和操作日志修复副本一致性,这种做法能够提高修复效率,以及系统可用性,但也对单机存储系统提出更高要求:日志,对象版本,对象数据必须保持一致。

RADOS原生的本地存储系统EBOFS(Extent and B-Tree based Object File System),是基于Extent和B-Tree的单机对象存储系统,提供类似文件系统的对象访问接口,对象归属于一个或者多个collection,对象和collection拥有多个attribute/value袁术。Extent是连续的一段存储空间,基于Extent分配和管理空闲,可以降低元数据数据量,降低数据碎片,提高数据的连续性,提高IO效率。使用COW技术处理更新,能够保证磁盘数据一致性,降低宕机恢复难度。EBOFS现在内存做更新,再异步写回磁盘。基于COW和内存更新,EOBFS实现了事务功能,能够保证对象,对象版本,PG last_update,PG操作日志之间的一致性。此外EBOFS提供了journal功能,journal存储于NVRAM,用于持久化要求较高的应用。

Btrfs是一个基于COW B-Tree的文件系统,Btrfs功能比EBOFS更为强大(支持文件数据COW,同时文件元数据不比全部装入内存),2.6.29之后btrfs已经进入linux内核mainline。为了避免重复发明轮子,官方文档推荐使用btrfs作为ceph的本地存储系统。

RADOS分布式对象存储原理简介相关推荐

  1. 如何从零起步搭建一个分布式对象存储的架构

    早在几年前,云存储还只是存在于业界大佬们口中的一个概念,其应用场景仅供大公司使用.突飞猛进的网络技术似乎在一瞬间就把这个概念普及到千家万户,现在云存储已经是大家司空见惯的一个网络服务了.比如大家用的百 ...

  2. 分布式对象存储 读书笔记(一) 开始

    这是 <分布式对象存储 原理架构及Go语言实现>的学习笔记的第一篇 我们简单的实现一个REST(表述性状态传递,英文:Representational State Transfer)服务接 ...

  3. 分布式存储--理解分布式文件系统、分布式块存储、分布式对象存储、分布式数据库

    1. 单机文件系统 vs 分布式文件系统 传统单机文件系统是计算机中一个非常重要的组件,为存储设备提供一致的访问和管理方式.在不同的操作系统中,文件系统会有一些差别,但也有一些共性几十年都没怎么变化: ...

  4. minio对象存储原理_使用MinIO在本地运行S3对象存储

    minio对象存储原理 Object storage is amazingly versatile. We normally associate it with AWS S3, but Object ...

  5. python分布式对象存储_推荐:一款分布式的对象存储服务

    最近公司在准备内部数据上云,并且内部数据库每天的数据量很大,需要采用大数据存储的方案. 方案调研 每个程序技术在实现之前,需要进行开源产品的调研,适合自己产品的技术方案才是最好的. 需求 我们需要处理 ...

  6. 对象存储搭建文件服务器,搭建分布式对象存储服务MinIO-单点模式

    # 搭建分布式对象存储服务 MinIO-单点模式 本文介绍开源的分布式对象存储服务 MinIO 的单点模式的搭建步骤.对象存储系统相比于传统的 NAS 文件系统有很多的优势,访问效率高.方便扩容,支持 ...

  7. 分布式对象存储设计原理

    保存像图片.音视频这类大文件就是对象存储.不仅有很好的大文件读写性能,还可通过水平扩展实现近乎无限容量,并兼顾服务高可用.数据高可靠. 对象存储"全能",主要因,对象存储是原生分布 ...

  8. Apache基金会正式宣布新一代分布式对象存储Ozone成为顶级项目

    刚刚获悉,Apache基金董事会通过一致表决,正式批准分布式文件对象存储Ozone从Hadoop社区孵化成功,成为独立的Apache顶级开源项目.这意味着,作为腾讯大数据团队首个参与和主导的开源项目, ...

  9. minio分布式对象存储

    介绍 Minio的冗余 (纠删码可以在丢失一半-1的盘的情况下,仍可以保证数据安全) 采用纠删码来防范多个节点宕机和位衰减. 分布式至少需要4个节点(4台服务器),使用分布式 Minio 就自动引入了 ...

最新文章

  1. 牛客网在线编程----算法入门篇
  2. 爬虫--用python中requests和urllib模块爬取图片
  3. github如何clone别人commit的历史版本的仓库
  4. 如何梳理复杂系统的用户需求?
  5. mysql 分组_mysql分组查询(总结)
  6. IIS+ASP.NET MVC必须知道的事
  7. 2016校招真题编程练习——微信红包(腾讯)
  8. 创建用户故事地图的步骤
  9. 牛客网刷题(纯java题型 211~240题)
  10. html图片上加水印,css给图片添加水印
  11. 线段树的入门级 总结
  12. UML类图中各种箭头和线条的含义和用法
  13. 网易互娱2017实习生招聘在线笔试--源代码编译
  14. TZT3826E静态信号测试分析系统
  15. 追风筝的人 第五章
  16. Java中常见的各种锁-超全面
  17. 区块链技术发展现状和趋势
  18. Caused by: java.lang.NumberFormatException: For input string: “?2130969371“
  19. 在VBA中引用excel的函数
  20. 用秩的定义求矩阵的秩

热门文章

  1. 80后新贵:中国四大最年轻的亿万富翁
  2. mysql decimal类型详解
  3. Golang之nil
  4. oppofindx6pro参数配置 oppo findx6pro 评测
  5. 人际交往中的三个大忌讳!
  6. 存储大师班 | 浅谈数据保护之快照与备份
  7. 在无界面的Linux服务器上下载百度网盘文件
  8. potplayer播放mkv格式的视频没有声音
  9. 不同网段设备间ARP请求处理
  10. Javascript模板引擎mustache.js详解