1 Ceph基础介绍算法
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:OSD的英文全称是Object Storage Device,它的主要功能是存储数据、复制数据、平衡数据、恢复数据等,与其它OSD间进行心跳检查等,并将一些变化状况上报给Ceph Monitor。通常状况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,固然一个分区也能够成为一个OSD。数据结构
Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,对于Ceph OSD Deamon而言,Linux文件系统显性的支持了其拓展性,通常Linux文件系统有好几种,好比有BTRFS、XFS、Ext4等,BTRFS虽然有不少优势特性,但如今还没达到生产环境所需的稳定性,通常比较推荐使用XFS。架构
伴随OSD的还有一个概念叫作Journal盘,通常写数据到Ceph集群时,都是先将数据写入到Journal盘中,而后每隔一段时间好比5秒再将Journal盘中的数据刷新到文件系统中。通常为了使读写时延更小,Journal盘都是采用SSD,通常分配10G以上,固然分配多点那是更好,Ceph中引入Journal盘的概念是由于Journal容许Ceph OSD功能很快作小的写操做;一个随机写入首先写入在上一个连续类型的journal,而后刷新到文件系统,这给了文件系统足够的时间来合并写入磁盘,通常状况下使用SSD做为OSD的journal能够有效缓冲突发负载。编程语言
Ceph Monitor:由该英文名字咱们能够知道它是一个监视器,负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph集群中的各类Map图,好比OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的全部成员、关系、属性等信息以及数据的分发,好比当用户须要存储数据到Ceph集群时,OSD须要先经过Monitor获取最新的Map图,而后根据Map图和object id等计算出数据最终存储的位置。分布式
Ceph MDS:全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不须要使用该服务的。性能
查看各类Map的信息能够经过以下命令:ceph osd(mon、pg) dump
3 Ceph基础架构组件
从架构图中能够看到最底层的是RADOS,RADOS自身是一个完整的分布式对象存储系统,它具备可靠、智能、分布式等特性,Ceph的高可靠、高可拓展、高性能、高自动化都是由这一层来提供的,用户数据的存储最终也都是经过这一层来进行存储的,RADOS能够说就是Ceph的核心。
RADOS系统主要由两部分组成,分别是OSD和Monitor。
基于RADOS层的上一层是LIBRADOS,LIBRADOS是一个库,它容许应用程序经过访问该库来与RADOS系统进行交互,支持多种编程语言,好比C、C++、Python等。
基于LIBRADOS层开发的又能够看到有三层,分别是RADOSGW、RBD和CEPH FS。
RADOSGW:RADOSGW是一套基于当前流行的RESTFUL协议的网关,而且兼容S3和Swift。
RBD:RBD经过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。
CEPH FS:CEPH FS经过Linux内核客户端和FUSE来提供一个兼容POSIX的文件系统。
4 Ceph数据分布算法
在分布式存储系统中比较关注的一点是如何使得数据可以分布得更加均衡,常见的数据分布算法有一致性Hash和Ceph的Crush算法。Crush是一种伪随机的控制数据分布、复制的算法,Ceph是为大规模分布式存储而设计的,数据分布算法必须可以知足在大规模的集群下数据依然可以快速的准确的计算存放位置,同时可以在硬件故障或扩展硬件设备时作到尽量小的数据迁移,Ceph的CRUSH算法就是精心为这些特性设计的,能够说CRUSH算法也是Ceph的核心之一。
在说明CRUSH算法的基本原理以前,先介绍几个概念和它们之间的关系。
存储数据与object的关系:当用户要将数据存储到Ceph集群时,存储数据都会被分割成多个object,每一个object都有一个object id,每一个object的大小是能够设置的,默认是4MB,object能够当作是Ceph存储的最小存储单元。
object与pg的关系:因为object的数量不少,因此Ceph引入了pg的概念用于管理object,每一个object最后都会经过CRUSH计算映射到某个pg中,一个pg能够包含多个object。
pg与osd的关系:pg也须要经过CRUSH计算映射到osd中去存储,若是是二副本的,则每一个pg都会映射到二个osd,好比[osd.1,osd.2],那么osd.1是存放该pg的主副本,osd.2是存放该pg的从副本,保证了数据的冗余。
pg和pgp的关系:pg是用来存放object的,pgp至关因而pg存放osd的一种排列组合,我举个例子,好比有3个osd,osd.一、osd.2和osd.3,副本数是2,若是pgp的数目为1,那么pg存放的osd组合就只有一种,多是[osd.1,osd.2],那么全部的pg主从副本分别存放到osd.1和osd.2,若是pgp设为2,那么其osd组合能够两种,多是[osd.1,osd.2]和[osd.1,osd.3],是否是很像咱们高中数学学过的排列组合,pgp就是表明这个意思。通常来讲应该将pg和pgp的数量设置为相等。这样说可能不够明显,咱们经过一组实验来体会下:
先建立一个名为testpool包含6个PG和6个PGP的存储池
ceph osd pool create testpool 6 6
经过写数据后咱们查看下pg的分布状况,使用如下命令:
ceph pg dump pgs | grep ^1 | awk '{print $1,$2,$15}'
dumped pgs in format plain
1.1 75 [3,6,0]
1.0 83 [7,0,6]
1.3 144 [4,1,2]
1.2 146 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
第1列为pg的id,第2列为该pg所存储的对象数目,第3列为该pg所在的osd
咱们扩大PG再看看
ceph osd pool set testpool pg_num 12
再次用上面的命令查询分布状况:
1.1 37 [3,6,0]
1.9 38 [3,6,0]
1.0 41 [7,0,6]
1.8 42 [7,0,6]
1.3 48 [4,1,2]
1.b 48 [4,1,2]
1.7 48 [4,1,2]
1.2 48 [7,4,1]
1.6 49 [7,4,1]
1.a 49 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
咱们能够看到pg的数量增长到12个了,pg1.1的对象数量原本是75的,如今是37个,能够看到它把对象数分给新增的pg1.9了,恰好是38,加起来是75,并且能够看到pg1.1和pg1.9的osd盘是同样的。
并且能够看到osd盘的组合仍是那6种。
咱们增长pgp的数量来看下,使用命令:
ceph osd pool set testpool pgp_num 12
再看下
1.a 49 [1,2,6]
1.b 48 [1,6,2]
1.1 37 [3,6,0]
1.0 41 [7,0,6]
1.3 48 [4,1,2]
1.2 48 [7,4,1]
1.5 86 [4,6,3]
1.4 80 [3,0,4]
1.7 48 [1,6,0]
1.6 49 [3,6,7]
1.9 38 [1,4,2]
1.8 42 [1,2,3]
再看pg1.1和pg1.9,能够看到pg1.9不在[3,6,0]上,而在[1,4,2]上了,该组合是新加的,能够知道增长pgp_num实际上是增长了osd盘的组合。
经过实验总结:
(1)PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数
(2)PG的增长会引发PG内的数据进行分裂,分裂相同的OSD上新生成的PG当中
(3)PGP的增长会引发部分PG的分布进行变化,可是不会引发PG内对象的变更
pg和pool的关系:pool也是一个逻辑存储概念,咱们建立存储池pool的时候,都须要指定pg和pgp的数量,逻辑上来讲pg是属于某个存储池的,就有点像object是属于某个pg的。
如下这个图代表了存储数据,object、pg、pool、osd、存储磁盘的关系
本质上CRUSH算法是根据存储设备的权重来计算数据对象的分布的,权重的设计能够根据该磁盘的容量和读写速度来设置,好比根据容量大小能够将1T的硬盘设备权重设为1,2T的就设为2,在计算过程当中,CRUSH是根据Cluster Map、数据分布策略和一个随机数共同决定数组最终的存储位置的。
Cluster Map里的内容信息包括存储集群中可用的存储资源及其相互之间的空间层次关系,好比集群中有多少个支架,每一个支架中有多少个服务器,每一个服务器有多少块磁盘用以OSD等。
数据分布策略是指能够经过Ceph管理者经过配置信息指定数据分布的一些特色,好比管理者配置的故障域是Host,也就意味着当有一台Host起不来时,数据可以不丢失,CRUSH能够经过将每一个pg的主从副本分别存放在不一样Host的OSD上便可达到,不仅仅能够指定Host,还能够指定机架等故障域,除了故障域,还有选择数据冗余的方式,好比副本数或纠删码。
下面这个式子简单的代表CRUSH的计算表达式:
CRUSH(X) -> (osd.1,osd.2.....osd.n)
式子中的X就是一个随机数。
下面经过一个计算PG ID的示例来看CRUSH的一个计算过程:
(1)Client输入Pool ID和对象ID;
(2)CRUSH得到对象ID并对其进行Hash运算;
(3)CRUSH计算OSD的个数,Hash取模得到PG的ID,好比0x48;
(4)CRUSH取得该Pool的ID,好比是1;
(5)CRUSH预先考虑到Pool ID相同的PG ID,好比1.48。