Ceph分布式存储简介

Ceph基础知识和基础架构

0、Ceph分为三部分:RADOS关于数据存储分布,CRUSH关于伪随机算法,Ceph系统

1、Ceph是一个可靠的、自动中均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph划分为三大块,分别是对象存储、块设备存储和文件系统存储。在虚拟化中,常常用到的时Ceph的块设备存储,比如在Openstack项目中,Ceph的块设备存储可以对接Openstack的cinder后端存储,Glance的镜像存储和虚拟机的数据存储,比较直观的时Ceph集群可以提供一个raw格式的快存储来作为虚拟机的硬盘。

Ceph相比其他存储的优势点在于它不单单时存储,同时还充分利用存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法,HASH算法,使得它不存在传统的单点故障问题,且随着规模的扩大性能并不会受到影响。

2、Ceph核心组件

Ceph的核心组件包括Ceph OSD、Ceph Monitor和Ceph MDS。

Ceph OSD:全称是Ceph Object Storage Device,他的主要功能是存储数据,复制数据,平衡数据,恢复数据等。与其他OSD之间进行心跳检测等,并将一些变化情况上报给Ceph Monitor。一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD。

Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,对于Ceph OSD Deamon而言,Linux文件系统现行的支持了其扩展性,一般Linux文件系统有好多种,比如XFS、EXT4、BTRFS等,BTRFS虽然有很多优点,但是还没有达到生产环境所需的稳定性,一般比较推荐XFS。

伴随OSD的还有一个概念叫Journal盘,一本写数据到Ceph集群时,都是先将数据写入Journal盘中,然后每隔一段时间再将journal盘中的数据刷新到文件系统中。为了是读写的时延更小,journal盘都是采用SSD,一般分配10G以上,越多越好,Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD功能很快做小的写操作;一个随机写入首先写入在上一个连续类型性的Journal,然后刷新到文件系统,这给了文件系统虚构的时间来合并写入磁盘,一般情况下使用SSD作为OSD的Journal可以有效缓冲突发负载。

Ceph Monitor:它是一个监视器,负责监视Ceph集群,维护Ceph集群的健康状态,同时维护者Ceph集群中的各种Map图,比如OSD Map,MonitorMap 、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS(可靠的自动的分布式对象存储)的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和Object id等计算出数据最终存储位置。 Monitor集群管理维护Cluster map。Cluster map时整个RADOS系统的关键性数据结构,管理集群中的所有成员、关系、属性等信息以及数据在系统中的分布情况。

ClusterMap:

  1. 管理cluster的核心数据结构
  2. 指定OSDs的数据分布信息
  3. Monitor上存有最新副本
  4. 依靠epopch增加来维护及时更新
  5. 增量信息

Ceph MDS:全称是Ceph MetaData Server,主要是保存的文件系统的元数据,但对象存储和块存储设备时不需要使用该服务的。

元数据主要 要是描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

数据存放:

1、Object到PG的映射,PG是Objects的逻辑集合,相同PG里的Object会被系统分发到相同的OSDs集合中。由Object的名称通过Hash算法得到的结果结合其他一些修正参数可以得到Object所对应的PG

2、RADOS系统根据Cluster Map将PGs分配到相应的OSDs,这组OSDs正是PG中的Objects数据的存储位置。RADOS采用CRUSH算法实现了一种稳定、伪随机的Hash算法。CRUSH实现了平衡的和与容量相关的数据分配策略。CRUSH得到的一组OSDs还不是最终的数据存储目标,需要经过初步的filter,因为对于大规模的分布式集群,宕机等原因使得部分节点可能失效,filter就是为过滤这些节点,如果过滤后存储目标不能满足使用则阻塞当前操作。

错误检测和恢复:

  • 错误检测:

    • 利用心跳
    • 上报Monitor
    • 更新Map
  • 错误恢复:

    • 主OSD主持恢复工作
    • 若主OSD宕掉,二级OSD选择一个顶上

数据条带化:

  • 由于存储设备吞吐量的限制,影响性能和可伸缩性。
  • 跨多个存储设备的连续块条带化存储信息,以提高吞吐量和性能。
  • Ceph条带化相似与RAID0
    • 注意:ceph条带化属于Client端,不再RADOS范畴。

条带化参数:

Object Size:

足够大可以容纳条带单元,必须容纳一个或者多个条带单元。

Stripe Width:

一个条带单元的大小,除了最后一个,其他必须一样大。

Stripe Count:

连续写入一系列的对象的个数

注意:参数一但设置将补课改变,提前做好性能测试。

-------------------------------------------

RADOS想解决什么问题?

​ 在存储基础知识一中,讲到了对象存储,对象存储结合了文件存储可共享以及块存储快的优点,其设计方案是通过管理节点又叫元数据服务器(装有对象存储管理软件的服务器)来存对象的属性,可以理解为一个数据分布表-索引表,数据存在分布式服务器OSD上。用户首先访问元数据服务器,了解了数据分布情况之后再去相应的位置获取数据。此时,多台OSD同时对外传输数据,实现加速。

​ 由此可见,OSD只是很多块通过网络连接的存储设备,客户端需要首先问管理节点数据在哪些OSD上,再访问OSD,这样的话,管理节点集群承担的任务比较中,当OSD数量成千上万时,管理节点集群的负载就吃不消了。那OSD本身能不能分担一些管理节点集群的任务呢?人们一直想将块分配策略(block allocation)和安全强制措施分布到OSD上,让OSD获得一定的智能(这边我理解的智能是类似于操作系统的调度管理,可以实现一些任务分配的自动化)从而让客户端可以直接访问OSD上的data,简化了数据分布,消除了IO瓶颈。(这边我的理解是这种智能的增加像是RAID的进化一样,在存储设备上集成一定类似于操作系统,文件系统的功能,实现数据的自动分配,减少人为设定)

​ 所以在OSD上集成CPU,网络接口,本地缓存,基础的磁盘或者RAID(希望OSD变得更智能)。但是采用这种结构的大规模系统无法利用设备的智能,即使OSD已经具有智能分配的能力,但设备本身还是被动的执行读写命令。因此,当存储集群增长到数千节点或更多时,数据迁移的一致性管理,错误检测,错误恢复将给客户端,控制器以及元数据目录目录节点带来压力,限制可扩展性。

​ RADOS是一个可靠的自动的分布式对象存储,利用OSD设备本身的智能,来解决集群中存在的数据一致性访问,冗余存储,错误检测和数据恢复等问题。使得数据和负载动态地分布在不均匀的存储集群上。

​ 存储系统是动态变化的,包括扩建,更替。设备出错和恢复都是基于连续数据的基础上,使大量数据被建立/删除。RADOS确保数据分布对系统的一致性,基于cluster map的对象读写的一致性。cluster map被复制到所有节点上,包括客户端,并被Lazy propagation的增量更新。

​ 存储节点上有完整的数据在系统中的分布信息,使得设备可以半自治地通过类似点对点的协议来自我管理数据复制,一致和安全过程更新,参与错误检测以及响应错误和数据对象赋值迁移带来的数据分布变化。这得益于OSD本身的智能潜力,减轻了管理cluster map主副本的小型管理集群上的压力,从而使存储集群可以扩展到数千节点。

​ 我的理解:原生对象存储是有几台管理节点,管理其他几台OSD,OSD本身并不需要智能,只是存储设备,被动的执行读写命令,关于数据迁移,错误检测等等工作都在管理节点上,所以当OSD节点非常多时,管理节点就不够用了,管理压力很大;而RADOS的方案,时OSD本身增加一些任务处理的能力,因此可以承担起原来需要在管理节点上才能完成的任务

img

译文:成千上万的OSD集群存储系统中的所有对象,一个小的,紧密耦合的监视器集群共同管理指定集群成员和数据分布的集群映射,每个客户机向应用程序公开一个简单的存储接口。

​ RADOS系统包括大量OSD节点(包括一个CPU、一些易失性内存、一个网络接口、本地磁盘或RAID)和规模小的负责管理的monitor(有单机进程并且需要少量的本地内存 )集合。

数据的放置:

​ RADOS使用CRUSH伪随机算法,将数据伪随机分布到设备上,当新设备增加时,一个随机的现存数据的副本迁移到新设备上用以实现负载均衡,这个过程涉及两个方面:1、计算正确的对象存储位置2、不需要维护一个大型的集中分配表

​ 对象先被映射到PG组,PG组表示逻辑上的对象集合,每个对象的PG由以下公式得到:pgid=(r,hash(o)&m),r表示数据主从复制的等级,hash(o)表示对象名为o的键值,m表示控制PG总数的位掩码。

​ PG组根据cluster map来映射到OSD节点上,每个PG被映射到有序的包含r个OSD节点的链表中,该映射通过CRUSH算法来实现(一个PG往一组设备OSD上映射),CRUSH算法和hash算法的相似之处在于其PG值是确定的,但却是为随机分布的;但不同的是,CRUSH是未定的,当一个或多个设备加入或者离开集群时,PGs保持不变,CRUSH负责转移足够的数据来维护一个均衡的分布,HASH则更倾向与强制重新映射。

在于其PG值是确定的,但却是为随机分布的;但不同的是,CRUSH是未定的,当一个或多个设备加入或者离开集群时,PGs保持不变,CRUSH负责转移足够的数据来维护一个均衡的分布,HASH则更倾向与强制重新映射。

-------------------------------------------