ceph基本架构及数据分布原理
女主宣言
Ceph作为云厂商不可或缺的存储系统之一,有着优秀的性能、可靠性和可扩展性,是一种统一的、分布式的存储系统。但是,大家对ceph的技术原理有了解多少呢?本文主要从ceph概述、ceph的系统结构、数据分配策略三方面对ceph作了详细的介绍。下来就跟随作者一起去看看ceph是如何工作的吧。
PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!
1
ceph简述
什么是ceph
ceph的技术特征是什么
主要以云厂商为主(基本在用OpenStack的,后端存储都在用ceph)
2
ceph系统的层次结构
- 基础存储系统RADOS(Reliable, Autonomic, Distributed Object Store,即可靠的、自动化的、分布式的对象存储)。
- 基础库LIBRADOS层。
- 高层应用接口层:包括了三个部分:RADOS GW(RADOS Gateway)、 RBD(Reliable Block Device)和Ceph FS(Ceph File System)。
- 应用层。
- OSD(Object Storage Device),可以被抽象为两个组成部分,即系统部分和守护进程(OSD deamon)部分。即一块磁盘(一些CPU、一些内存),有一个daemon进程对它操作,进行数据存储和维护,是磁盘的“经纪人”,每个osd进程服务会监听一个端口,与其它OSD的daemon、monitor、client通信。
- mon:monitor检测和维护集群状态。每个client访问OSD都需要先访问monitor获取集群map,从而知道需要和哪些osd节点通信。
3
数据分布策略crush
Ceph通过crush规则来控制数据的分布策略。
crush规则具体解决了什么问题
- 控制把对象存入集群中,并随机均匀的分布在所有存储设备中。
- 老设备故障,新设备加入时支持数据的自动均衡迁移,并尽可能最小化数据迁移。
- 如何合理分布多副本数据到不同的设备,保证数据较高的可靠性。
两次映射完成数据的分布
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上即可。
我们有哪些输入
- CRUSH_HASH( PG_ID, OSD_ID, r ) ===> draw (搓一搓,得到一个随机数,r可认为是常量)。
- ( draw &0xffff ) osd_weight ===> osd_straw (随机数osd权重)。
- pick up high_osd_straw 。(挑选乘积最大的osd)
- 多次抽签。( r+1 继续下次抽签,如果挑选的osd重复,则r继续+1继续抽签,直到选够副本个数个osd )
pg到osd的映射过程
- 给出一个PG_ID,作为CRUSH_HASH的输入。
- CRUSH_HASH(PG_ID, OSD_ID, r) 得出一个随机数。
- 对于所有的OSD用他们的权重乘以每个OSD_ID对应的随机数,得到乘积。
- 选出乘积最大的OSD,这个PG就会保存到这个OSD上。
- 我们把r+1,再求一遍随机数,重复上述过程,选出乘积最大的OSD,如果和之前的OSD编号不一样,那么就选中它;如果和之前的OSD编号一样的话,那么再把r+2,再选一次,直到选出我们需要的三个不一样编号的OSD为止。
4
集群维护
- 新增/删除OSD(扩缩容) 首先根据配置信息与monitor通信,monitor将其加入cluster map,并设置为up或out状态,权重生效;删除osd过程相反。
- 自动化的故障恢复(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基本架构及数据分布原理相关推荐
- 世界500强是如何解决千亿流量留存问题的,《Ceph分布式存储架构》-使用CentOS 7部署 Ceph分布式存储架构-为他们解决什么问题。
文章目录 一.Ceph概述 1.1 Ceph介绍 1.2 Ceph各组件介绍 二.ceph集群部署实验 2.1 配置Ceph安装源 2.2 在xuegod63上安装ceph-deploy管理工具 2. ...
- 【Android架构师java原理详解】二;反射原理及动态代理模式
前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...
- 大型网站技术架构:核心原理与案例分析阅读笔记二
大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...
- 《大型网站技术架构:核心原理与案例分析》笔记05
<大型网站技术架构:核心原理与案例分析>笔记05 网站的课扩展性架构: 扩展性:指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力.表现在系统基础设施稳定不需要经常变更,应用之间 ...
- 一文讲透大型网站架构模式核心原理与案例分析
什么是模式?每一个模式描述了一个在我们周围不断发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复的工作. 也许互联网产品不是随便复制就能成功的,创新的产品更能为用户创造价 ...
- 京东购物车的 Java 架构实现及原理
转载自 京东购物车的 Java 架构实现及原理 今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码 问:购物车商品还 ...
- Zookeeper的集群架构以及读写原理
本文来说下Zookeeper的集群架构以及读写原理 文章目录 总体架构 Session Quorum模式 搭建3节点ZooKeeper集群 本文小结 总体架构 应用使用 ZooKeeper 客户端库来 ...
- 深入分析 iBATIS 框架之系统架构与映射原理【转】
深入分析 iBATIS 框架之系统架构与映射原理 许 令波 (xulingbo0201@163.com), Java 工程师, 淘宝网 简介: iBATIS 通过 SQL Map 将 Java 对象映 ...
- 阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章
阅读<大型网站技术架构:核心原理与案例分析>第五.六.七章,结合我们的系统,分析如何增加相应的功能,提高系统的可用性和易用性. 这三章主要讲述的是网站的可用性.伸缩性和可扩展性. 高可用架 ...
最新文章
- c语言错误2064,VC错误: error C2064: term does not evaluate to a function
- map评价吗 voc数据集可以用coco_【庖丁解牛】从零实现RetinaNet(九):使用COCO预训练权重在VOC上训练RetinaNet...
- 求字符串中最长无重复子序列
- python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象
- 提交代码前问自己七个问题!
- Oracle查询忽略大小写的实现方法
- Minor GC、Major GC、Full GC
- 201671010117 2016-2017-2 《Java程序设计》Java第二周学习心得
- Java从string数组创建临时文件
- Nginx进程以及事件处理模型
- SQL 数据库的自动备份(Procedures实现)
- hadoop 文件介绍
- python零基础学习书-Python零基础到进阶必读的书藉:Python学习手册pdf免费下载
- 文件图片随机划分训练集和验证集
- mybatis支持拼音、汉字模糊查询
- ba无标度网络python_python绘制BA无标度网络
- 黑苹果 Catalina 15 声卡定制
- C语言编程>第十七周 ⑤ 请补充fun函数,该函数的功能是:用来求出数组的最小元素在数组中的下标并存放在k所指的存储单元。
- TDengine总结物联网数据特点
- 【Python学习笔记】- 06 函数式编程