【Ceph浅析笔记】Ceph的工作原理

本章主要对Ceph的工作原理进行介绍。

寻址过程

如果Client来了一个请求,不管个请求是读还是写都需要先寻址,才能找到数据应该放哪里或者说需要从哪里去。

之前我们说过Ceph的寻址方式是基于计算的,这样就避免的查表,也避免了使用一个单独的元数据服务器。

概述

对于Client传来的一个File,为了方便处理,我们可以将其分割为若干大小相同的小块Object

然后可以将这些Object映射到OSD上,如果使用一种固定的映射算法,则一个Object每次都会固定的映射到一组OSD上,那么如果这个OSD坏了呢?则无法迁移到其他的OSD上。

同时一个Object可以给会映射到若干的OSD上,所以这个OSD会定期与其他的OSD进行信息的交互,而每个OSD上承载的Object可能达数百万个,那么如果OSD要进行的信息交互将暴涨至数千万次,维护成本较高。

那么为了实现Object与OSD之间的动态映射,以及降低OSD与Object之间的信息维护开销,则可以引入一个中间层PG(Placement Group)

PG首先会对Object进行组织。一个Object只能映射到一个PG里面。而一个PG可以组织多个Object。也就是说PG与Object是“一对多”的映射关系

另外PG还会与OSD进行映射。每个PG一般会复制成3副本放到3个OSD上。而每个OSD上也会承载多个PG。

映射过程

那么file——Object——PG——OSD之间的映射是如何完成的呢?

  • 首先是file —— Object的映射

    这个比较简单,就是按照一定的大小对file进行切割即可,相当于RAID中的条带化处理

    切割以后,我们可以对object进行编号,也即oid(Object ID)

    每个file都有一个唯一的元数据ino,然后再把file切分后产生的序号连缀在一起,即可构成oid

    比如元数据为fileName的文件成分为三个Object,oid即为fileName0,fileName1,fileName2。

    需要注意的是ino必须唯一

  • 然后是Object—— PG

    每个Object都要独立的映射到一个PG里面。

    我们之前提供,数据块最好能均匀在底层,这样即可以充分利用底层硬件,有可以平摊风险。那么怎么均匀分布呢?

    首先可以将oid进行哈希,这样会得到一个近似均匀分布的伪随机值,然后我们要考虑的是把Object放到PG里面去了。假设PG数为m,那么最简单的就是在m个PG中随机的选一个,那么可以设定一个长度为m-1的掩码,然后将HASH得到的伪随机值于mask按位相与,最终得到PG序号(pgid)

    现在我们保证了Object与PG之间近似均匀的映射,然后Object的size相同,这样就可以保证PG中存储的Object的总数据量近似均匀。

    不过需要注意的是Object与PG的数量较多的时候,这种伪随机关系才近似均匀性才能成立。

  • 最后是PG——OSD映射

    之前讲的Object与PG的映射其实是静态的,也就是一个Object通过这个运算一定会映射到某个PG里面。

    但是我们加上PG层的目的是可以实现动态迁移,也就是说"Object——PG"的结构不是绝对不变的,而是受到其他因素的影响,比如

    • 当前系统的状态,也就是Cluster Map。当系统中的OSD状态、数量发生变化的时候,ClusterMap可能发生变化。因此映射关系也会变化。
    • 预先配置的存储策略。

      最开始的时候管理员可以配置一些策略,比如说一个PG分到的3个OSD需要位于不同的服务器或者说机架上,这样就算一个服务器宕掉了,还有其他的副本可用。

    所以说这一层的映射公式需要满足动态特性,可以让PG根据需要动态迁移到不同的OSD组合上。

    此次映射中使用的算法就叫CRUSH算法

写数据的流程

Ceph的写与读的流程大体相同,本章主要介绍写过程。

当Client要向Ceph集群写入一个file时,首先要在Client本地将file映射为若干Object,然后使用HASH和CRUSH算法映射成3个OSD。序号最靠前的OSD就是Primary OSD,后两个为Secondary OSD和Tertiary OSD。

现在Client已经知道数据要写到哪些OSD里面了,首先向Primary OSD发起写请求,然后由Primary OSD同步复制两个副本到其余的OSD中。

当Secondary 和Tertiary完成写入了以后,返回ACK给 Primary,最后由Primary向Client确认Object的写入。

很显然这种做法延迟比较长,必须等所有的OSD都落到磁盘上了以后才会真正返回ACK。可以进行一些优化。当各个OSD将数据写入内存缓冲区后,先向Client发送 一次确认,当各个OSD都将数据落到磁盘后,再向Client发送一个最终的ACK。

总之,不需要依赖其他的系统模块,只需要Client即可完成OSD的寻址。所以Client可以与OSD进行并行操作,这样工作压力可以尽可能均匀分担,从而避免单个OSD成为性能瓶颈。

如何同步信息

下面两章我们介绍了如何寻址,如何写入,他们都需要使用到cluster map这个元数据,那么如何在所有节点上同步cluster map呢?

由若干monitor共同监控所有OSD的状态,然后会形成cluster map的master版本。再将这个版本同步到其他的OSD和client中。

不过monitor不是主动询问所有OSD的状态的,而是由OSD主动上报自己的状态信息,比如说OSD加入或者异常的时候,都需要主动通知到monitor

那么Cluster Map需要包含哪几个方面的信息呢?

  • 首先是OSD的网络地址,这样才可以找到OSD在那里。
  • 然后当然是OSD的状态,也就是OSD是否正常工作,是否在至少一个PG里面。

另外还需要包含CRUSH算法的一些配置参数。

还有个问题,Cluster Map在所有的OSD之间进行同步,极有可能两个OSD持有的Cluster Map的版本不同,那么怎么进行区分了?可以使用 版本号,时间越靠后的版本号越大,所以monitor手上的版本号一定最大。当任意两方在通信的时候发现彼此的版本号不相同,则需要将高版本的同步到另外的节点上。

OSD上线

当一个新的OSD上线后,首先会根据配置信息主动向monitor进行报告。

然后Monitor会把它加入Cluster Map中,然后更新状态,最后把最新版的Cluster Map发给这个OSD。

接下来,这个OSD会计算出自己对应的PG,以及这个PG还会放到哪些其他的OSD。然后这个新的OSD会与这些OSD取得联系,如果

  • 此时发现这个PG只放了2个副本,而预先配置的副本数应该是3。说明之前肯定有OSD出现了故障,所以其他OSD把这个PG的内容复制给新的OSD,最后再更新一次状态,说明OSD已经可以承载PG了。

    这就是一个failure recovery的过程

  • 如果此时发现OSD一切正常,则用新的OSD替换到现在的一个OSD,并承担数据,重新更新cluster map的内容。这就是一个re-balancing的过程。

那么failture detection的过程又是什么呢?如果一个OSD发现自己与共同承载一个PG的另一个OSD无法通信,它会上报给monitor。或者说,OSD的守护进程发现自己的状态异常,同样会上报给monitor。如果在一段时间以后,OSD仍然无法恢复正常,则状态会设置为down and out,更新cluster map并扩散。

更新cluster map会不会有广播风暴

之前我们了解了cluster map数据结构并不大,也就是说即使这个集群中有上千个OSD,cluster map的扩散也不会占用太大的带宽。

而且cluster map也不会频繁的更新。

最关键的是cluster map是以增量的形式扩散,只会把两个版本的差异发送给另一方。

同时monitor不是map的版本一更新就广播给大家。它只会在有OSD上报信息的时候才会同步一次,所以这种方式是异步且lazy的。

所以因为map更新而导致广播防暴的几率并不高。

原文地址:https://www.cnblogs.com/dy2903/p/8513713.html

时间: 2024-07-30 00:20:40

【Ceph浅析笔记】Ceph的工作原理的相关文章

【Ceph浅析笔记】Ceph是什么.md

Ceph是什么 什么是Ceph?首先我们应该明确,Ceph是一种分布式存储系统,所谓分布式,指的是Ceph可以部署在多台服务器上,通过多台服务器并行处理来对外提供高性能的读写块. 同时Ceph除了能提供块存储,还可以提供文件存储.对象存储. Ceph的优势 实际上Ceph不是一个才出现的开源项目,而是走过了 7年的路程,那么Ceph有什么样的优势呢? Ceph的优势在于它的设计思想:无需查表,算算就好.也就是说它可以充分利用服务器的计算能力,消除了对单一中心节点的依赖,可以实现真正的无中心结构

Android学习笔记View的工作原理

自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还需要掌握View常见的回调方法.而对于那些具有滑动效果的自定义View,我们还需要处理View的滑动,如果遇到滑动冲突则需要处理相应的滑动冲突. 下面是View的常见回调方法: 构造方法 onAttach onVisibilityChanged onDetach onFinishInflate on

【知了堂学习笔记】ajax工作原理

ajax工作原理 什么是ajax? ajax 的全称是Asynchronous JavaScript and XML,其中,Asynchronous 是异步的意思.从全称中就可以看出AJAX = 异步 JavaScript 和 XML.  AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 使用 AJ

一篇笔记整理JVM工作原理

前言: 想提高Java开发,了解jvm是必不可少的.它让开发者了解他们的代码,jvm是如何变异与运行.深入了解jvm:会让你的代码写的高效,逐步成为大神 下面介绍jvm的基本知识 >>数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值. "引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型包括:byte,boolean(1

ceph结构和工作原理

Ceph是统一分布式存储系统,具有优异的性能.可靠性.可扩展性.Ceph的底层是RADOS(可靠.自动.分布式对象存储),可以通过 LIBRADOS直接访问到RADOS的对象存储系统.RBD(块设备接口).RADOS Gateway(对象存储接口).Ceph File System(POSIX接口)都是基于RADOS的. Ceph存储系统的逻辑层次结构如下图所示: 自下向上,可以将Ceph系统分为四个层次: (1)基础存储系统RADOS(Reliable, Autonomic,Distribut

ceph工作原理和安装

一.概述 Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目.随着云计算的发展,ceph乘上了OpenStack的春风,进而成为了开源社区受关注较高的项目之一.Ceph有以下优势: 1. CRUSH算法 Crush算法是ceph的两大创新之一,简单来说,ceph摒弃了传统的集中式存储元数据寻址的方案,转而使用CRUSH算法完成数据的寻址操作.CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房.机架感知等.C

Ceph学习之路 之Ceph的工作原理及流程

一.元数据和元数据管理 (1)元数据 在学习Ceph之前,需要了解元数据的概念.元数据又称为中介数据.中继数据,为描述数据的数据.主要描述数据属性的信息,用来支持如指示存储位置.历史数据.资源查找.文件记录等功能.通俗地说,就 是用于描述一个文件的特征的系统数据,比如访问权限.文件拥有者以及文件数据库的分布信息(inode)等等.在集群文件系统中,分布信息包括文件在磁盘上的位置以 及磁盘在集群中的位置.用户需要操作一个文件就必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性

C++学习笔记27,虚函数的工作原理

C++规定了虚函数的行为,但是将实现交给了编译器的作者. 通常,编译器处理虚函数的方法是给每一个对象添加一个隐藏成员.隐藏成员中保存了一个指向函数地址数组的指针. 这个数组称为虚函数表(virtual function table,vtbl).虚函数表中存储了为类对象进行声明的虚函数的地址. 例如:基类对象包含一个指针,该指针指向基类的虚函数表. 派生类对象包含一个指针,该指针指向一个独立的虚函数表.如果派生类提供了虚函数的新定义,虚函数表将保存新的函数地址. 如果派生类没有重新定义虚函数,虚函

ceph学习笔记之二RADOS

Ceph学习笔记之二RADOS 一.RADOS架构 在RADOS架构中主要包含2个部分组件: 1.MON(Monitor) 由少量的Monitor节点构成的强耦合,小规模集群:负责管理Cluster Map. 2.OSD(Object Storage Device) 由数量可变的 大规模磁盘设备组成的集群,负责存储所有Object数据. 二.Monitor详解 在前面已经简单对其MON进行描述,在这个地方我们再次对MON进行详细解读.正如其名Monitor是负责监视整个集群运行状态的,这些信息都