编辑crush map:

  1、获取crush map;

  2、反编译crush map;

  3、至少编辑一个设备,桶, 规则;

  4、重新编译crush map; 

  5、重新注入crush map;

获取crush  map

  要获取集群的crush map,执行命令:

    ceph osd  getcrushmap -o {compiled-crushmap-filename}

  ceph将crush输出(-o)到你指定的文件,由于crush map是已编译的,所以需要反编译;

反编译crush map

  要反编译crush map, 执行命令:

     crushtool -d {compiled-crushmap-filename}  -o {decompiled-crushmap-filename}

  ceph将反编译(-d)二进制crush图,且输出(-o)到你指定的文件;

编译crush map

  要编译crush map,执行命令:

    crushtool -c  {decompiled-crushmap-filename}  -o {compiled-crushmap-filename}

  ceph将已编译的crush map保存到你指定的文件;

注入crush map

  要把crush map应用到集群,执行命令:

    ceph osd  setcrushmap -i {compiled-crushmap-filename}

  ceph 将把你指定的已编译的crush  map输入到集群;

crush map 参数:

CRUSH 图主要有 4 个主要段落。

  1. 设备 由任意对象存储设备组成,即对应一个 ceph-osd 进程的存储器。 Ceph 配置文件里的每个 OSD 都应该有一个设备。
  2. 桶类型: 定义了 CRUSH 分级结构里要用的桶类型( types ),桶由逐级汇聚的存储位置(如行、机柜、机箱、主机等等)及其权重组成。
  3. 桶例程: 定义了桶类型后,还必须声明主机的桶类型、以及规划的其它故障域。
  4. 规则: 由选择桶的方法组成。

如果你用我们的某个“入门手册”配起了 Ceph ,应该注意到了,你并不需要创建 CRUSH 图。 Ceph 部署工具生成了默认 CRUSH 运行图,它列出了你定义在 Ceph 配置文件中的 OSD 设备、并把配置文件 [osd] 段下定义的各 OSD 主机声明为桶。为保证数据安全和可用,你应该创建自己的 CRUSH 图,以反映出自己集群的故障域

  Note : 生成的 CRUSH 图没考虑大粒度故障域,所以你修改 CRUSH 图时要考虑上,像机柜、行、数据中心。

CRUSH 图之设备:

  为把归置组映射到 OSD , CRUSH 图需要 OSD 列表(即配置文件所定义的 OSD 守护进程名称),所以它们首先出现在 CRUSH 图里。要在 CRUSH 图里声明一个设备,在设备列表后面新建一行,输入 device 、之后是唯一的数字 ID 、之后是相应的 ceph-osd 守护进程例程名字。

  #devices

  device {num}  {osd.name}

  例如:

    #devices

    device  0 osd.0

    device  1 osd.1

    device  2 osd.2

    device  3 osd.3

  一般来说, 一个OSD映射到一个单独的硬盘或raid

crush map 之桶类型:

  crush map里的第二个列表定义了bucket(桶)类型,桶简化了节点和叶子层次。节点(或非叶)桶在分级结构里一般表示物理位置,节点汇聚了其它节点或叶子,叶桶表示 ceph-osd 守护进程及其对应的存储媒体。

  Tip:CRUSH 中用到的 bucket 意思是分级结构中的一个节点,也就是一个位置或一部分硬件。但是在 RADOS 网关接口的术语中,它又是不同的概念。

要往 CRUSH 图中增加一种 bucket 类型,在现有桶类型列表下方新增一行,输入 type 、之后是惟一数字 ID 和一个桶名。按惯例,会有一个叶子桶为 type 0 ,然而你可以指定任何名字(如 osd 、 disk 、 drive 、 storage 等等):

  #types:

  type  {num} {bucket-name}

例如:

  #types

  type 0 osd

  type 1 host

  type 2 chassis

  type 3 rack

  type 4 row

  type 5 pdu

  type 6 pod

  type 7 room

  type 8 datacenter

  type 9 region

  type 10 root

crush map 之桶层次

  crush算法根据各设备的权重、大致统一的概率把数据对象分布到存储设备中,crush根据你定义的集群运行图分布对象及其副本,crush map表达了可用存储设置以及包含它们的逻辑单元;

  要把归置组映射到跨故障域的OSD,一个crush图需要定义一些列分级桶类型(即现有crush图的#type下)。创建桶分级结构的目的是按故障域隔离叶节点,像主机,机箱,机柜,电力分配单元,集群,行,房间和数据中心。除了表示叶节点的OSD,其他分级结构都是任意的,你可以按需定义;

  我们建议 CRUSH 图内的命名符合贵公司的硬件命名规则,并且采用反映物理硬件的例程名。良好的命名可简化集群管理和故障排除,当 OSD 和/或其它硬件出问题时,管理员可轻易找到对应物理硬件。

  在下例中,桶分级结构有一个名为 osd 的分支、和两个节点分别名为 host 和 rack 。

  

    Note :编号较高的 rack 桶类型汇聚编号较低的 host 桶类型

位于 CRUSH map起始部分、 #devices 列表内是表示叶节点的存储设备,没必要声明为桶例程。位于分级结构第二低层的桶一般用于汇聚设备(即它通常是包含存储媒体的计算机,你可以用自己喜欢的名字描述,如节点、计算机、服务器、主机、机器等等)。在高密度环境下,经常出现一机框内安装多个主机/节点的情况,因此还要考虑机框故障——比如,某一节点故障后需要拉出机框维修,这会影响多个主机/节点和其内的 OSD 。

  声明一个桶例程时,你必须指定其类型、惟一名称(字符串)、惟一负整数 ID (可选)、指定和各条目总容量/能力相关的权重、指定桶算法(通常是 straw )、和哈希(通常为 0 ,表示哈希算法 rjenkins1 )。一个桶可以包含一到多条,这些条目可以由节点桶或叶子组成,它们可以有个权重用来反映条目的相对权重。

  你可以按下列语法声明一个节点桶:

  [bucket-type] [bucket-name] {

        id [a unique negative numeric ID]

    weight [the relative capacity/capability of the  item(s)]

    alg [the bucket type: uniform |list | tree | straw ]

    hash [the hash type: 0 by default]

    item [item-name] weight [weight]

 }

 例如,用上面的图表,我们定义两个主机桶和一个机柜桶,OSD被声明为主机桶内的条目:

host node1 {
id -1
alg straw
hash 0
item osd.0 weight 1.00
item osd.1 weight 1.00
} host node2 {
id -2
alg straw
hash 0
item osd.2 weight 1.00
item osd.3 weight 1.00
} rack rack1 {
id -3
alg straw
hash 0
item node1 weight 2.00
item node2 weight 2.00
}

Note:在前述示例中,机柜桶不包含任何 OSD ,它只包含低一级的主机桶、以及其内条目的权重之和。


桶类型


Ceph 支持四种桶,每种都是性能和组织简易间的折衷。如果你不确定用哪种桶,我们建议 straw ,关于桶类型的详细讨论见 CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data ,特别是 Section 3.4 。支持的桶类型有:


  1. Uniform: 这种桶用完全相同的权重汇聚设备。例如,公司采购或淘汰硬件时,一般都有相同的物理配置(如批发)。当存储设备权重都相同时,你可以用uniform 桶类型,它允许 CRUSH 按常数把副本映射到 uniform 桶。权重不统一时,你应该采用其它算法。
  2. List: 这种桶把它们的内容汇聚为链表。它基于 RUSH P 算法,一个列表就是一个自然、直观的扩张集群:对象会按一定概率被重定位到最新的设备、或者像从前一样仍保留在较老的设备上。结果是优化了新条目加入桶时的数据迁移。然而,如果从链表的中间或末尾删除了一些条目,将会导致大量没必要的挪动。所以这种桶适合永不或极少缩减的场景。
  3. Tree: 它用一种二进制搜索树,在桶包含大量条目时比 list 桶更高效。它基于 RUSH R 算法, tree 桶把归置时间减少到了 O(log n) ,这使得它们更适合管理更大规模的设备或嵌套桶。
  4. Straw: list 和 tree 桶用分而治之策略,给特定条目一定优先级(如位于链表开头的条目)、或避开对整个子树上所有条目的考虑。这样提升了副本归置进程的性能,但是也导致了重新组织时的次优结果,如增加、拆除、或重设某条目的权重。 straw 桶类型允许所有条目模拟拉稻草的过程公平地相互“竞争”副本归置

Hash

  各个桶都用了一种哈希算法,当前 Ceph 仅支持 rjenkins1 ,输入 0 表示哈希算法设置为 rjenkins1 。

调整桶的权重

  Ceph 用双整形表示桶权重。权重和设备容量不同,我们建议用 1.00 作为 1TB 存储设备的相对权重,这样 0.5 的权重大概代表 500GB 、 3.00 大概代表 3TB 。较高级桶的权重是所有枝叶桶的权重之和。

  一个桶的权重是一维的,你也可以计算条目权重来反映存储设备性能。例如,如果你有很多 1TB 的硬盘,其中一些数据传输速率相对低、其他的数据传输率相对高,即使它们容量相同,也应该设置不同的权重(如给吞吐量较低的硬盘设置权重 0.8 ,较高的设置 1.20 )。

CRUSH map之规则

  CRUSH 图支持“ CRUSH 规则”概念,用以确定一个存储池里数据的归置。对大型集群来说,你可能创建很多存储池,且每个存储池都有它自己的 CRUSH 规则集和规则。默认的 CRUSH 图里,每个存储池有一条规则、一个规则集被分配到每个默认存储池,它们有:

  data  /  metadata / rbd

Note:大多数情况下,你都不需要修改默认规则。新创建存储池的默认规则集是 0 。

  CRUSH 规则定义了归置和复制策略、或分布策略,用它可以规定 CRUSH 如何放置对象副本。例如,你也许想创建一条规则用以选择一对目的地做双路复制;另一条规则用以选择位于两个数据中心的三个目的地做三路镜像;又一条规则用 6 个设备做 RAID-4 。关于 CRUSH 规则的详细研究见 CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data ,主要是 Section 3.2 。

  规则格式如下:

 rule <rulename> {

    ruleset <ruleset>

    type  [replicated | raid4 ]

    min_size <min-size>

    max_size <max-size>

    step  take <bucket-type>

    step  [choose | chooseleaf] [firstn|indep ] <N> <bucket-type>

    set emit

}

 ruleset

   Description: 区分一条规则属于某个规则集的手段。给存储池设置规则集后激活。   

   Purpose: 规则掩码的一个组件。
     Type: Integer
   Required: Yes
     Default: 0

type

  Description: 为硬盘(复制的)或 RAID 写一条规则。  
  Purpose: 规则掩码的一个组件。
  Type: String
  Required: Yes
  Default: replicated  
  Valid Values: Currently only replicated

min_size

  Description: 如果一个归置组副本数小于此数, CRUSH 将不应用此规则。
  Type: Integer
  Purpose: 规则掩码的一个组件。
  Required: Yes
  Default: 1

max_size

  Description: 如果一个归置组副本数大于此数, CRUSH 将不应用此规则。
  Type: Integer
  Purpose: 规则掩码的一个组件。
  Required: Yes
  Default: 10

step take <bucket-name>

  Description: 选取桶名并迭代到树底。
  Purpose: 规则掩码的一个组件。
  Required: Yes
  Example: step take data

step choose firstn {num} type {bucket-type}

  Description:  选取指定类型桶的数量,这个数字通常是存储池的副本数(即 pool size )。
    如果 {num} == 0 选择 pool-num-replicas 个桶(所有可用的);
    如果 {num} > 0 && < pool-num-replicas 就选择那么多的桶;
    如果 {num} < 0 它意为 pool-num-replicas - {num} 。
  Purpose:  规则掩码的一个组件。
  Prerequisite: 跟在 step take 或 step choose 之后。
  Example:

    step choose firstn 1 type row

step chooseleaf firstn {num} type {bucket-type}

  Description:  
    选择 {bucket-type} 类型的一堆桶,并从各桶的子树里选择一个叶子节点。集合内桶的数量通常是存储池的副本数(即 pool size )。
        如果 {num} == 0 选择 pool-num-replicas 个桶(所有可用的);
      如果 {num} > 0 && < pool-num-replicas 就选择那么多的桶;
      如果 {num} < 0 它意为 pool-num-replicas - {num} 。
  Purpose:  规则掩码的一个组件。 它的使用避免了通过两步来选择一设备。
  Prerequisite:  Follows step take or step choose.
  Example:
    step chooseleaf firstn 0 type row
step emit

  Description: 输出当前值并清空堆栈。通常用于规则末尾,也适用于相同规则应用到不同树的情况。
  Purpose: 规则掩码的一个组件。
  Prerequisite: Follows step choose.
  Example: step emit

  Important: 把规则集编号设置到存储池,才能用一个通用规则集编号激活一或多条规则。

主亲和性:

  某一Ceph 客户端读写数据时,总是连接 acting set 里的主 OSD (如 [2, 3, 4] 中, osd.2 是主的)。有时候某个 OSD 与其它的相比并不适合做主 OSD (比如其硬盘慢、或控制器慢),最大化硬件利用率时为防止性能瓶颈(特别是读操作),你可以调整 OSD 的主亲和性,这样 CRUSH 就尽量不把它用作 acting set 里的主 OSD 了。

    ceph osd primary-affinity  <osd-id>  <weight>

  主亲和性默认为 1 (就是说此 OSD 可作为主 OSD )。此值合法范围为 0-1 ,其中 0 意为此 OSD 不能用作主的, 1 意为 OSD 可用作主的;此权重小于 1 时, CRUSH 选择主 OSD 时选中它的可能性低。

给存储池指定 OSD:

  假设你想让大多数存储池坐落到使用大硬盘的 OSD 上,但是其中一些存储池映射到使用高速 SSD 的 OSD 上。在同一个 CRUSH 图内有多个独立的 CRUSH 树是可能的,定义两棵树、分别有自己的根节点——一个用于硬盘(如 root platter )、一个用于 SSD (如 root ssd ),如:

 device  osd.
device osd.
device osd.
device osd.
device osd.
device osd.
device osd.
device osd. host ceph-osd-ssd-server- {
id -
alg straw
hash
item osd. weight 1.00
item osd. weight 1.00
} host ceph-osd-ssd-server- {
id -
alg straw
hash
item osd. weight 1.00
item osd. weight 1.00
} host ceph-osd-platter-server- {
id -
alg straw
hash
item osd. weight 1.00
item osd. weight 1.00
} host ceph-osd-platter-server- {
id -
alg straw
hash
item osd. weight 1.00
item osd. weight 1.00
} root platter {
id -
alg straw
hash
item ceph-osd-platter-server- weight 2.00
item ceph-osd-platter-server- weight 2.00
} root ssd {
id -
alg straw
hash
item ceph-osd-ssd-server- weight 2.00
item ceph-osd-ssd-server- weight 2.00
} rule data {
ruleset
type replicated
min_size
max_size
step take platter
step chooseleaf firstn type host
step emit
} rule metadata {
ruleset
type replicated
min_size
max_size
step take platter
step chooseleaf firstn type host
step emit
} rule rbd {
ruleset
type replicated
min_size
max_size
step take platter
step chooseleaf firstn type host
step emit
} rule platter {
ruleset
type replicated
min_size
max_size
step take platter
step chooseleaf firstn type host
step emit
} rule ssd {
ruleset
type replicated
min_size
max_size
step take ssd
step chooseleaf firstn type host
step emit
} rule ssd-primary {
ruleset
type replicated
min_size
max_size
step take ssd
step chooseleaf firstn type host
step emit
step take platter
step chooseleaf firstn - type host
step emit
}

  然后设置一个存储池,让它使用SSD规则:

    ceph osd pool  set <poolname>  crush_ruleset  4

  同样,用ssd-primary规则将使存储池内的各归置组用SSD作主OSD, 普通硬盘作副本;

增加/移动 OSD

  要增加或删除在线集群里 OSD 所对应的 CRUSH 图条目,执行 ceph osd crush set 命令:

    ceph osd crush set {id-or-name} {weight} root={pool-name}  [{bucket-type}={bucket-name} ...]

调整一OSD的crush权重:

   要调整在线集群中一 OSD 的 CRUSH 权重,执行命令:

      ceph osd crush reweight {name} {weight}

删除OSD:

  要从在线集群里把一 OSD 踢出 CRUSH 图,执行命令:

    ceph osd crush remove {name}

增加桶:

  要在运行集群的 CRUSH 图中新建一个桶,用 ceph osd crush add-bucket 命令:

     ceph osd crush add-bucket {bucket-name} {bucket-type}

  http://mirrors.myccdn.info/ceph/doc/docs_zh/output/html/rados/operations/crush-map/

   http://xxlazy.appspot.com/How-to-use-v2ex-setup-bbs.html

ceph之crush map的更多相关文章

  1. Ceph 调整crush map

    目录 Ceph 调整crush map 1.前言 2.示例 1.创建新的replicated 2.修改当前pool的rule Ceph 调整crush map 1.前言 本文章适用于ceph n版 2 ...

  2. CRUSH map 定制实例解析

    1.提取已有的CRUSH map ,使用-o参数,ceph将输出一个经过编译的CRUSH map 到您指定的文件ceph osd getcrushmap -o crushmap.txt 2.反编译你的 ...

  3. ceph 的crush算法 straw

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

  4. Ceph根据Crush位置读取数据

    前言 在ceph研发群里面看到一个cepher在问关于怎么读取ceph的副本的问题,这个功能应该在2012年的时候,我们公司的研发就修改了代码去实现这个功能,只是当时的硬件条件所限,以及本身的稳定性问 ...

  5. 让我们了解 Ceph 分布式存储

    前言 最近在学习 kubernetes 过程中,想实现 pod 数据的持久化.在调研的过程中,发现 ceph 在最近几年发展火热,也有很多案例落地企业.在选型方面,个人更加倾向于社区火热的项目,Glu ...

  6. Ceph 分布式存储

    前言 Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目.随着云计算的发展,ceph乘上了OpenStack的春风,进而成为了开源社区受关注较高的项目之一. ...

  7. ceph crush的问题

    ceph crush的问题看一遍忘一遍,现将<ceph源码分析>一书中相关章节摘抄如下: 4.2.1 层级化的Cluster Map例4-1 Cluster Map定义层级化的Cluste ...

  8. ceph crush算法和crushmap浅析

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

  9. Ceph源码解析:CRUSH算法

    1.简介 随着大规模分布式存储系统(PB级的数据和成百上千台存储设备)的出现.这些系统必须平衡的分布数据和负载(提高资源利用率),最大化系统的性能,并要处理系统的扩展和硬件失效.ceph设计了CRUS ...

随机推荐

  1. 【微信公众号】使用a标签打开链接显示空白

    window.location.href 改成 top.location.href

  2. 使用Xib添加自定义View

    1.新建Cocoa Touch Class以及UI View,2者同名 2.设置UI View的File's Owner——Custom Class为之前新建类 3.设置Xib中View与类关联 4. ...

  3. INDEX相关

    1.索引应该建立在WHERE子句经常用到的表列上,如果在大表上频率使用某列或者某几列作为条件执行检索操作,并且检索的行数低于总行数的15%,那么应该考虑在该几行上添加索引. 2.为了提高多表连接的性能 ...

  4. C#手机充值

    C#手机充值系统开发(基于聚合数据) 说是手机充值系统有点装了,其实就是调用了聚合数据的支付接口,其实挺简单的事 但是我发现博客园竟然没有类似文章,我就个出头鸟把我的代码贡献出来吧 首先说准备工作: ...

  5. ie6与固定定位fixed,+ 条件注释格式注意

    ie6并不支持position:fixed, ie7+都支持fixed定位, ie6固定定位实现方法1: <!DOCTYPE html> <html> <head> ...

  6. Qt5位置相关函数异同详解(附源码)

    Qt5中提供了丰富的位置和区域大小相关函数.下面讲一讲他们的区别. 主要函数: 1.x(),y(),pos():获取整个窗体左上角的坐标位置. 2.frameGeometry():获取整个窗体左上角的 ...

  7. MaxSubArray 最大子数列和

    public int maxSubArray(int[] A) { int newsum=A[0]; int max=A[0]; for(int i=1;i<A.length;i++){ new ...

  8. poj 2192 Zipper(区间dp)

    题目链接:http://poj.org/problem?id=2192 思路分析:该问题可以看做dp问题,同时也可以使用dfs搜索求解,这里使用dp解法: 设字符串StrA[0, 1, …, n]和S ...

  9. 操蛋的UITableView重用机制

    1,背景 你可能会遇见一下情况: 使用UITableView加载数据,比如你的每一个cell上面有一个UITextField,当你在第一个cell的UITextField中写下了内容,开始下滑UITa ...

  10. codeigniter IE浏览器下无法登录的解决的方法

    站点搬迁到新的server后,CI 框架做的站点IE浏览器下无法登录.登录时候採用CI自带的SESSION机制,事实上是以COOKIE保存. 网上搜索到IE浏览器不支持域名存在- _. 不是这个原因, ...