女主宣言

Ceph作为云厂商不可或缺的存储系统之一,有着优秀的性能、可靠性和可扩展性,是一种统一的、分布式的存储系统。但是,大家对ceph的技术原理有了解多少呢?本文主要从ceph概述、ceph的系统结构、数据分配策略三方面对ceph作了详细的介绍。下来就跟随作者一起去看看ceph是如何工作的吧。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

1

ceph简述

什么是ceph

Ceph是一种为提高性能、可靠性和可扩展性而设计的统一的、分布式的存储系统。
“统一的”:意味着Ceph一套存储系统可以同时提供对象存储、块存储和文件系统存储三种功能,以便在满足不同应用需求的前提下简化部署和运维。
“分布式”:在Ceph系统中则意味着真正的无中心结构和没有理论上限的系统规模可扩展性。(在使用方面,各公司会有自己的考虑,做目前最大的ceph集群,影响ceph圈,引领ceph技术发展?求稳定,控制一定的规模等 )

ceph的技术特征是什么

高可靠性。首先是针对存储在系统中的数据而言,通过多副本、纠删码方式尽可能保证数据不会丢失。其次,也包括数据写入过程中的可靠性,在用户将数据写入Ceph存储系统的过程中,通过强一致性写入,避免因为意外情况的出现造成数据丢失。
高度自动化。具体包括了数据的自动failure detection和自动failure recovery。总体而言,这些自动化特性一方面保证了系统的高度可靠,一方面也保障了在系统规模扩大之后,其运维难度仍能保持在一个相对较低的水平。
高可扩展性。这里的“可扩展”概念比较广义,既包括了系统规模和存储容量的可扩展,也包括了随着系统节点数增加的聚合数据访问带宽的线性扩展,还包括了基于功能丰富强大的底层API提供多种功能、支持多种应用的功能性可扩展。
ceph的技术这么优秀,那么有谁在用?
主要以云厂商为主(基本在用OpenStack的,后端存储都在用ceph)

2

ceph系统的层次结构

自下向上,可以将Ceph系统分为四个层次:
  1. 基础存储系统RADOS(Reliable, Autonomic, Distributed Object Store,即可靠的、自动化的、分布式的对象存储)。
  2. 基础库LIBRADOS层。
  3. 高层应用接口层:包括了三个部分:RADOS GW(RADOS Gateway)、 RBD(Reliable Block Device)和Ceph FS(Ceph File System)。
  4. 应用层。
Ceph的底层是RADOS的组件:
一种是为数众多的、负责完成数据存储和维护功能的OSD( Object Storage Device)。另一种则是若干个负责完成系统状态检测和维护的Monitor。OSD和monitor之间相互传输节点状态信息,共同得出系统的总体工作状态,并形成一个全局系统状态记录数据结构,即cluster map(monmap osdmap pgmap)。这个数据结构与RADOS提供的特定算法相配合,便实现了Ceph“无需查表,算算就好”的核心机制以及若干优秀特性。
  1. OSD(Object Storage Device),可以被抽象为两个组成部分,即系统部分和守护进程(OSD deamon)部分。即一块磁盘(一些CPU、一些内存),有一个daemon进程对它操作,进行数据存储和维护,是磁盘的“经纪人”,每个osd进程服务会监听一个端口,与其它OSD的daemon、monitor、client通信。
  2. mon:monitor检测和维护集群状态。每个client访问OSD都需要先访问monitor获取集群map,从而知道需要和哪些osd节点通信。

3

数据分布策略crush

Ceph通过crush规则来控制数据的分布策略。

crush规则具体解决了什么问题

  1. 控制把对象存入集群中,并随机均匀的分布在所有存储设备中。
  2. 老设备故障,新设备加入时支持数据的自动均衡迁移,并尽可能最小化数据迁移。
  3. 如何合理分布多副本数据到不同的设备,保证数据较高的可靠性。

两次映射完成数据的分布

Object -> PG -> OSD。
对象名HASH -> pgid -> (osd1,osd2,osd3)。

1)File ——以rbd块存储为例,此处的file即为我创建了一个rbd块,假设我创建了128M的块,在创建块时候可以设定切分成多大的object存在存储设备上,默认是4M,如下图:

2)Ojbect ——在Ceph中,一切皆对象,不论是视频,文本,照片等一切格式的数据,Ceph统一将其看作是对象,不以它们的格式、大小来区分他们,只以对象名来区分,每个不同的对象都有不一样的对象名。
从rados层直接put一个对象到集群中:(原对象多大存入集群就多大)

从rbd应用接口层存数据到集群中:(对块做了切分,打散存入集群)

3)PG(Placement Group)—— PG的用途是对object的存储进行组织和位置映射。具体而言,一个PG负责组织若干个object(可以为数千个甚至更多),但一个object只能被映射到一个PG中,即PG和object之间是“一对多”映射关系。同时,一个PG会被映射到n个OSD上,而每个OSD上都会承载大量的PG,即,PG和OSD之间是“多对多”映射关系。在实践当中,n至少为2,如果用于生产环境,则至少为3。一个OSD上的PG则可达到数百个。事实上,PG数量的设置牵扯到数据分布的均匀性问题。

  • File -> object:从rados层直接存储,不对对象做任何处理,只以对象名为分区将对象存入集群,如果对象名重复则覆盖;从应用层,假设从rbd接口应用层存数据,可以在应用层设定统一切分对象大小,对象名为 block_name_prefix + ID ,存入后端存储设备。

  • Object -> PG映射:要将不同的object映射到PG中去,这里采用了HASH,hash(对象名)得到了一串十六进制随机数,并且对于一个同样的对象名,计算出来的结果永远都是一样的;用随机数除以PG的总数,求余,余数一定会落在0到pg总数减1之间;求余的好处就是对象数量规模越大,每个PG分布的对象数量就越平均,每个对象自有名字开始,他们要保存到的PG就已经可以计算确定了。计算公式:池ID + hash(对象名) / pg_num -> pgid (注:故如果pg_num变化,会影响大量数据重新分布,假设pg_num从16调整为32,那么该池将有约一半数据映射到新增的pg上)。

  • PG -> OSD映射:算法的输出(即算法要达到什么效果):CRUSH希望随机挑OSD出来,要满足权重越大的OSD被挑中的概率越大,为了达到随机的目的,它在挑之前让每个OSD都拿着自己的权重乘以一个随机数,再取乘积最大的那个,那么这样宏观来看,同样是乘以一个随机数,在样本容量足够大之后,这个随机数对挑中的结果不再有影响,起决定性影响的是OSD的权重,OSD的权重(容量)越大,宏观来看被挑中的概率越大。如果我们想保存三个副本,那么只需要挑选3个osd,把每个PG都映射到三个不同的OSD上即可。

我们有哪些输入

互不相同的PG_ID、互不相同的OSD_ID、OSD的权重(根据osd对应的磁盘容量大小设置)。这里我直接使用CRUSH里面采取的Straw算法,翻译过来就是抽签算法,Crush算法的过程(有人将该过程形象的描述为把这些OSD搓一搓,选择一个最长的签):
  1. CRUSH_HASH( PG_ID, OSD_ID, r ) ===> draw (搓一搓,得到一个随机数,r可认为是常量)。
  2. ( draw &0xffff ) osd_weight ===> osd_straw (随机数osd权重)。 
  3. pick up high_osd_straw 。(挑选乘积最大的osd)
  4. 多次抽签。( r+1 继续下次抽签,如果挑选的osd重复,则r继续+1继续抽签,直到选够副本个数个osd )
关键的随机数, CRUSH希望得到这样一个随机数有什么要求?
该随机数和PG_ID 有关、与OSD_ID有关,当相同的输入时,计算得出的输出值一定是相同的,并且有一定随机性。(输出是定值,保证了在集群池中的PG不变,没有扩缩容增减osd,没有调整osd权重的时候,集群的数据分布永远是不变的)

pg到osd的映射过程

  1. 给出一个PG_ID,作为CRUSH_HASH的输入。
  2. CRUSH_HASH(PG_ID, OSD_ID, r) 得出一个随机数。
  3. 对于所有的OSD用他们的权重乘以每个OSD_ID对应的随机数,得到乘积。
  4. 选出乘积最大的OSD,这个PG就会保存到这个OSD上。
  5. 我们把r+1,再求一遍随机数,重复上述过程,选出乘积最大的OSD,如果和之前的OSD编号不一样,那么就选中它;如果和之前的OSD编号一样的话,那么再把r+2,再选一次,直到选出我们需要的三个不一样编号的OSD为止。
Pg到osd的映射过程如果就这样完成了,怎么解决故障阈的问题?怎么人为定义我想把数据分布在哪个机柜?
定义一个树形结构,该树形结构中osd之外的节点我们称为bucket;每个OSD有weight,每个主机也可以有一个weight,这个weight由主机内的所有OSD的weight累加而得;每个rack的weight由所有主机的weight累加而得;root的weight其实就是rack的权重之和;同样bucket也有ID;仿照CRUSH选OSD的方法来选择bucket,并且还可以定义从树形结构的根节点每次从下层节点选择多少个bucket。

4

集群维护

理解了crush算法的原理,其实ceph的集群维护就是维护集群的crush规则。( 即PG_ID/BUCKET_ID/OSD_ID/权重控制PG的映射关系)
  1. 新增/删除OSD(扩缩容) 首先根据配置信息与monitor通信,monitor将其加入cluster map,并设置为up或out状态,权重生效;删除osd过程相反。
  2. 自动化的故障恢复(Failure recovery) 收到monitor发过来的cluster map之后,这个新OSD计算出自己所承载的PG以及和自己承载同一个PG的其他OSD。然后与这些OSD取得联系。如果这个PG目前处于降级状态(即承载该PG的OSD个数少于正常值),则其他OSD将把这个PG内的所有对象和元数据赋值给新OSD。数据复制完成后,新OSD被置为up且in状态,cluster map更新。

360云计算

由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

ceph基本架构及数据分布原理相关推荐

  1. 世界500强是如何解决千亿流量留存问题的,《Ceph分布式存储架构》-使用CentOS 7部署 Ceph分布式存储架构-为他们解决什么问题。

    文章目录 一.Ceph概述 1.1 Ceph介绍 1.2 Ceph各组件介绍 二.ceph集群部署实验 2.1 配置Ceph安装源 2.2 在xuegod63上安装ceph-deploy管理工具 2. ...

  2. 【Android架构师java原理详解】二;反射原理及动态代理模式

    前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...

  3. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

  4. 《大型网站技术架构:核心原理与案例分析》笔记05

    <大型网站技术架构:核心原理与案例分析>笔记05 网站的课扩展性架构: 扩展性:指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力.表现在系统基础设施稳定不需要经常变更,应用之间 ...

  5. 一文讲透大型网站架构模式核心原理与案例分析

    什么是模式?每一个模式描述了一个在我们周围不断发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复的工作. 也许互联网产品不是随便复制就能成功的,创新的产品更能为用户创造价 ...

  6. 京东购物车的 Java 架构实现及原理

    转载自 京东购物车的 Java 架构实现及原理 今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还 ...

  7. Zookeeper的集群架构以及读写原理

    本文来说下Zookeeper的集群架构以及读写原理 文章目录 总体架构 Session Quorum模式 搭建3节点ZooKeeper集群 本文小结 总体架构 应用使用 ZooKeeper 客户端库来 ...

  8. 深入分析 iBATIS 框架之系统架构与映射原理【转】

    深入分析 iBATIS 框架之系统架构与映射原理 许 令波 (xulingbo0201@163.com), Java 工程师, 淘宝网 简介: iBATIS 通过 SQL Map 将 Java 对象映 ...

  9. 阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章

    阅读<大型网站技术架构:核心原理与案例分析>第五.六.七章,结合我们的系统,分析如何增加相应的功能,提高系统的可用性和易用性. 这三章主要讲述的是网站的可用性.伸缩性和可扩展性. 高可用架 ...

最新文章

  1. c语言错误2064,VC错误: error C2064: term does not evaluate to a function
  2. map评价吗 voc数据集可以用coco_【庖丁解牛】从零实现RetinaNet(九):使用COCO预训练权重在VOC上训练RetinaNet...
  3. 求字符串中最长无重复子序列
  4. python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象
  5. 提交代码前问自己七个问题!
  6. Oracle查询忽略大小写的实现方法
  7. Minor GC、Major GC、Full GC
  8. 201671010117 2016-2017-2 《Java程序设计》Java第二周学习心得
  9. Java从string数组创建临时文件
  10. Nginx进程以及事件处理模型
  11. SQL 数据库的自动备份(Procedures实现)
  12. hadoop 文件介绍
  13. python零基础学习书-Python零基础到进阶必读的书藉:Python学习手册pdf免费下载
  14. 文件图片随机划分训练集和验证集
  15. mybatis支持拼音、汉字模糊查询
  16. ba无标度网络python_python绘制BA无标度网络
  17. 黑苹果 Catalina 15 声卡定制
  18. C语言编程>第十七周 ⑤ 请补充fun函数,该函数的功能是:用来求出数组的最小元素在数组中的下标并存放在k所指的存储单元。
  19. TDengine总结物联网数据特点
  20. 【Python学习笔记】- 06 函数式编程

热门文章

  1. 第一次使用水晶报表,柱状图的横竖坐标不会定位,怎么办?
  2. ServletContext对象、ServletConfig对象
  3. Mybatis框架 导入/导出功能的实现
  4. WebService之Java原生态支持(二)
  5. 叶修手速900什么概念_什么是数学?数学是探索的过程
  6. Halcon 轮廓合并算子
  7. JVM垃圾回收,面试问到的都有了
  8. 贵州大学 c语言,贵州大学C语言 试卷.doc
  9. testlink匹配mysql8_如何安装Testlink
  10. AIR文件操作(三):使用FileStream对象读写文件