Crush算法
1、Crush的目的
优化分配数据,高效的重组数据,灵活的约束对象副本放置,硬件故障时候最大化保证数据安全
2、流程
Ceph 架构中,Ceph客户端是直接读写存放在OSD上的RADOS Object,因此,Ceph需要走完(Pool, Object) → (Pool, PG) → OSD set → OSD/Disk 完整的链路,才能让Ceph client知道目标数据 object的具体位置在哪里。
数据写入时,文件被切分成object,object先映射到PG,再由PG映射到OSD set。每个pool有多个PG,每个object通过计算hash值并取模得到它所对应的PG。PG再映射到一组OSD(OSD个数由pool的副本数决定)。
PG到OSD的映射的过程算法叫做Crush算法,这个算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的OSD集合是固定的。
OSDMap管理当前Ceph中所有的OSD,OSDMap规定了Crush算法的一个范围,在这个范围中选择OSD结合。那么影响Crush算法结果的有两种因素,一个就是OSDMap的结构,另外一个就是Crush rule。
3、Crush rule介绍
Crush rule主要有3个重点:
a.从OSDMap中的哪个节点开始查找,
b.使用那个节点作为故障隔离域,
c.定位副本的搜索模式(广度优先 or 深度优先)。
# ruleset
rule replicated_ruleset #规则集的命名,创建pool时可以指定rule集
{
ruleset 0 #rules集的编号,顺序编即可
type replicated #定义pool类型为replicated(还有esurecode模式)
min_size 1 #pool中最小指定的副本数量不能小1
max_size 10 #pool中最大指定的副本数量不能大于10
step take default #定义pg查找副本的入口点
step chooseleaf firstn 0 type host #选叶子节点、深度优先、隔离host
step emit #结束
}
PG选择osd的过程:首先要知道在rules中指明从OSDMap中哪个节点开始查找,入口点默认为default也就是root节点,然后隔离域为host节点(也就是同一个host下面不能选择两个子节点)。由default到3个host的选择过程,这里由default根据节点的bucket类型选择下一个子节点,由子节点再根据本身的类型继续选择,知道选择到host,然后在host下选择一个osd。
PG与PGP
Ceph通过Crush算法,将若干个object映射到PG上,形成一个object与PG的逻辑集合,并以此作为object与OSD的中间层,将PG根据所在POOL的副本数,复制到多个OSD上。PG的用途是将某些东西进行逻辑归组,从而达到统一管理,提升效率的作用。
PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数
总结三点介绍
1、 PGP起到对PG进行归置的作用。
2、 PGP的取值应该与PG相同,在PG的值增大的同时,也要增大PGP的值以保持二者的值相同。
3、 当一个POOL的PG增大后,Ceph并不会开始进行rebalancing,只有在PGP的值增大后,PG才会开始迁移至其他的OSD上,并且开始rebalancing。
结论
PG增加后,Ceph不会从原来的各个PG随机抽取部分数据到新的PG中,而是分裂某个PG,从而产生新的PG。原有的6个PG只有2个分裂,其它4个保持对象不变,这种方式可以有效的减少大量数据迁移导致的性能问题。(pg到osd的映射关系没有发生变化)
当PGP变化时,Ceph才会开始真正的数据重平衡。(调整PGP不会引起PG内的对象的分裂,但是会引起PG的分布的变动,调整新增pg到osd的映射,保障数据在osd层面的均匀分布)
原文地址:https://www.cnblogs.com/weichao01/p/9532794.html