45.第37章 ceph
一.ceph 架构
Pool:存储池、分区,存储池的大小取决于底层的存储空间。
PG(placement group):一个pool 内部可以有多个PG 存在,pool 和PG 都是抽象的逻辑概念,一个pool 中有多少个PG 可以通过公式计算。
OSD(Object Storage Daemon):每一块磁盘叫做osd,多个osd 组成一个主机
存储池要先创建才能往ceph 保存数据,文件在向ceph 保存之前要先进行一致性hash 计算,计算后会把文件保存在某个对应的PG 的,某个文件一定属于某个pool 的PG,在通过PG保存在OSD 上。
数据对象在写到主OSD 之后再同步对从OSD 以实现数据的高可用。
注:存储文件过程:
第一步:把文件对象映射给PG
第二步: 把文件对象映射被OSD,
第三步:通过OSD 写入到硬盘
监视器mon 维护OSD 和PG 的集群状态,
二.CURSH 算法
Ceph 使用CURSH 算法来存放和管理数据,它是Ceph 的智能数据分发机制。Ceph 使用CRUSH算法来准确计算数据应该被保存到哪里,以及应该从哪里读取,和保存元数据不同的是,CRUSH 按需计算出元数据,因此它就消除了对中心式的服务器/网关的需求,它使得Ceph客户端能够计算出元数据,该过程也称为CRUSH 查找,然后和OSD 直接通信。
1.如果是把对象直接映射到OSD 之上会导致对象与OSD 的对应关系过于紧密和耦合,当OSD由于故障发生变更时将会对整个ceph 集群产生影响。
2.于是ceph 将一个对象映射到RADOS 集群的时候分为两步走:
首先使用一致性hash 算法将对象名称映射到PG
然后将PG ID 基于CRUSH 算法映射到OSD 即可查到对象
3.以上两个过程都是以”实时计算”的方式完成,而没有使用传统的查询数据与块设备的对应表的方式,这样有效避免了组件的”中心化”问题,也解决了查询性能和冗余问题。使得ceph集群扩展不再受查询的性能限制。
4.这个实时计算操作使用的就是CRUSH 算法
Controllers replication under scalable hashing #可控的、可复制的、可伸缩的一致性hash 算法。
CRUSH 是一种分布式算法,类似于一致性hash 算法,用于为RADOS 存储集群控制数据的分配。
三.ceph中如何做数据的读写
副本池IO:
将一个数据对象存储为多个副本
在客户端写入操作时,ceph 使用CRUSH 算法计算出与对象相对应的PG ID 和primary OSD主OSD 根据设置的副本数、对象名称、存储池名称和集群运行图(cluster map)计算出PG 的各辅助OSD,然后由OSD 将数据再同步给辅助OSD。
读取数据:
1. 客户端发送读请求,RADOS 将请求发送到主OSD。
2. 主OSD 从本地磁盘读取数据并返回数据,最终完成读请求。
写入数据:
1. 客户端APP 请求写入数据,RADOS 发送数据到主OSD。
2. 主OSD 识别副本OSDs,并发送数据到各副本OSD。
3. 副本OSDs 写入数据,并发送写入完成信号给主OSD。
4. 主OSD 发送写入完成信号给客户端APP。
四.数据读写流程
ceph 读写对象的时候,客户端从ceph 监视器检索出集群运行图(cluster map),然后客户端访问指定的存储池,并对存储池内PG 的对象执行读写操作。
存储池的CRUSH 计算结果和PG 的数量,是决定ceph 如何放置数据的关键因素。
基于集群的最新运行图,客户端能够了解到集群中的所有监视器和OSD 以及他们各自当前的状态。
但是客户端仍然不知道对象的保存位置。
客户端在读写对象时,需要提供的是对象标识和存储池名称。
客户端需要在存储池中读写对象时,需要客户端将对象名称、对象名称的hash 码、存储池中的PG 数量和存储池名称作为输入信息提供给ceph,然后由CRUSH 计算出PG 的ID 以及此PG 针对的主OSD 即可读写OSD 中的对象。
具体写操作如下:
1.APP 向ceph 客户端发送对某个对象的请求,此请求包含对象和存储池,然后ceph 客户端对访问的对象做hash 计算,并根据此hash 值计算出对象所在的PG,完成对象从Pool 至PG的映射。
APP 访问pool ID 和object ID (比如pool = pool1 and object-id = “name1”)
ceph client 对objectID 做哈希
ceph client 对该hash 值取PG 总数的模,得到PG 编号(比如32),(第2 和第3 步基本保证了一个pool 内部的所有PG 将会被均匀地使用)
ceph client 对pool ID 取hash(比如“pool1” = 3)
ceph client 将pool ID 和PG ID 组合在一起(比如3.23)得到PG 的完整ID。
2.然后客户端据PG、CRUSH 运行图和归置组(placement rules)作为输入参数并再次进行计算,并计算出对象所在的PG 内的主OSD ,从而完成对象从PG 到OSD 的映射。
Ceph client 从MON 获取最新的cluster map。
Ceph client 根据上面的第(2)步计算出该object 将要在的PG 的ID。
Ceph client 再根据CRUSH 算法计算出PG 中目标主和备OSD 的ID,即可对OSD 的数据进行读写。
3.客户端开始对主OSD 进行读写请求(副本池IO),如果发生了写操作,会有ceph 服务端完成对象从主OSD 到备份OSD 的同步。