资源池

ceph的数据存储机制

云计算-ceph的资源池管理以及配置_客户端

pool的类型

根据不同的数据保护方式,Pool可以分为副本池和纠删码池

云计算-ceph的资源池管理以及配置_数据块_02

Pool,OSD和PG的映射

  • pool是ceph的一个逻辑概念,用于存放对象,不同pool之间相互隔离
  • PG全程是placement groups,是构成pool的子集,也就是一系列对象的集合
  • RADOS的对象只能分布在一个PG中,一个PG仅能属于一个POOL,PG里的对象会被映射到不同的OSD上
  • 客户端在保存对象的时候,ceph会根据对象的名称进行hash,然后使用crush算法将其映射给PG
  • 当对象和PG映射关系确定后,ceph会根据集群的副本数,PG以及crush规则来计算对象所有副本与OSD对应关系
  • 当集群中添加或者删除OSD的时候,PG会自动将对象重平衡到其他的OSD中

PG的数量会影响ceph的性能:

  • 如果PG数量过多,数据移动的时候,每个PG维护的数据量过少,ceph占据大量的cpu和内存,影响集群的正常客户端使用
  • 如果PG数量过少,单个pg存储的数据就过多,移动PG会占用大量的带宽,影响集群客户的使用

计算PG id流程

客户端正在进行数据读写的时候,仅仅需要向提供资源池的名称以及对象ID即可

云计算-ceph的资源池管理以及配置_客户端_03

完成的对象由三部分组成

  • 对象ID
  • 二进制数据
  • 对象元数据

计算流程

  • 客户端将文件按照统一大小切分成多个RADOS能处理的对象,并为每个对象分配ID
  • 客户端向ceph集群输入资源池名称和对象ID
  • ceph获取到对象id后进行hash
  • ceph使用hash,对pg对象进行取模hash,计算出对应的PG id
  • ceph根据客户端输入的资源名称获取到对应的ID

云计算-ceph的资源池管理以及配置_数据_04


  • 对象id在整个ceph集群都是唯一的
  • 对象的三部分由客户端根据所保存的数据类型自动产生
  • ceph计算pg id的算法为,pg=hash (object_id)%pg_num
  • ceph在计算pg id后,根据迁移pg和osd的映射,以及资源池的数据保护规则,将数据保存到对应的osd之中

客户端访问ceph流程

1、向MON集群发起请求连接

2、客户端和MON建立连接之后,将搜索最新版本的cluster map,从而获取到MON,OSD和MDS的信息,但不包括对象存储的位置

3、client根据crush算法计算出对象对应的osd

4、client根据上步中计算得出OSD的位置,然后进行通信,完成对象的读写

云计算-ceph的资源池管理以及配置_客户端_05


在ceph中,计算节点自行计算对象存储的位置的速度要比通过和ceph组件交互查询对象存储位置快很多,因此,在数据读写的时候,都是客户端根据crush算法完成对象位置的计算

ceph数据写入流程

ceph采取数据强一致性来保证数据的同步

1、客户端通过MON获取到cluster map

2、client通过cluster map获取到主osd节点信息,并向其发送写入请求

3、主osd收到写入请求后,将数据写入,并向两个备用OSD发起数据写入指令

4、两个备OSD收到数据写入请求后返回确认主OSD

5、主OSD收到所有备OSD写入完成后的确认后,向客户端返回写入完成的确认

云计算-ceph的资源池管理以及配置_客户端_06

ceph数据读取流程

1、客户端通过MON获取到cluster map

2、client通过cluster map获取到主OSD节点信息,并向其发送读取请求

3、主OSD将client的请求的数据返回给client

云计算-ceph的资源池管理以及配置_数据块_07

管理资源池

创建以及配置

# 创建资源池k8s
ceph osd pool create k8s
  • 1.
  • 2.

云计算-ceph的资源池管理以及配置_客户端_08

#查看资源池详细信息
ceph osd pool ls detail | grep k8s
#或者
ceph osd pool get k8s all
  • 1.
  • 2.
  • 3.
  • 4.

云计算-ceph的资源池管理以及配置_数据块_09

#修改资源池
#官方推荐,pg数量建议是256个,按照如下调整
ceph osd pool set k8s pg_num 256

#修改min_size,表示最少有两个副本可用的时候才能读写,这样保证了
#数据的一致性,但是牺牲了数据的可用性
ceph osd pool set k8s min_size 1

#重命名
ceph osd pool rename k8s k8s_test

#使用rados简单对象操作
#将/etc/hosts文件上传
rados -p k8s put hosts /etc/hosts
#检查存在的对象
rados -p k8s ls 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

云计算-ceph的资源池管理以及配置_客户端_10

#修改配额
#限制最多能上传5个对象
ceph osd pool set-quota k8s max_objects 5

#查看资源池信息
ceph df 
ceph osd df 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

云计算-ceph的资源池管理以及配置_数据_11

dashbord上操作

云计算-ceph的资源池管理以及配置_客户端_12

纠删码池管理

副本数以及最小副本数

ceph在存储对象的时候,为了保证数据的可靠性,会将同一个对象复制多分进行保存,如果有数据损坏,剩余复制出的数据任然可以保证数据不丢失

云计算-ceph的资源池管理以及配置_客户端_13


纠删码池数据块和编码块

在纠删码池中,数据会被切片成数据块和奇偶校验块,一旦数据不可用,系统会根据校验块对其进行恢复,以保证数据不丢失。

在纠删码池中,任意一个数据块和编码块都可以将数据恢复,因此最多允许损坏k-1个数据块,同时损坏M-1编码块。

工作原理

  • 在数据写入前,根据设置,将文件切分为k个数据块和M个纠删块
  • 按照逻辑将文件切分成3+2份
  • 将切分好的对象保存到对应的osd中

云计算-ceph的资源池管理以及配置_数据块_14