分布式存储Ceph 架构 以及 IO算法流程简介

Ceph 简介和特点

Ceph简介 : Ceph是一个统一的分布式存储系统,具有较好的性能、高可用性和可扩展性。

一个定义看上去会让初学者优点 “懵” ,为了有一个更深入 更直观的理解,下来我们分句来解读。

统一的分布式存储系统:

        即支持传统的块、文件存储协议,例如SAN和NAS;也支持对象存储协议,例如Swift.

        分布式存储:可以通过网络将数据分散在多台独立的设备上.

高性能:

  1.摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。

  2.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架  
        感知等。

  3.能够支持上千个存储节点的规模,支持TB到PB级的数据。 (1TB=1024GB,约等于一个固态硬盘的容量大小,能够存放一个不间断的监控摄像头录像(200MB/个),长达半年左右。   1PB=1024TB,容量十分嚣张,就很大。应用于大数据存储设备,如服务器等。 1EB =1024PB ,目前还没有单个存储器达到这个容量。)

高可用性:

  1.副本数可以灵活控制。

  2.支持故障域分隔,数据强一致性。

  3.多种故障场景自动进行修复自愈。

  4.没有单点故障,自动管理。

可扩展性:

  1.去中心化。

  2.扩展灵活。

  3.随着节点增加而线性增长。

通过这样的解读,是不是对Ceph 有了一个更加细致的了解,接下来我们来看看Ceph的架构。

Ceph的架构和核心组件

分布式存储Ceph 架构 以及 IO算法流程简介_第1张图片分布式存储Ceph 架构 以及 IO算法流程简介_第2张图片

Ceph 的核心存储系统为Raods,LibRados对底层Rados进行抽象与封装,对上层提供接口。

RGW:对象存储,其最基本的功能包括用户,存储桶,对象的增删改查,在此基础之上结合对象存储应用的特征,引申出更多的功能,比如在对象存储应用中,如果对一个存储桶或者对象没有任何访问的限制,该储存桶或对象就会变成公开的资源,任何人都可以访问。因此对存储桶和对象的访问控制变得尤为重要,存储桶和对象的访问功能成为了对象存储的基本功能之一。

RBD:就是Ceph里的块设备,一个4T的块设备的功能和一个4T的SATA类似,挂载的RBD就可以当磁盘用。

CpehFS:是一个支持POSIX接口的文件系统,它使用 Ceph 存储集群来存储数据。文件系统对于客户端来说可以方便的挂载到本地使用。Ceph FS构建在RADOS之上,继承RADOS的容错性和扩展性,支持冗余副本和数据高可靠性。

OSD:

用于集群中所有数据与对象的存储. 处理集群数据的复制、恢复、回填、再均衡. 并向其他osd守护进程发送心跳,然后向Mon提供一些监控信息. 在一个ceph集群里最少要两个Osd节点。

MDS(可选):

只有用cephfs时,也就是文件系统存储时,才需要配置MDS节点. 为ceph文件系统存储提供元数据计算、缓存与同步(也就是说,ceph块设备 和 ceph 对象存储不适用MDS),在ceph中,元数据也是存储在osd节点中的,mds类似于元数据的代理缓存服务器。

Monitor:监控整个集群的状态,维护集群的cluster MAP二进制表,保证集群数据的一致性。

这部分是对Ceph 核心组件的一个简单介绍,下来我们来看看Ceph的IO流程。

正常IO流程:

分布式存储Ceph 架构 以及 IO算法流程简介_第3张图片

 

1.client 创建 cluster handler

2.clint 读取配置文件

3.client 连接上 monitor , 获取map 信息

4.client 读写 io 根据crush 算法请求对应的主osd 数据节点.

5. 主osd数据节点同时写入另外两个副本节点数据

6. 等待主节点以及另外两个副本节点写完数据状态

7. 主节点及副本节点写入状态都成功后,返回给client,io写入完成

新主IO流程图:

        新加入的OSD 取代了原有的OSD,由于新OSD 上为还未创建WG,不存在数据,那么PG 上的 I/O 无法进行.

分布式存储Ceph 架构 以及 IO算法流程简介_第4张图片

1.client 连接 monitor 获取集群map 信息 .

2.同时 新主 osd1 由于没有pg数据会主动上报 monitor 告知让 osd2 临时接替为主.

3.临时主 osd2会把数据全量同步给新主osd1.

4.client IO 读写直接连接临时主osd2进行读写.

5.osd2 收到读写io,同时写入另外两个副本节点.

6.等待osd2以及另外两个副本写入成功.

7.osd2 三份数据都写入成功返回给client , 此时client io 读写完毕.

8.如果osd1 数据同步完毕,临时主osd2会主动交出角色.

9.osd 1 成为主节点 ,osd2 变成副本.

下面我们再来看看Ceph的IO算法流程。

分布式存储Ceph 架构 以及 IO算法流程简介_第5张图片

总体的IO算法流程,可以分为三个映射:

三个映射:

  1.File用户需要读写的文件。  File → Object映射:

     (1) ino(File的元数据,File的唯一id)。

     (2) ono(File切分产生的某个Object的序号,默认4M切分一个块大小)。

     (3) oid(Object id: ino + ono)

  2.Object是RAODS需要的对象。  Object → PG映射:

     Ceph指定一个静态hash函数计算oid的值,将oid映射成一个近似均匀分布的伪随机值,然后和mask按位相于,得到pgid。

     hash(oid) & mask → pgid

     mask = PG总数m(m为2的整数幂) -1

  一个PG负责组织若干个Object,而一个Object只能被映射到一个PG———— 一对多映射。

  3.PG(Placement Group),OSD(对象存储守护程序).    PG → OSD映射:

     PG是一个逻辑概念,用途是对Object的存储进行组织和位置映射,一个PG里面会有很多个Object。采用CRUSH算法,将pgid代入其中,然后得到一组OSD。

     CRUSH(pgid) → (osd1,osd2,osd3)

  一个PG会被映射到多个OSD上,而每个OSD都会承载大量的PG ———— 多对多映射。

接下来抛出两个问题,带着问题来看,会使对流程的学习更深入更细致。

为什么切片:

       为了数据的均匀分布和负载均衡。

为什么在PG → OSD 映射上不采用hash算法而是CRUSH算法?

   CRUSH(pgid) → OSD

      改为   HASH(pgid) % m(osd数量) → OSD   ?

  弊端: 1.如果挂掉一个OSD ,模运算的余数都会发生变化,也就是说PG映射的磁盘发生了变化,更直白的说就是,PG上的数据要从一个磁盘全部迁移到另一个磁盘上去,优秀的架构应该在磁盘损坏时使数据迁移量降到最低,CRUSH可以做到。同样的如果扩容,OSD的数量增加了,也会导致PG 在OSD之前的胡乱迁移,但是CRUSH可以保证数据向新增加的机器均匀扩散。

           2.如果要保存多个副本,希望的结果是得到多个OSD的输出,但是HASH只能获得一个,但是CRUSH可以获得多个。

      1.因为hash算法是一对一映射关系。

      2.PG → OSD 的映射是动态的多对多映射关系。

          因为一个PG会被映射到多个OSD上,而每个OSD都会承载大量的PG,而且由于cehp的高可用性 OSD节点是有副本机制的 , OSD数量可能增加也可能减少,所以是动态的多对多映射关系,所以hash不适用。

 最后了解一个Ceph的精华--------CRUSH算法。

CRUSH算法(Controlled Scalable Decentralized Placement of Replicated Data):可控的、可扩展的、分布式的副本数据放置算法。

简单总结CRUSH算法: 跟据数据唯一标识符pgid、OSD权重以及数据备份策略,完成从多个PG到多个OSD的多对多的数据存储位置定位。

 为什么不细致的讲解CRUSH算法?

答:我也不是很懂。

 

你可能感兴趣的:(分布式存储,Ceph,笔记,分布式,架构)