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的技术这么优秀,那么有谁在用?2性能
ceph系统的层次结构云计算
自下向上,能够将Ceph系统分为四个层次:3spa
数据分布策略crush翻译
Ceph经过crush规则来控制数据的分布策略。
crush规则具体解决了什么问题
两次映射完成数据的分布
Object -> PG -> OSD。对象名HASH -> pgid -> (osd1,osd2,osd3)。1)File ——以rbd块存储为例,此处的file即为我建立了一个rbd块,假设我建立了128M的块,在建立块时候能够设定切分红多大的object存在存储设备上,默认是4M,以下图:
从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搓一搓,选择一个最长的签):pg到osd的映射过程
4
集群维护
理解了crush算法的原理,其实ceph的集群维护就是维护集群的crush规则。( 即PG_ID/BUCKET_ID/OSD_ID/权重控制PG的映射关系)