ceph crush的问题看一遍忘一遍,现将《ceph源码分析》一书中相关章节摘抄如下:

4.2.1 层级化的Cluster Map
例4-1 Cluster Map定义
层级化的Cluster Map定义了OSD集群具有层级关系的静态拓扑结构。OSD的层级使得CRUSH算法在选择OSD时实现了机架感知(rack awareness)的能力,也就是通过规则定义,使得副本可以分布在不同的机架、不同的机房中,提供数据的安全性。
层级化的Cluster Map的一些基本概念如下:
·Device:最基本的存储设备,也就是OSD,一个OSD对应一个磁盘存储设备。
·bucket:设备的容器,可以递归的包含多个设备或者子类型的bucket。bucket的类型:bucket可以有很多的类型,例如host就代表了一个节点,可以包含多个device。Rack就是机架,包含多个host等。在Ceph里默认的有root、datacenter、room、row、rack、host六个等级。用户也可以自己定义新的类型。每个device都设置了自己的权重,和自己的存储空间相关。bucket的权重就是子bucket(或者设备)的权重之和。

#bucket类型
# types
type osd
type host
type chassis
type rack
type row
type pdu
type pod
type room
type datacenter
type region
type root

下列举例说明bucket的用法:

host test1 {                    //类型host,名字为test1
id - // bucket的id,一般为负值
# weight 3.000 //权重,默认为子item的权重之和
alg straw // bucket随机选择的算法
hash // bucket随机选择的算法使用的hash函数,这里0代表使用hash函数jenkins1
item osd. weight 1.000 // item1:osd.1和权重值
item osd. weight 1.000
item osd. weight 1.000
}
host test2{
id -
# weight 3.000
alg straw
hash
item osd. weight 1.000
item osd. weight 1.000
item osd. weight 1.000
}
root default{ // root类型的bucket,名字为default
id - // id号
# weight 6.000
alg straw //随机选择的算法
hash // rjenkins1
item test1 weight 3.000
item test2 weight 3.000
}

4.2.2 Placement Rules
Cluster Map反映了存储系统层级的物理拓扑结构。Placement Rules决定了一个PG的对象副本如何选择的规则,通过这些可以自己设定规则,用户可以设定副本在集群中的分布。其定义格式如下:

tack(a)
choose
choose firstn {num} type {bucket-type}
chooseleaf firstn {num} type {bucket-type}、 If {num} == , choose pool-num-replicas buckets (all available).
If {num} > && < pool-num-replicas, choose that many buckets.
If {num} < , it means pool-num-replicas - {num}.
Emit

Placement Rules的执行流程如下:
1)take操作选择一个bucket,一般是root类型的bucket。
2)choose操作有不同的选择方式,其输入都是上一步的输出:
a)choose firstn深度优先选择出num个类型为bucket-type个的子bucket。
b)chooseleaf先选择出num个类型为bucket-type个子bucket,然后递归到页节点,选择一个OSD设备:
·如果num为0,num就为pool设置的副本数。
·如果num大于0,小于pool的副本数,那么就选择出num个。
·如果num小于0,就选择出pool的副本数减去num的绝对值。
3)emit输出结果。
操作chooseleaf firstn{num}type{bucket-type}可以等同于两个操作:
a)choose firstn{num}type{bucket-type}
b)choose firstn 1 type osd

例4-2
 Placement Rules:三个副本分布在三个Cabinet中。
如图4-2所示的Cluster Map:顶层是一个root bucket,每个root下有四个row类型bucket。每个row下面有4个cabinet,每个cabinet下有若干个OSD设备(图中有4个host,每个host有若干个OSD设备,但是在本crush map中并没有设置host这一级别的bucket,而是直接把4个host上的所有OSD设备定义为一个cabinet):

 rule replicated_ruleset {
ruleset // ruleset的编号id
type replicated //类型:repliated或者erasure code
min_size //副本数最小值
max_size //副本数最大值
step take root //选择一个root bucket,做下一步的输入
step choose firstn type row //选择一个row,同一排
step choose firstn type cabinet //选择三个cabinet, 三副本分别在不同的cabinet
step choose firstn type osd //在上一步输出的三个cabinet中,分别选择一个osd
step emit
}

根据上面的定义和图4-2的Cluster Map所示,选择算法的执行过程如下:
1)选中root bucket作为下一个步骤的输入。
2)从root类型的bucket中选择一个row类的子bucket,其选择的算法在root的定义中设置,一般设置为straw算法。
3)从上一步的输出row中,选择三个cabinet,其选择的算法在row中定义。
4)从上一步输出的三个cabinet中,分别选择一个OSD,并输出。
根据本rule sets,选择出三个OSD设备分布在一个row上的三个cabinet中。

例4-3
 Placement Rules:主副本分布在SSD上,其他副本分布在HDD上。


如图4-3所示的Cluster Map:定义了两个root类型的bucket,一个是名为SSD的root类型的bucket,其OSD存储介质都是SSD盘。它包函两个host,每个host上的设备都是SSD磁盘;另一个是名为HDD的root类型的bucket,其OSD的存储介质都是HDD磁盘,它有两个host,每个host上的设备都是HDD磁盘。

 rule ssd-primary {
ruleset
type replicated
min_size
max_size
step take ssd //选择ssd这个root bucket为输入
step chooseleaf firstn type host //选择一个host,并递归选择叶子节点osd
step emit //输出结果 step take hdd //选择hdd这个root bucket为输入
step chooseleaf firstn - type host //选择总副本数减一个host,并分别递归选择一个叶子节点osd
step emit //输出结果
}

根据图4-3所示的Cluster Map,代码中的rulesets的执行过程如下:
1)首先take操作选择ssd为root类型的bucket。
2)在ssd的root中先选择一个host,然后以该host为输入,递归至叶子节点,选择一个osd设备。
3)输出选择的设备,也就是ssd设备。
4)选择hdd作为root的输入。
5)选择2个host(副本数减一,默认3副本),并分别递归选择一个OSD设备,最终选择出两个hdd设备。
6)输出最终的结果。
最终输出3个设备,一个是SSD类型的磁盘,另外两个是HDD磁盘。通过上述规则,就可以把PG的主副本分布在SSD类型的OSD上,其他副本分布在HDD类型的磁盘上。

ceph crush的问题的更多相关文章

  1. ceph crush 之 crush_do_rule

      crush_do_rule中,用了一个scratch空间来完成item的搜索. scratch空间总共有3个max_result这么大,并且按照max_result长度划分为三个部分(下图中的a. ...

  2. ceph crush算法和crushmap浅析

    1 什么是crushmap crushmap就相当于是ceph集群的一张数据分布地图,crush算法通过该地图可以知道数据应该如何分布:找到数据存放位置从而直接与对应的osd进行数据访问和写入:故障域 ...

  3. ceph 的crush算法 straw

    很多年以前,Sage 在写CRUSH的原始算法的时候,写了不同的Bucket类型,可以选择不同的伪随机选择算法,大部分的模型是基于RJ Honicky写的RUSH algorithms 这个算法,这个 ...

  4. Ceph相关

    Ceph基础知识和基础架构简介 http://www.xuxiaopang.com/2020/10/09/list/#more大话Ceph http://www.xuxiaopang.com/2016 ...

  5. ceph结构详解

    引言 那么问题来了,把一份数据存到一群Server中分几步? Ceph的答案是:两步. 计算PG 计算OSD 计算PG 首先,要明确Ceph的一个规定:在Ceph中,一切皆对象. 不论是视频,文本,照 ...

  6. Ceph常规操作及常见问题梳理

    Ceph集群管理 每次用命令启动.重启.停止Ceph守护进程(或整个集群)时,必须指定至少一个选项和一个命令,还可能要指定守护进程类型或具体例程. **命令格式如 {commandline} [opt ...

  7. ceph笔记(一)

    一.ceph概述本质上是rados:可靠的.自动的.分布式对象存储特性:高效性(大型的网络raid,性能无限接近raid).统一性(支持文件存储.块存储.对象存储).可扩展性数据库的一个弱点:查表ce ...

  8. Ceph 概述和理论

    1.1 Ceph概述 官网地址:https://docs.ceph.com/docs/master/ 1.Ceph简介 概述:Ceph是可靠的.可扩展的.统一的.分布式的存储系统.同时提供对象存储RA ...

  9. Ceph介绍及原理架构分享

    https://www.jianshu.com/p/cc3ece850433 1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能. ...

随机推荐

  1. WIN7无法访问共享打印机及文件的解决办法

    故障: 在网上邻居上能看到对方的电脑名字,双击进入的时候弹出问题.出现“用户账户限制”或“未授予用户在计算机上的请求登陆类型”的问题,这说明我们的局域网和网络是畅通的,问题的根源就在电脑的安全设置上. ...

  2. java框架之SpringBoot(15)-安全及整合SpringSecurity

    SpringSecurity介绍 Spring Security 是针对 Spring 项目的安全框架,也是 Spring Boot 底层安全模块默认的技术选型.它可以实现强大的 Web 安全控制.对 ...

  3. vue中router使用keep-alive缓存页面的注意事项

    <keep-alive exclude="QRCode"> <router-view></router-view> </keep-aliv ...

  4. sklearn countvectorizer坑

    但是如果修改为['驴 福 记 ( 阜通 店 )','...',...]执行vectorizer.fit_transform就正常.原因是,创建CountVectorizer实例时,有一个默认参数ana ...

  5. python中列表中元素的增删改查

    增: append : 默认添加到列表的最后一个位置 insert : 可以通过下标添加到列表的任意位置 extend: a.extend[b] --将b列表的元素全加入到列表b中 删; remove ...

  6. 测试Oracle统计信息的导出导入

    背景:有时我们会希望可以对Oracle的统计信息整体进行导出导入.比如在数据库迁移前后,希望统计信息保持不变;又比如想对统计信息重新进行收集,但是担心重新收集的结果反而引发性能问题,想先保存当前的统计 ...

  7. 与数论的厮守02:整数的因子分解—Pollard_Rho

    学Pollard_Rho之前,你需要学会:Miller Rabin. 这是一个很高效的玄学算法,用来对大整数进行因数分解. 我们来分解n.若n是一个素数,那么就不需要分解了.所以我们还得能够判断一个数 ...

  8. [macOS] Error: /usr/local must be writable!" (Sierra 10.12 )

    Error: /usr/local must be writable!" (Sierra 10.12 ) solution: sudo chown -R $(whoami) /usr/loc ...

  9. scrapy的安装

    python --version   2.7.12版本. 1) 首先在交互模式下测试系统是否安装lxml和OpenSSL 2) 安装lxml,apt-get install python-lxml, ...

  10. jmeter获取mysql数据并作为请求参数使用

    1.将mysql-connector-java-5.1.22-bin.jar包放到jmeter的lib目录下,重启jmeter 2.测试计划中添加jdbc connection,右键测试计划----添 ...