ceph基本架构及数据分布原理

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

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

图片


1数据结构

ceph简述运维

什么是ceph分布式

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

ceph的技术特征是什么ide

高可靠性。首先是针对存储在系统中的数据而言,经过多副本、纠删码方式尽量保证数据不会丢失。其次,也包括数据写入过程当中的可靠性,在用户将数据写入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. 应用层。

  1. image.png
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节点通讯。


3spa

数据分布策略crush翻译

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

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

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

两次映射完成数据的分布

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

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


image.png

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

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

image.png

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数量的设置牵扯到数据分布的均匀性问题。

image.png

  • 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更新。
相关文章
相关标签/搜索