一:Ceph基础介绍
- Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。
- Ceph相比其它存储的优势点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响。
二:核心组件介绍
- Ceph OSD(必装)
全称是Object Storage Device,主要功能包括存储数据,处理数据的复制、恢复、回补、平衡数据分布,并将一些相关数据提供给Ceph Monitor
- Ceph Monitor(必装) Ceph的监控器,主要功能是维护整个集群健康状态,提供一致性的决策,包含了Monitor map,即集群map,monitor本身不存储任何集群数据
- Managers(必装) Ceph Manager守护进程(ceph-mgr)负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager守护进程还基于python的插件来管理和公开Ceph集群信息,包括基于Web的Ceph Manager Dashboard和 REST API。高可用性通常至少需要两个管理器。
- Ceph MDS(可选) 全称是Ceph Metadata Server,主要保存的是Ceph的文件系统(File System)的元数据(metadata),不是必须安装,当需要使用CephFS的时候才会使用
三:基础组件介绍
- rados 自身是一个完整的分布式对象存储系统,它具有可靠、智能、分布式等特性,Ceph的高可靠、高可拓展、高性能、高自动化都是由这一层来提供的,用户数据的存储最终也都是通过这一层来进行存储的,RADOS可以说就是Ceph的核心,主要由两部分构成,分别是OSD和Monitor
- Librados 它是一个库,它允许应用程序通过访问该与RADOS系统进行交互,支持多种编程语言,比如C、C++,Python等
- radosgw RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swif,只有当使用对象存储时才会用到
- rbd RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备,可以理解为像linux的LVM一样,从Ceph的集群中划分出一块磁盘,用户可以直接在上面做文件系统和挂载目录
- CephFs 通过Linux内核客户端和fuse来提供一个兼容POSIX的文件系统,当一些linux系统不支持mount命令或者需要更高级的操作时,会用到ceph-fuse
四:术语介绍,名词解释
crush 是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方
map 上面说过,monitor组件负责监视整个集群的运行状况,如各节点之间的状态、集群配置信息,这些信息由维护集群成员的守护程序来提供,如何存放这些信息呢,答案就是map,ceph monitor map主要包括如下这几个
- Monitor map:包括有关monitor 节点端到端的信息,其中包括 Ceph 集群ID,监控主机名和IP以及端口。并且存储当前版本信息以及最新更改信息,通过 "ceph mon dump" 查看 monitor map
- OSD map:包括一些常用的信息,如集群ID、创建OSD map的 版本信息和最后修改信息,以及pool相关信息,主要包括pool 名字、pool的ID、类型,副本数目以及PGP等,还包括数量、状态、权重、最新的清洁间隔和OSD主机信息。通过命令 "ceph osd dump" 查看
- PG map:包括当前PG版本、时间戳、最新的OSD Map的版本信息、空间使用比例,以及接近占满比例信息,同事,也包括每个PG ID、对象数目、状态、OSD 的状态以及深度清理的详细信息。通过命令 "ceph pg dump" 可以查看相关状态
- CRUSH map: CRUSH map 包括集群存储设备信息,故障域层次结构和存储数据时定义失败域规则信息。通过 命令 "ceph osd crush map" 查看
- MDS map:MDS Map 包括存储当前 MDS map 的版本信息、创建当前的Map的信息、修改时间、数据和元数据POOL ID、集群MDS数目和MDS状态,可通过"ceph mds dump"查看
副本 副本是ceph存放数据的份数,可以理解为对一个文件备份的份数,ceph默认的副本数是3,即一个主(primary ),一个次(secondary),一个次次(tertiary),只有primary osd的副本才解释客户端请求,它将数据写入其他osd 如下,可以看到这个叫做testpool的pool中有一个叫做object1的object,他的map信息获取后可以看到 这个对象在osd1上面是主,在osd0和osd2上是次和次次,也就是说在副本数为3的情况下,每个osd存储一个副本
[root@ceph-1 ~]# ceph osd map testpool object1
osdmap e220 pool 'testpool' (38) object 'object1' -> pg 38.bac5debc (38.0) -> up ([1,0,2], p1) acting ([1,0,2], p1)
其他内容解释
- osdmap e220 此map的版本号
- pool 'testpool' (38) 此pool的名字和ID
- object 'object1' 此object的名字
- pg 38.bac5debc (38.0) pg的号码,即38.0
- up ([1,0,2], p1) up set ,按顺序表示副本存在于哪个osd上,osd0(primary)osd1(secondary)和osd2(tertiary)
- acting ([1,0,2], p1) acting set 通常情况下和up set相同,不同的情况需要理解pg_temp,即如果pg的acting set 为[0,1,2], 此时如果osd.0出现故障,导致CRUSH算法重新分配该pg的acting set 为[3,1,2]. 此时osd.3为该pg的主osd,但是osd.3并不能负担该pg的读操作,因为其上现在还没有数据。所以向monitor申请一个临时的pg,osd.1为临时主osd,这时acting set依然为[0,1,2],up set 变为[1,3,2],此时就出来acting set 和up set的不同。当osd.3 backfill完成之后,该pg的up set恢复为acting set, 也就是acting set 和 up set都为[0,1,2]
object
ceph最底层的存储单元,即对象,每个对象包含元数据和原始数据,当用户要将数据存储到ceph集群时,存储数据会被分为多个对象,每个对象的大小是可以设置的,默认是4MB,可以将object堪称是ceph存储的最小单元
pg和pgp
pg是用来存放object的 pgp是相当于pg存放在osd的一种排列组合,他不影响副本个数,只影响副本排列顺序
pool pool是一个逻辑存储概念,我们创建pool的时候,需要指定pg和pgp,Ceph 的池是一个用来存储对象的逻辑分区 ,Ceph每个池都包含一定数量 PG 进而实现把一定数量的对象映射到集群内部不同 OSD 此,因此, 每一个池都是交叉分布在集群所有节点上的 ,也就是说pool是分布在整个集群上面的,这样就能够提供足够的弹性
五:易混点辨析
object与pg的关系 由于object的数量很多,所以Ceph引入了pg的概念用于管理object,每个object最后都会通过CRUSH计算映射到某个pg中,一个pg可以包含多个object
pg与osd的关系 pg也需要通过CRUSH计算映射到osd中去存储,如果是三副本的,则每个pg都会映射到三个osd,比如[osd.0,osd.1,osd.2],那么osd.0是存放该pg的主副本,osd.1和osd.2是存放该pg的从副本,保证了数据的冗余
pg和pool的关系 pool也是一个逻辑存储概念,我们创建存储池pool的时候,都需要指定pg和pgp的数量,逻辑上来说pg是属于某个存储池的,就有点像object是属于某个pg的
**pg和pgp的关系 **
- pg是用来存放object的,pgp相当于是pg存放osd的一种排列组合,比如三个osd 1 2 3,副本数设置为3 且ceph默认副本数就是为3,假设此时pgp是1的话,那么此时一个对象是只可能是按照osd0 osd1 osd2 这唯一一种顺序排列,假设此时pgp是2的话,那么此时这个对象可能是按照osd0 osd1 osd2 和 osd1 osd0 osd2 这两种中的一种顺序排列,假设此时pgp是3的话,那么此时就有三种顺序排列,所以pgp实际上并不影响pg的副本数,只影响pg副本在osd分布的顺序排列的组合的可选数量,那么也可以理解pgp的作用就是均衡集群内osd的数据
- pg是指定存储池存储对象的目录有多少个,pgp是存储池pg的OSD分布组合个数
- pg的增加会引起pg内的数据进行分裂,分裂相同的OSD上新生成的pg当中
- pgp的增加会引起部分pg的分布进行变化,但是不会引起pg内对象的变动
存储数据, object, pg,pgp, pool, osd, 存储磁盘的关系
- 这个12M的文件被分成,objectA,objectB,objectC三个对象,分别存储在pgA,pgB,pgC这三个pg里,pgA,pgB,pgC这三个pg又分别归poolA,poolB,poolC管理,而每个pg分布在哪个osd上,是有选择性的,而有多少种选择,就由pgp决定,这里设pgp为1,那么图上显示的就是其中可能的一种pg分布排序,而且是唯一的,如果pgp为2,那么除了图上显示的分布排除算一种外,会有另外一种分布排序,可能是pgA在osd1上,pgB在osd3上,pgC在osd2上,当然也可能有其他的分布排序,但是这里假设pgp为2,所以只有两种可供选择
另外,这里又另一张图,是我在别的大佬的文章里发现的也不错,就也放到这里把