@ceph集群逻辑结构

Ceph集群的逻辑结构

一、核心逻辑

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smsCAoeh-1621271153730)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621260965929.png)]

#rados集群:
1、mon集群
	  负责:
	   1)监控全局状态-》
		   cluster map
		    1>osd daemon map
		    2>monitor map
		    3>pg map
		    4>crush map
	   2)负责管理集群内部状态(osd daemon挂掉,数据恢复等操作)
       3)负责授权,
		   客端在访问时会先通过monitor验证操作权限
		   客户端需要根monitor要到cluster map
		   mon节点最少3个,不能挂掉超过半数	
		
2、osd daemon集群
	   负责:
		   1>读写数据
		   2>数据拷贝与恢复
	       3>监控自己以及pg组员的状态
	       

1、ceph的基本结构简述
1>、创建存储池pool,存储池中包含100个pg ceph osd pool create rbdtest 100

2>、设置pool池的副本数,即一个pg包含多少个osd daemon,往某一个pg中存的数据会在其包含的osd
中都保存一份
ceph osd pool set rbdtest size 3

3>、在存储池rdbtest中创建一个镜像给客户端用,一个image用的是存储池中的pg(并ᶋ指定的pg,而   是只要是存在与pool中的pg都可能会用到),相当于一个配᷐
rbd create -p rdbtest --size 10000 egon	    #image名为egon,大小为10000M

#一个osd daemon应该属于多少个pg组呢?
    首先一个osd daemon肯定不能属于一个pg组,因为ceph是pg组为单位来分配数据的,如果一个osd daemon只属于一个pg组,那么该osd daemon将只能收这一个pg组发来的数据,如果该pg组没有被hash算法算到,那么就不会收到数据,于是该osd daemon就被闲置了


#所以一个osd 应该属于多个pg组,到底应该属于多少个呢?
官方建议:
	ceph集群很长一段时间不会拓展:一个osd deamon属于100个pg  否则:一个osd deamon属于200个pg
#详解
  rados构建完毕后,为客户端提供存储服务,需要在客户端文件会被以4M为单位切成3块,每块对应一个object ,一个pool中有多个pg,从pool中划分出image给用户用,image只是一个配额


#    object   多对一    pg
#    pg       多对多    osd daemon



#写入数据流程
                (hash算法)                         (crush算法)
file——————> object--——-—> pool中划分出来的image(一堆pg)—-----> osd daemon


#对应方式:	       
	    保证数据可能地均匀    多对一               多对多
object-------hash算法-------》pg-------crush算法--------》osd daemon

#pg与osd deamon的对应关系
pg与osd deamon的对应关系是在创建存储池就确定的,也就说客户端在读写数据前,这个关系就已经确定了,但是该关系不是固定死的,因为osd daemon有可能会宕掉,pg组内就会临时加入新的
2、ceph的特性
#ceph的逻辑单位:  
   1、pool(存储池)
   2、pg(归置组)
1、ceph存储小文件效率不高,底层osd daemon越多,存大文件效率越高
2、ceph适用于海量小文件,或者单个文件容量大
3、ceph是伪数据平衡,是通过算法达到的(如果只有一个PG,一个PG里副本数为3,永远只有一块盘被用到)

x

二、 pool

1、ceph pool的介绍

rados集群构建完毕后、使用ceph时,需要用到诸多逻辑概念/结构,我们才能理解-个文件到底是如何写入到ceph中,ceph集群的逻辑结构主要由Pool与PG(Placement Group)来定义

#ceph的逻辑结构与lvm有点像(比较)
pv -> osd
vg -> pool 
lv -> image


#对比LVM逻辑卷                             
pv:把一系列的盘都做好标记,由LVM管理起来    
vg:是把一系列的pv给归类到一起,相当于一块大磁盘
lv:相当于从vg这个”大磁盘“中分出的一个”分区“
2、ceph的逻辑结构与其lvm对应关系
LVMCeph
对一块磁盘制作pv一块磁盘被osd daemon管理起来
把一系列pv放到一个vg中, 一个vg相当于一个”大磁盘“在ceph中是先把n个osd daemon放到一个pg中,一个pg中接收到的一份数据会传给其所包含的osd daemon,然后一系列pg构成了pool,pool相当于一个大磁盘,与lvm中的vg类似。但是ceph中的pool只是一个逻辑概念,其所包含的存储空间都是由pg构成,ᶳ知pg并不是连续的存储空间
从vg中分出一个lv,lv相当于从vg这个”大磁盘“中分出的一个”分区“从pool池中创建一个镜像image给客户端用,一个image相当于从pool这个”大 磁盘“分出的一个分区。一个image用的是存储池中的pg,并ᶋ是指定的pg, 而是只要存在于pool中的pg都可能会用到,所以image相当于是一个配᷐
3、ceph的pool有四大属性
1、所有性和访问权限
2、对象副本数目,默认pool池中的一个pg只包含两个osd daemon,即一份数据交给pg后会存下2个副本,生产环境推荐设置为3个副本
3、PG 数目,PG是pool的存储单位,pool的存储空间就由pg组成
4、CRUSH 规则集合

4、ceph的pool有两种类型
1.	#Replicated pool(默认):
拷贝型 pool,通过生成对象的多份拷贝
   默认的存储池类型,把每个存入的对象(Object)存储为多个副本,其中分为主副本和从副本,从副本相当于备份副本,从而确保在部分 OSD 丢失的情况下数据不丢失。这种类型的 pool 需要更多的裸存储空间,但是它支持所有的 pool 操作。
   如果客户端在上传对象的时候不指定副本数,默认为3个副本。在开始存数据之前会计算出该对象存储的主副本与从副本的位置,首先会将数据存入到主副本,然后主副本再将数据分别同步到从副本。主副本与从副本同步完毕后会通知主副本,这时候主副本再响应客户端,并表示数据上传成功。所以如果客户端收到存储成功的请求后,说明数据已经完成了所有副本的存储。


2.	#Erasure-coded pool:
    此类型会将数据存储为K+M,其中K数据块数量。每个对象存储到Ceph集群的时候会分成多个数  据块分开进行存储。而M为为编码块,也代表最多容忍可坏的数据块数量。类似于磁盘阵列 RAID5,在最大化利用空间的同时,还能保证数据丢失可恢复性,相比副本池更节约磁盘的空间。  因为副本池很浪费存储空间,如果Ceph集群总容量为100T,如果使用副本池,那么实际可用空间,按3个副本算,那么只有30T出头。而使用纠删码池就可以更大化的利用空间,但纠删码池更浪费计算资源。 如存储一个100M的资源,如果使用副本池,按3副本计算实际上要使用300M的空间。而使用纠删码池,如果将100M资源分为25块,如果将M指定为2,那么总共只需要108M空间即可,计算公式为100+100/25*2。 

#注意:如果存储RBD镜像,那么不支持纠删码池,关于此类型存储池使用不多。

5、ceph的pool功能
1.#Resilience(弹力):
   即在确保数据不丢失的情况꧋许一定的 OSD 失败,这个数目取决于对象的拷贝(copy/replica)份数或称副本数。对拷贝型 pool 来说,Ceph 中ἕ认的拷贝份数是2,这意味着ᴻ了对象自身外,它还有一个另外的备份。你可以自己决定一个 Pool 中的对象的拷贝份数, 生产环境推荐为3,副本数越多数据越安全、真正可以空间越少

2.#PG(Placement Groups,放置组):
   ceph用pg把存放相同副本的osd daemon归为一组。
客户端的文件会被切成多个object然后交给ceph存储,ceph中真正负责存储的是osd daemon守护进程,在存储时,cephᵱ要找到n个osd daemon、归类好哪些osd daemon存放的是同一个副本、然后把object交给它们,为了降低查找与归类成本,与是引入了pg的概念,将存放相同副本的 osd daemon归为一个pg组

3.#CRUSH Rules (CRUSH  规则):
    数据映射的策略。系统ἕ认提供 “replicated_ruleset”,用户可 以自定义策略来灵活地设置 object 存放的区域。比如可以指定 pool1中所有objecst放置在机架1 上,所有objects的第1个副本放置在机架1上的服务器A上,第2个副本分布在机架1上的服务器B 上。  pool2中所有的object分布在机架2、3、4上,所有Object的第1个副本分布在机架2的服务器上,第2个副本分布在机架3的服 器上,第3个副本分布在机架4的服务器上。后续egon会详细介绍crush rules。

4.#Snapshots(快照):
  你可以对 pool 做快照。

5.#Set Ownership:
设置 pool 的 owner 的用户 ID。

6.#注 : Ceph 集群创建后,默认创建了 data,metadata 和 rbd 三个存储池。

三、pg

1、pg的概念

PG英文全称 Placement Group,中文称之为归置组

#PG的作用:
   PG相当于一个虚拟组件,出于集群伸缩,性能方面的考虑。Ceph将每个存储池分为多个PG,如果存储池为副本池类型,并会给该存储池每个PG分配一个主OSD和多个从OSD,当数据量大的时候PG将均衡的分布行不通ᵞ群中的每个OSD上ᶎ。
   
   
#PG 概念非常复杂,主要有如下几点:
1、PG 也是对象的逻辑集合。pool中的副本数设置为3,则一个pg中包含3个osd daemon,同一个PG 接收到的所有object在这3个osd daemon上被复制。

2、Epoch:PG  map  的版本号,它是一个单调递增的序列。
Peering:见下文的状态描述。

3、Acting set:支持一个 PG 的所有 osd daemon 的有序列表,其中第一个 OSD 是主OSD,其余为次。acting set 是 CRUSH 算法分配的,但是不一定已经生效了。

4、Up set:某一个 PG map 历史版本的 acting set。在大多数情况下,acting set 和 up set 是一致的,ᴻᶋ出现了 pg_temp。

5、Current Interval or Past Interval:若干个连续的版本号,这些版本中 acting 和 up set 保持不变。


#PG temp:
    一个PG组里有三个组员/OSD daemon,三个组员第一个是组长,组长负责对外提供服务,组员负责备份,一旦组长挂掉后,相当于公司中一个部门的ᶱ目经理挂了,公司会招聘一个新的ᶱ目经   理,但新的项目经理刚来的时候还什么都不知道(即新加进来的osd daemon是没有任何组内数据的),此时公司会让某个组员先临时接替一下组长的职务、对外提供服务,一旦新来的组长了解了 业务(即新加进来的osd daemon已经同步好数据了),那么就可以让新组长出山了
    
   #详解如下
    在Ceph 正在往主 OSD 回填数据时,这个主OSD是不能提供数据服务的,这时候,它会向 MON 申请一个临时的 acting set,这就是 PG temp。举个例子,现在 acting set[0,1,2],出现了一点事情后,它变为 [3,1,2],此时 osd.3 还是空的因此它无法提供数据服务因此它还ᵱ要等待backfilling过程结束,因此,它会向 MON 申请一个临时的 set 比如 [1,2,3],此时将由osd.1 提供数据服务。回填过程结束后,该临时 set 会被丢弃,重新由 osd.3 提供服务。
    
#PG 分类 
#主 (primary) OSD:
    在acting set 中的Ḓ个 OSD,负责接收客户端写入数据;ἕ认情况下,提供数据读服务,但是该行为可以被修改。它还负 peering 过程,以及在ᵱ要的时候申请 PG temp。
#次 (replica)OSD:
   在 acting set 中的ᴻ了第一个以外的其余 OSD。
#流浪 (stray) OSD:
   已经不是 acting set 中了,但是还没有被告知去删ᴻ数据 的 OSD。PG 的 acting set 是由 CRUSH 算法根据 CRUSH Rules 动态地计算得出的

2、pg的特点
1)	Ceph 引入 PG 的目的主要是为了减少直接将对象object映射到 OSD 的复杂度,即PG 确定了 pool 中的对象object和 OSD 之间的映射关系,一个 object 只会存在于一个 PG 中,但是多个object可以在同一个 PG 内。PG-

#Object-OSD 的关系如下图所示:
  object与PG是多对一的关系
  PG与OSD daemon是多对多的关系OSD daemon与disk是一对一的关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WzBzK0M7-1621271330339)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621264369925.pn

2)	一个OSD上的PG则可达到数百个。事实上,PG数量的设置牵扯到数据分布的均匀性问
᷌。PG 和 OSD 之间的映射关系由 CRUSH 决定,而它做决定的依据是 CRUSH 规则(rules)。CRUSH 将所有的存储设备(OSD)组织成一个分层结构,该结构能区分故ᵑ域(failure domain),该结构中每个节点都是一个 CRUSH bucket。详细情况后续介绍。
3)	对象的副本数目,也就是被拷贝的次数,是在创建 Pool 时指定的。该分数决定了每个 PG 会在几个 OSD 上保存对象。如果一个拷贝型 Pool 的size(拷贝份数)为 2,它会包含指定数目的 PG,每个 PG 使用两个 OSD,其中,第一个为主 OSD (primary),其它的为从 OSD (secondary)。不同的 PG 可能会共享一个 OSD。
4)	PG 也是Ceph ᵞ群做清理(scrubbing)的基本单位,也就是说数据清理是一个一个PG 来做的。

3、PG 和 OSD 的关系(是动态的 )
1)	一开始在 PG 被创建的时候,MON 根据 CRUSH 算法计算出 PG 所在的 OSD。这是它们之间的初始关系。

2)	Ceph ᵞ群中 OSD 的状态是不断变化的,它会在如下状态之间做切换:
      up:守护进程运行中,能够提供IO服务; 
      down:守护进程不在运行,无法提供IO服务; 
      in:包含数据;
      out:不包含数据
3)	部分 PG 和 OSD 的关系会ᵋ着 OSD 状态的变化而发生变化。当新的 OSD 被加入ᵞ群后,已有OSD上部分PG将可能被挪到新OSD上;此时PG 和OSD 的关系会发生改变。当已有的某 OSD down 了并变为 out 后,其上的 PG 会被挪到其它已有的 OSD 上。但是大部分的 PG 和 OSD 的关系将会保持不变,在状态变化时,Ceph 尽可能只挪动最少的数据。

4)	客户端根据 Cluster map 以及 CRUSH Ruleset 使用 CRUSH 算法查找出某个 PG 所在的OSD 列表。

4、PG的创建过程

Pool 的 PG 数目是创建 pool 时候指定的,Ceph 官方有推荐的计算方法。其꧊与 OSD 的总数的关系密切。当Ceph ᵞ群扩展 OSD 增多时,根据ᵱ要,可以增加 pool 的 PG 数目

1)MON 节点上有PGMonitotor,它发现有 pool 被创建后,判断该 pool 是否有 PG。如果有PG,则逐一判断这些 PG 是否已经存在,如果不存在,则开始下ᶎ的创建 PG 的过程。 2)创建过程的开始,设置PG 状态为 Creating,并将它加入待创建PG队列 creating_pgs,等待被处理。

3)	开始处理后,使用 CRUSH 算法根据当前的 OSD map 找出来 up/acting set,确定哪些osd属于哪些pg,然后加入队列 creating_pgs_by_osd,等待被处理

4)	队列处理函数将该 OSD 上ᵱ要创建的 PG 合并,生成消息MOSDPGCreate,通过消息通道发给 OSD。

5)	OSD 收到消息字为 MSG_OSD_PG_CREATE 的消息,得到消息中待创建的 PG 信息,判断类型,并获取该PG的其它OSD,加入队列 creating_pgs (似乎是由主 OSD 负责发起创建次 OSD 上的PG),再创建具体的 PG。

6)	PG 被创建出来以后,开始 Peering 过程。

5、PG 数目的确定

创建 pool 时需要确定其 PG 的数目,在 pool 被创建后也可以调整该数字,但是增加池中的PG数是影响ceph集群的重大事件之-,生成环境中应该避免这么做,因为pool中pg的数目会影响到

1)	数据的均匀分布性:CRUSH 算法会伪随机地保证 PG 被选中来存放客户端的数据,它还会尽可能地保证所有的 PG 均匀分布在所有的 OSD 上,即ceph是伪数据平衡,如果只有一个PG,一个PG里副本数为3,永远只有一块盘被用到
 #列:
   比方说,有10个OSD,但是只有一个 size 为 3 的 pool、它只有一个 PG,那么10个 OSD 中将只有三个 OSD 被用到。 CURSH 算法在计算的时候并不会考虑到OSD上已有数据的大小。如果10个OSD上存在1000个PG内,每个 OSD 上大概有400M 数据。再加进来一个400M的对象(假设它不会 被分割),那么有三块 OSD 上将有 400M + 400M = 800 M 的数据,而其它七块 OSD 上只有400M 数据。

2)	资源消耗:PG 作为一个逻辑实体,它ᵱ要消耗一定的资源,包括内存,CPU 和带宽。太多 PG的话,则占用资源会过多。

3)	清理时间:Ceph 的清理工作是以 PG 为单位进行的。如果一个 PG 内的数据太多,则其清理时间会很长。

4)	数据的持久性:Pool中的PG个数应该ᵋ着osd daemon的增多而增多,这样crush算法可以将pg与osd的对应关系尽量均匀一些、降低同一个osd属于很多很多个pg的几率,如果一个osd真的属于很多很多pg,这有可能会很糟糕,可见,每个 OSD 上的PG数目不宜过大,否则,会降低数据的持久性,可以肯定的一点是osd 数越多,存储池中包含的pg的数目也应对应增加,这样每个osd上的pg数才会尽量均匀、不会过大。那如何确定一个Pool中有多少 PG?Ceph不会自己计算,而是给出了一些参考原则,让Ceph用户自己计算
  #列:
   假设我们的pool副本size为3,则表示每个 PG 会将数据存放在 3 个 OSD 上,一旦某个osd daemon挂掉,因为一个osd daemon很多很多pg,则此时会出现很多pg只有两个2副本的情况,数据开始进行recovery 恢复,如recovery结束前,因为数据量过大,又有一个osd daemon(也属于很多很多pg)扛不住压力也崩溃掉了,那么将会有一部分pg只有一个副本,recovery 过程继续,情况继续恶化,如果再有第三个osd daemon挂掉,那么就可能会出现部分数据丢失。
   
#pg算法:
少于 5 个 OSD daemon, 建议将pool中的pg数设为 128 
5 到 10 个 OSD daemon,建议将pool中的pg数设为 512
10 到 50 个 OSD daemon,建议将pool中的pg数设为 4096
50 个 OSD daemon 以上,就ᵱ要有更多的权衡来确定 PG 数目,你可以使用pgcalc 工具https://ceph.com/pgcalc/,详解如下


#创建存储池
ceph osd pool create 存储池名 pg_num

如何设置存储中包含的pg_num,才能让crush算法尽可能保证pg在osd上分布均匀呢,官网的公式如下

在这里插入图片描述

#注:
   Target PGs per OSD:crush为每个osd分配的pg数osd# :通常为osd daemon的总数%data:该存储池的空间占ceph集群整体存储空间的百分比size:存储池中的副本数


#提示:官方建议每个osd上的pg数(即Target PGs per OSD)应该为
  如果在可ᶼ见的将来,ᵞ群中的osd数目不会增加,那么建议每个osd上分配的pg数为100个如果在可ᶼ见的将来,ᵞ群中的osd数目会增加(如增加一倍),那么建议每个osd上分配的pg 数为200个

案列

#我们cephᵞ群的总空间为100T,我们先分出一个1T的存储池
# 步Ṉ一:先得到公式中各部分ᵱ要的4个꧊,那么我们的存储池占总空间的百分比为0.01 假设我们总共100个osd
假设未来很长一段时间内我们的osd也不会再增加了,那么target PGS per OSD应该为100
加上存储池中的副本数为3


# 步Ṉ二:将4个填入公式计算出结果
100*100*0.01 / 3	得到33.333333333333336


# 步Ṉ三:将得到的与osd总数 /size,取大的那个
osd总数 /size 即 100 / 3 得33.333333333333336 与步Ṉ二算出的比较,取一个大
最终选定33.333333333333336


#于是我们创建
ceph osd pool create egon_test 32

官网举例,https://ceph.com/pgcalc/,在官网中往表格中输入对应内容即可得出pg个数,很方便,官网例中:创建了一堆存储池,每个存储池占用总空间的一定比例,即%Data,该带入公式时,因为是百分比,所以ᵱ要ᴻ以100后才可以,所有存储池的%Data加在一起为100%

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wGPzPhPa-1621271048657)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621265555166.png)]

    #### 6、PG 的状态(是不断变化的)
#其主要状态包括:
1)	Creating 创建中:PG 正在被创建。

2)	Peering 对等互联(处于该状态的PG不能响应IO请求)
Peering就是一个 PG 的所有 OSD 都ᵱ要互相通信来就PG 的对象及其元数据的状态达成一致的过程。
Peering的过程其实就是pg状态从初始状态然后到active+clean的变化过程。
一个 OSD 启动之后,上ᶎ的pg开始工作,状态为initial,这时进行比对所有osd上的pglog和pg_info,对pg的所有信息进行同步,并选举primary osd和replica osd,peering过程结束,然后把peering的结果交给recovering,由recovering过程进行数据的恢复工作。

3)	Active 活动的:Peering 过程完成后,PG 的状态就是 active 的。此状态下,在主次OSD 上的
PG 数据都是可用的,即PG内主OSD和从OSD都处于就绪状态,可正常提供客户端请求。

4)	Clean 洁净的:此状态下,主次 OSD 都已经被 peered 了、都处于就绪状态,每个副本都就绪了。

5)	Down:PG 掉线了,因为存放其某些关键数据(比如 pglog 和 pginfo,它们也是保存在OSD
上)的副本 down 了。


6)	Degraded 降级的:某个 OSD daemon被发现停止服务 (down)了后,Ceph MON 将该OSD 上的所有 PG 的状态设置为 degraded,即PG包含的osd数目不够,此时该 OSD 的 peer OSD 会继续提供数据服务。这时会有两种结果:
一是它会重新起来(比如重启机器时),ᵱ要再经过 peering 过程再到clean 状态,而且 Ceph 会发起 recovery (恢复)过程,使该 OSD 上过期的数据被恢复到最新状态;
二是 OSD 的 down 状态持续 300 秒后其状态被设置为 out踢出ᵞ群,Ceph 会启动自恢复操作, 选择其它的 OSD 加入 acting set,并启动回填(backfilling)数据到新 OSD 的过程,使 PG 副本数恢复到规定的数目。 有时候某个OSD不可用,崩溃的时候也会处此此状态。详情可以参考 PG的数据恢复过程。

7)	Remapped 重映射:每当 PG 的 acting set 改变后,就会发生从旧acting set 到新 acting set 的数据迁移。此过程结束前,旧 acting set 中的主 OSD 将继续提供服务。一旦该过程结束,Ceph 将使用新 acting set 中的主 OSD 来提供服务。

8)	Stale 过期的:每个OSD daemon每ᵍ 0.5 秒向 MON 报告其状态。如果因为任何原因,主OSD 报告状态失败了,或者其它OSD已经报告其主 OSD down 了,Ceph MON 将会将它们的 PG 标记为 stale 状态。

9)	Undersized:当PG中的副本数少于其存储池指定的个数的时候,就为此状态。


10)	Scrubbing:各OSD还会周期性的检查其持有的数据对象的完性,以确保主和从的数据一致, 这时候状态就为此状态。 另外PG偶尔还ᵱ要查检确保一个对象的OSD上能按位匹配,这时候状态为scrubbing+deep。

11)	Recovering 恢复中(增量恢复):一个 OSD down 后,其上ᶎ的 PG 的内容的版本会比其它OSD上的 PG 副本的版本落后。在它重启之后(比如重启机器时),Ceph 会启动 recovery 过程来使其数据得到更新。

12)	Backfilling 回填中(全量恢复):一个新 OSD 加入ᵞ群后,Ceph 会尝试级将部分其它 OSD 上的 PG 挪到该新 OSD 上,此过程被称为回填。与 recovery 相比,回填(backfill)是在ᵭ数据的情况下做全量拷贝,而恢复(recovery)是在已有数据的基础上做增量恢复。

13)	PG 的所有的状态是一个类似树形的结构,每个状态可能存在子状态,子状态还可能存在子状态

#如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVrCGMuY-1621271048659)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621265778817.png)]

[root@ceph-mon ~]# ceph -s	# 注意,只有当所有的 PG 都是 active + clean 状态时,ᵞ群的状态才是 HEALTH_OK 的。


cluster c5476875-2a04-41b7-a4e8-421133c69ac8 health HEALTH_WARN
28 pgs backfill #回填,有新的 OSD 被加入了2
79	pgs	degraded #降级,有 OSD down 了2	
10	pgs	recovering #恢复中	
42	pgs	recovery_wait #等待恢复	
80	pgs	stuck unclean #有 80个 PG 一直处于 unclean 状态	
27	pgs	undersized #GP 的副本数小于pool size	

7、Ceph 以 PG 为单位进行数据清理 scrubbing

Ceph 以 PG 为单位进行数据清理 scrubbing,以保证数据的完整性,它的作用类似于文件系统的 fsck工具。

1)	Ceph 的 OSD daemon定期启动 scrub 线程来扫描部分对象,通过与其他osd daemon的副本比对来发现是否一致,如果存在不一致,抛出异常提示用户手动解决。管理员也可以手 工发起。

2)	在与其他osd daemon的副本进行比较时,有两种比较方式:
light scrubbing:比较对象的size和属性,一般每天进行
deep scrubbing:读取对象的数据,比较检ḵ码,一般每周进行。
 
3)	OSD daemon定期启动 的scrub 线程会以 PG 为单位,对于每一个PG,scrub 线程会分析该 PG 下所有的对象, 产生一个类似于元数据信息摘要的数据结构,如对象大小,属性等, 叫scrubmap, 比较主与副scrubmap,来保证是不是有object 丢失或者不匹配。


4)	Scrub 的工作方式分成两种, "classic Scrub" vs "chunky Scrub"。
Scrub 流程ᵱ要提取对象的校ḵ信息然后跟其他副本的校ḵ信息对比,这期间被校ḵ对象的数据是不能被修改的,所以 write 请求会被 block. 由于 PG 可能包含成千上万 objects,
chunky Scrub 每一次的比较只取其中一部分 objects 来比较,这样只 block一小部分object
的write请求。这是在ceph的Bobtail(v0.56 Jan 1 2013)引入的feature,称为chunky scrub。Classic scrub 没有引入chunk, 会block所有的write请求。


5)	该机制对保证数据的完整性ᶋ常重要,但是也会消耗大量的ᵞ群资源,block  住一部分对象的写入操作,降低ᵞ群的性能,特别是当一个OSD服务器上多个OSD同时进行深度清理的  时候。这篇文章 Ceph Deep-Scrubbing  Impact  Study  说当有三个深度清理线程发生时,性能有明显的下降。

8、PG (设计带来的运维问题)

引用 https://www.cnblogs.com/linhaifeng/articles/14690274.html

(1)	#扩容粒度
Ceph在实践中,扩容受“容错域”制约,一次只能扩一个“容错域”。容错域就是:副本ᵍ离级别,即同一  个replica的数据,放在不同的磁盘/机器/Rack/机房。ἕ认是机器,通常设为机架。
Ceph扩容ᵱ要对PGs进行调整。正因为这个调整,导致Ceph受“容错域”制约。
例如:有一个PG,是3副本,Cephᵞ群有一个配置是PG要向外提供正常服务,至少有2个完整的副本。而当这个数据pool的容错域是host时,同时扩容2台机器,一些PG就有可能把3副本中的2个都映射到2     台新机器上去。而这2个副本都是新副本,都没有完整的最新数据。剩下的一个副本,无法满足老机器 至少有完整的2副本的要求,也就不能提供正常读写服务了。这就会导致这个PG里的所有对象,停止对 外服务。
那在扩容时,一次只扩容一台机器时,是不是就安全了呢2这样就能保证所有PG都至少在老机器有2个  完整的副本了。可是,即使是扩容一台机器,也还要ᶎ临扩容时老机器中有硬盘坏掉,导致PG的完整副 本又下降为1的极端情况发生。
办法是,在开始规划Cephᵞ群时,设定好更大层次的“容错域”,比如Rack。 可以是真实的Rack,即使没有也可以是逻辑的Rack。这样扩容时,可以扩一个逻辑“容错域”,就可以打破扩一台机器的ᴴ制,扩 一整个Rack,至少有好几台机器。


(2)	#扩容是 crushmap 变化带ᶾ的系统抖动
Ceph是根据crushmap去放置PG的物理位置的,倘若在扩容进行了一半时,又有硬盘坏掉了,那Ceph 的crushmap就会改变,Ceph又会重新进行PG的re-hash,很多PG的位置又会重新计算。如果运气比较差,很可能一台机器的扩容进度被迫进行了很久才回到稳定的状态。
这个crushmap改变导致的Ceph重平衡,不单单在扩容时,几乎在任何时候,对一个大的存储ᵞ群都有   些头疼。在建立一个新ᵞ群时,硬盘都比较新,因此故ᵑ率并不ṛ。但是在运行了2-3年的大存储ᵞ   群,坏盘真的是一个稀松平常的事情,1000台规模的ᵞ群一天坏个2-3块盘很正常。crushmap经常变动,对Ceph内部不稳定,影响真的很大。ᵋ之而来,可能是整体IO的下降(磁盘IO被反复的rebalance 占满),甚至是某些数据暂时不可用。

(3)	#OSD 增加时候的PG数量调整
假设我们现在有10台机器,每台一块硬盘一共10块盘,有1024个PG,PG都是单副本,那么每个盘会存100个PG。此时这个设置ᶋ常健康,但当我们ᵞ群扩容到1000台机器,每台硬盘就只放一个PG了,这会导致伪ᵋ机造成的不平衡现象放大。因此,admin就要ᶎ临调整PG数量,这就带来了问᷌。调PG, 基本也就意味着整个ᵞ群会进入一种严重不正常的状态。几乎50%的对象,涉及到调整后的PG都ᵱ要重新放置物理位置,这会引起服务质量的严重下降。

(4)#盘满造成的系统不可访问
在ᵞ群整体使用率不ṛ时,都没有问᷌。而在使用率达到70%后,就ᵱ要管理员介入了。因为方差大的 盘,很有可能会触及95%这条红线。admin开始调低容量过ṛ磁盘的reweight,但如果在这一批磁盘被   调整reweight没有结束时,又有一些磁盘被写满了,那管理员就必ᶳ被迫在Ceph没有达到稳定状态 前,又一次reweight过ṛ的磁盘。 这就导致了crushmap的再一次变更,从而导致Ceph离稳定状态越来越远。而此时扩容又不及时的话,更是ᵪ上加ᵽ。而且之前的crushmap的中间状态,也会导致一些  PG迁移了一半,这些“不完整的”PG并不会被Ḙ上删ᴻ,这给本来就紧张的磁盘空间又加重了负担。关于reweight 导致的 rebalance,可参考 #https://ceph.com/geen-categorie/ceph-osd-reweight/。
一块磁盘满了,Ceph为什么就不可用了。Ceph还真的就是这样设计的,因为Ceph没法保证新的对象是  否落在空盘而不落在满盘,所以Ceph选择在有盘满了时,就拒绝服务。基本上大家的Cephᵞ群都是在  达到50%使用率时,就要开始准备扩容了。

四、Ceph结构和状态地图cluster map

1、cluster map介绍
#在Ceph中有很多的运行图,比如Monitor运行图,OSD运行图,ᵞ群运行图,MDS运行图和CRUSH运 行图,它们统称为     cluster map
   由若干个monitor共同负责整个Cephᵞ群中所有OSD状态的发现与记录,并且共同形成cluster map的master版本,然后扩散至全体OSD以及client。OSD daemon使用cluster map进行数据的维护,而client使用cluster map进行数据的寻址。 monitor 并不主动轮询各个OSD的当前状态。正相反,OSDᵱ要向monitor上报状态信息。
   
#常见的上报有两种情况:
一是新的OSD被加入ᵞ群
二是某个OSD发现自身或者其他OSD发生异常。
在收到这些上报信息后,monitor将更新cluster map信息并加以扩散

举例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zK8LXVqA-1621271048661)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621266776701.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BlqeuZZ-1621271048662)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621266794973.png)]

2、 Cluster map的内容
1、Epoch,即版本号,为一个单调递增序列,Epoch越大,则cluster     map版本越新。

2、Monitor Map:MON ᵞ群的状态

3、OSD Map与PG  Map:各个OSD的网络地址。各个OSD的状态。up或者down,表明OSD是否正常工作;in或者out,表明OSD是否在至少一个PG中。

4、Crush Map:CRUSH算法配置参数。表明了Cephᵞ群的物理层级关系(cluster hierarchy),位置映射规则(placement rules)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtURmZay-1621271048663)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621266902427.png)]

4、Monitor map:Mon集群的状态
#monitor节点(整个集群的大管家)
	1、监控全局状态-》
			cluster map
				1、osd daemon map
				2、monitor map
				3、pg map
				4、crush map
	2、负责管理集群内部状态(osd daemon挂掉,数据恢复等操作)
	3、负责授权:
		客端在访问时会先通过monitor验证操作权限
		客户端需要根monitor要到cluster map
#monitor节点的个数(=2*n+1)
		1、必须为奇数个
		2、一个monitor也可以,但是不应该这么做,因为有单点故障
		所以最少3个起
#monitor节点常见问题
 1、为何monitor节点个数应该为奇数个
      因为monitor节点同步数据用的是paxos算法(分布式强一致性算法)
      paxos算法规定至少有三个节点
	
2、可以挂掉几个monitor节点
     paxos算法下,monitor集群不能超过半数挂掉
	
3、monitor进程与osd daemon能否在同一个物理节点上
     可以,但是不好,但是这就是一种集中式的思想了
     如果考虑到成本,可以这么做
5、OSD Map:当前所有Pool的状态和所有 OSD 的状态

ceph osd dump

6、PG Map(Placement Group)

包含PG 版本(version)、时间戳、最新的 OSD map epoch, full ratios, and 每个 PG 的详细信息比如PG ID, Up Set, Acting Set, 状态 (e.g., active + clean), pool 的空间使用统计。可以通过ceph pg dump 获得

ceph pg dump | awk '
/^pg_stat/ { col=1; while($col!="up") {col++}; col++ }
/^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}

END {
printf("\n");
printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n"); for (i in poollist) printf("--------"); printf("	\n");
for (i in osdlist) { printf("osd.%i\t", i); sum=0;
for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; poollist[j]+=array[i,j] }; printf("| %i\n",sum) }

for (i in poollist) printf("--------"); printf("	\n");
printf("SUM :\t"); for (i in poollist) printf("%s\t",poollist[i]); printf("|\n");
}'

其他脚本

ceph pg dump | awk ' BEGIN { IGNORECASE = 1 }
/^PG_STAT/ { col=1; while($col!="UP") {col++}; col++ }
/^[0-9a-f]+\.[0-9a-f]+/ { match($0,/^[0-9a-f]+/); pool=substr($0, RSTART, RLENGTH); poollist[pool]=0;
up=$col; i=0; RSTART=0; RLENGTH=0; delete osds; while(match(up,/[0-9]+/)>0) { osds[++i]=substr(up,RSTART,RLENGTH); up = substr(up, RSTART+RLENGTH) }
for(i in osds) {array[osds[i],pool]++; osdlist[osds[i]];}
}

END {
printf("\n");
printf("pool :\t"); for (i in poollist) printf("%s\t",i); printf("| SUM \n"); for (i in poollist) printf("--------"); printf("	\n");
for (i in osdlist) { printf("osd.%i\t", i); sum=0;
for (j in poollist) { printf("%i\t", array[i,j]); sum+=array[i,j]; sumpool[j]+=array[i,j] }; printf("| %i\n",sum) }
for (i in poollist) printf("--------"); printf("	\n");
printf("SUM :\t"); for (i in poollist) printf("%s\t",sumpool[i]); printf("|\n");
}'

7、!CRUSH Map:Controlled Replication under Scalable Hashing
1>什么是crush?
 CRUSH是一种类似于一致性hash的算法,用于为RADOS存储ᵞ群控制数据分布,全称为:Controlled Replication Under Scalable Hashing
2>crush在ceph集群中的作用?
负责数据从PG到OSD的存取
3>故障域
   可以把故障域理解为一个单元,这个单元有大有小,成一个倒树。其中最小为OSD,OSD之上为具体的
服务器,服务器通过是放置在机架上,所以再者是机架,机排(一排机架),一个配电单元,机房,数  据中心,根(root)。 正确的设置故ᵑ域可以降低数据丢失的ᷚᴾ,如果将故ᵑ域设置为OSD,那么同一条数据肯定将分布在不同OSD,有台服务器有可能会有多个OSD,有可能这条数据都在这台服务器上ᶎ,如果这台服务器宕机,有可能造成丢失。如果将故ᵑ域设置为host,那么一条数据肯定分布在不同  的host,那么这时候如果有一台host宕机不会造成数据丢失(推荐)。 Cephᵞ群中ἕ认的故ᵑ域有

4>故障域的类型
osd:硬盘
host:服务器
chassis:机箱
rack:机架(一个机架包含多个机箱) 
row:机排
pdu:配电单元(有可能多个机排共用一个配电单元) 
pod:多个机排
room: 机 房                           
datacenter:数据中心(有可能多个机房组成一个数据中心) 
region:区域(华东1,华东2等)
root:最ᶮ级,必ᶳ存在 注意:这些故ᵑ域也称之为Bucket,但有些Bucketᶋradowsgw里ᶎ的bucket。

5>CRUSH map 使用分层结构来组织集群中的所有存储设备 如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLaBm9Yt-1621271048663)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621267908206.png)]

6>、故障域算法

每个故障域都自己的算法,比如可以对每个故ᵑ域内的对象设置权重,这时候数据将以权重的大小比例将数据均分。比如硬盘大些的可能权重会ṛ些,而硬盘小些的权重将低些。这样才可以保证数据存放到每个OSD的比例都差不多,而不是占用空间大小差不多。通常这样的过程ᵱ要一个算法来支持,一般有 下ᶎ的一些算法

1、#uniform 
2、#list
3、#tree 
4、#straw
5、#straw2:
   straw的升级版,也是现在默认使用的版本

7>、crush rules与crush的算法流程
1)CRUSH rules 主要有三个作用:
1、指定从CRUSH Map 中的哪个节点开始查找
2、指定使用那个节点作为故ᵑᵍ离域
3、指定定位副本的搜索模式(广度优先 or 深度优先
2)PG 选择 OSD 的过程(详情可阅读 PG选择osd的过程(crush 算法)
1.	首先要知道在 rules 中指明从 CRUSH map 中哪个节点开始查找,入口点ἕ认为 default 也就是root 节点

2.	然后隔离域为 host 节点(也就是同一个host下ᶎ不能选择两个子节点)。由 default 到3个host的选择过程,这里由default根据节点的bucket类型选择下一个子节点,由子节点再根据本身的类型继  续选择,知道选择到host,然后在host下选择一个osd。

8、 crush算法与写入流程
#ceph存储小文件效率不ṛ,底层osd daemon越多,存大文件效率越高,为何?
   以rbd块存储客户端为例,客户端读写的都是rados中的对象object,读写objectᵱ要走完的流程是
 
#File → (Pool, Object) → (Pool, PG) → OSD set → OSD/Disk

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BOp4ggID-1621271048664)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621268939008.png)]

步骤解析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GW8GCFtj-1621271048665)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621268946929.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EQTj4Tvm-1621271048665)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621268959359.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-99rHkfmY-1621271048666)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621268971692.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uVbQmlsD-1621271048667)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1621268984715.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值