资源池
ceph的数据存储机制
pool的类型
根据不同的数据保护方式,Pool可以分为副本池和纠删码池
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即可
完成的对象由三部分组成
- 对象ID
- 二进制数据
- 对象元数据
计算流程
- 客户端将文件按照统一大小切分成多个RADOS能处理的对象,并为每个对象分配ID
- 客户端向ceph集群输入资源池名称和对象ID
- ceph获取到对象id后进行hash
- ceph使用hash,对pg对象进行取模hash,计算出对应的PG id
- ceph根据客户端输入的资源名称获取到对应的ID
- 对象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中,计算节点自行计算对象存储的位置的速度要比通过和ceph组件交互查询对象存储位置快很多,因此,在数据读写的时候,都是客户端根据crush算法完成对象位置的计算
ceph数据写入流程
ceph采取数据强一致性来保证数据的同步
1、客户端通过MON获取到cluster map
2、client通过cluster map获取到主osd节点信息,并向其发送写入请求
3、主osd收到写入请求后,将数据写入,并向两个备用OSD发起数据写入指令
4、两个备OSD收到数据写入请求后返回确认主OSD
5、主OSD收到所有备OSD写入完成后的确认后,向客户端返回写入完成的确认
ceph数据读取流程
1、客户端通过MON获取到cluster map
2、client通过cluster map获取到主OSD节点信息,并向其发送读取请求
3、主OSD将client的请求的数据返回给client
管理资源池
创建以及配置
# 创建资源池k8s
ceph osd pool create k8s
#查看资源池详细信息
ceph osd pool ls detail | grep k8s
#或者
ceph osd pool get k8s all
#修改资源池
#官方推荐,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
#修改配额
#限制最多能上传5个对象
ceph osd pool set-quota k8s max_objects 5
#查看资源池信息
ceph df
ceph osd df
dashbord上操作
纠删码池管理
副本数以及最小副本数
ceph在存储对象的时候,为了保证数据的可靠性,会将同一个对象复制多分进行保存,如果有数据损坏,剩余复制出的数据任然可以保证数据不丢失
纠删码池数据块和编码块
在纠删码池中,数据会被切片成数据块和奇偶校验块,一旦数据不可用,系统会根据校验块对其进行恢复,以保证数据不丢失。
在纠删码池中,任意一个数据块和编码块都可以将数据恢复,因此最多允许损坏k-1个数据块,同时损坏M-1编码块。
工作原理
- 在数据写入前,根据设置,将文件切分为k个数据块和M个纠删块
- 按照逻辑将文件切分成3+2份
- 将切分好的对象保存到对应的osd中