基本概念
一、Rados
本身是一个完整的对象存储系统,Ceph所有的存储功能都是基于Rados实现。
二、Mon
Mon负责监控集群管理元数据表。同时维护着Ceph集群中的各种Map图,比如OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如:客户端向OSD发送读写请求之前,需要从MON中拿到最新的集群表,利用CRUSH算法计算出来数据存储位置后,直接将读写请求发送至对应的OSD。
三、OSD
OSD 负责处理客户端读写请求,功能(存储数据,处理数据复制、恢复、再均衡,与其它OSD间进行心跳检查等),并将一些变化情况上报给Ceph Monitor。
四、RGW
RGW最直接的理解就是一个协议转换层,把从上层应用符合S3或Swift协议【三级存储:Account/Bucket/Object(账户/桶/对象)】的请求转换成rados的请求, 将数据保存在rados集群中。rgw是一个监听RESTfulAPI访问的后台进程,s3 API和Swift APl使用同一个命名空间,即共享同一个命名空间;所以,你可以用其中一个接口写入数据而又用另外一个接口读出数据。
Frontend:与客户端使用HTTP RESTful接口交互,可选apache, nginx或civetweb(默认)。
Operation:操作,处理不同类型的接口,如:S3, Swift, Admin等。
Backend:与存储后端交互,读写数据,运行数据管理。
RGW应用到rados中的对象分为2类,一类是普通对象,相当于普通文件的存储。还一类是omap对象,用于存储K-V对象。
五、PG放置策略组
它是对象的集合,该集合里的所有对象都具有相同的放置策略:对象的副本都分布在相同的OSD列表上。服务端数据均衡和恢复的最小粒度就是PG;
关系说明:
(1) PG有主从之分,对于多副本而言,一个PG的主从副本分布在不同的OSD上;
(2) 一个对象只能属于一个PG,一个PG包含很多个对象
(3) 一个PG对应于一个OSD列表,PG的所有对象对存放在对应的OSD列表上
六、Rados对象
数据存储的基本单元,一般默认为4MB
一个对象有三部分组成:
(1) 对象标志(ID):唯一标识一个对象。
(2) 对象的数据:其在本地文件系统中对应一个文件,对象的数据就保存在文件中。
(3) 对象的元数据:以Key-Value(键值对)的形式,可以保存在文件对应的扩展属性中。
七、POOL
Pool是存储对象的逻辑分区,规定了数据冗余的类型以及对应的副本分布策略。目前实现了两种pool类型:replicated类型和Erasure Code类型。
关系说明:
(1) 一个pool由多个PG构成,一个PG只能属于一个POOL
(2) 同一个Pool中的PG具有相同的类型,比如,如Pool为副本类型,则Pool中所有的PG都是多副本的
八、Object
存储在系统中数据最小单位,对象的元数据和数据体会分别存储。元数据通常是一组描述对象信息的Key-Value对,包括对象的名称,访问权限,类型等,也是作为一个对象存储在元数据池中,值存在在对象所在磁盘文件的属性中。
九、levelDB
leveldb等本地k-v存储系统用来保存对象的元数据,rados之所增加这种方式,是因为本地文件系统的扩展属性能保存的数据量限制。
Ceph特性
Journal盘
一般写数据到Ceph集群时,都是先将数据写入到Journal盘,然后每隔一段时间再将Journal盘中的数据刷新到文件系统中。一般为了使读写时延更小,Journal盘都是采用SSD,这给了文件系统足够的时间来合并写入磁盘,一般情况下使用SSD作为OSD的journal可以有效缓冲突发负载。
Journal的作用类似于mysql innodb引擎中的事物日志系统。当有突发的大量写入操作时,ceph可以先把一些零散的,随机的IO请求保存到缓存中进行合并,然后再统一向内核发起IO请求。journal的io是非常密集的,很大程度上也损耗了硬件的io性能,所以通常在生产环境中,推荐使用ssd来单独存储journal文件以提高ceph读写性能,读写时延更小。
云存储容错机制
1、基于副本冗余的容错机制
原有数据复制成多份,副本存放在集群中不同节点上,保证数据可靠性,三副本配置提供了较高的读吞吐带宽,可恢复性高,弊处极大降低存储空间利用率,特别对于海量非结构化数据和冷存储这些在意性价比的应用。
2、基于纠删码的容错机制
原有数据文件分成k个大小相等的数据块,按照纠删码编码,得到n个带有一定冗余编码数据,存储在不同的节点上,读取数据时,只要去任意k个数据块就能恢复原始数据。
例:(4+2),将文件分为4个大小相等的数据块,编码后生成另外2个校验块,从所有的6个码块中取任意4个就可恢复原始数据。可容错数为2;最多允许2个码块丢失。
纠删码在读取时必须由数据分块重组数据对象,纠删码在随机写入,特别是改写和重构(Rebuild)时产生的I/O惩罚较大,对应的集群网络流量比副本保护模式要大。
Pool中PG设置
一个Pool里设置的PG数量是预先设置的,PG的数量不是随意设置,需要根据OSD的个数及副本策略来确定;线上尽量不要更改PG的数量,PG的数量的变更将导致整个集群动起来(各个OSD之间copy数据),大量数据均衡期间读写性能下降严重;扩容就以 Pool 为维度为扩容,通过新增Pool来实现(Pool通过crushmap实现故障域隔离)。
故障域划分-针对大集群
1、没有故障域的划分,整个集群处在未隔离的资源池
2、数据存储、副本copy都可能带来全局影响
3、crushmap 将整个集群的OSD划分为一个个故障域,类似将集群按业务划分成多个小集群,每个pool只会用到特定
OSD,这样一旦某个OSD损坏,影响的只是某个业务的某个Pool,故障控制在小范围。
crushmap划分故障域,将pool限制在特定的osd list上,osd的损坏只会引起这个pool内的数据均衡,不会造成全局影响
多副本及强一致性策略
三副本模式下,客户端过来一个写请求数据会首先被写入到primary OSD上去,primary OSD会进一步将数据复制到secondary和其它tertiary OSD上去并一直等待他们的完成通知,最终完成确认发送给client。
根据pg map可以查看数据落在哪几个OSD上