天天看点

Ceph分布式存储实战3.2 CRUSH基本原理

<b>3.2 crush基本原理</b>

<b></b>

众所周知,存储设备具有吞吐量限制,它影响读写性能和可扩展性能。所以,存储系统通常都支持条带化以增加存储系统的吞吐量并提升性能,数据条带化最常见的方式是做raid。与ceph的条带化最相似的是raid 0或者是“带区卷”。ceph条带化提供了类似于raid 0的吞吐量,n路raid镜像的可靠性以及更快速的恢复能力。

在磁盘阵列中,数据是以条带(stripe)的方式贯穿在磁盘阵列所有硬盘中的。这种数据的分配方式可以弥补os读取数据量跟不上的不足。

1)将条带单元(stripe unit)从阵列的第一个硬盘到最后一个硬盘收集起来,就可以称为条带(stripe)。有的时候,条带单元也被称为交错深度。在光纤技术中,一个条带单元被叫作段。

2)数据在阵列中的硬盘上是以条带的形式分布的,条带化是指数据在阵列中所有硬盘中的存储过程。文件中的数据被分割成小块的数据段在阵列中的硬盘上顺序的存储,这个最小数据块就叫作条带单元。

决定ceph条带化数据的3个因素。

对象大小:处于分布式集群中的对象拥有一个最大可配置的尺寸(例如,2mb、4mb等),对象大小应该足够大以适应大量的条带单元。

条带宽度:条带有一个可以配置的单元大小,ceph client端将数据写入对象分成相同大小的条带单元,除了最后一个条带之外;每个条带宽度,应该是对象大小的一小部分,这样使得一个对象可以包含多个条带单元。

条带总量:ceph客户端写入一系列的条带单元到一系列的对象,这就决定了条带的总量,这些对象被称为对象集,当ceph客户端端写入的对象集合中的最后一个对象之后,它将会返回到对象集合中的第一个对象处。

3.2.1 object与pg

ceph条带化之后,将获得n个带有唯一oid(即object的id)。object id是进行线性映射生成的,即由file的元数据、ceph条带化产生的object的序号连缀而成。此时object需要映射到pg中,该映射包括两部分。

1)由ceph集群指定的静态hash函数计算object的oid,获取到其hash值。

2)将该hash值与mask进行与操作,从而获得pg id。

根据rados的设计,假定集群中设定的pg总数为m(m一般为2的整数幂),则mask的值为m–1。由此,hash值计算之后,进行按位与操作是想从所有pg中近似均匀地随机选择。基于该原理以及概率论的相关原理,当用于数量庞大的object以及pg时,获得到的pg id是近似均匀的。

计算pg的id示例如下。

1)client输入pool id和对象id(如pool=‘liverpool’,object-id=‘john’)。

2)crush获得对象id并对其hash运算。

3)crush计算osd个数,hash取模获得pg的id(如0x58)。

4)crush获得已命名pool的id(如liverpool=4)。

5)crush预先考虑到pool id相同的pg id(如4.0x58)。

3.2.2 pg与osd

由pg映射到数据存储的实际单元osd中,该映射是由crush算法来确定的,将pg id作为该算法的输入,获得到包含n个osd的集合,集合中第一个osd被作为主osd,其他的osd则依次作为从osd。n为该pg所在pool下的副本数目,在生产环境中n一般为3;osd集合中的osd将共同存储和维护该pg下的object。需要注意的是,crush算法的结果不是绝对不变的,而是受到其他因素的影响。其影响因素主要有以下两个。

一是当前系统状态。也就是上文逻辑结构中曾经提及的cluster map(集群映射)。当系统中的osd状态、数量发生变化时,cluster map可能发生变化,而这种变化将会影响到pg与osd之间的映射。

二是存储策略配置。这里的策略主要与安全相关。利用策略配置,系统管理员可以指定承载同一个pg的3个osd分别位于数据中心的不同服务器乃至机架上,从而进一步改善存储的可靠性。

因此,只有在cluster map和存储策略都不发生变化的时候,pg和osd之间的映射关系才是固定不变的。在实际使用中,策略一经配置通常不会改变。而系统状态的改变或者是因为设备损坏,或者是因为存储集群规模扩大。好在ceph本身提供了对于这种变化的自动化支持,因而,即便pg与osd之间的映射关系发生了变化,并不会对应用造成困扰。事实上,ceph正是需要有目的的利用这种动态映射关系。正是利用了crush的动态特性,ceph才可以将一个pg根据需要动态迁移到不同的osd组合上,从而自动化地实现高可靠性、数据分布re-blancing等特性。

之所以在此次映射中使用crush算法,而不是其他hash算法,原因之一是crush具有上述可配置特性,可以根据管理员的配置参数决定osd的物理位置映射策略;另一方面是因为crush具有特殊的“稳定性”,也就是当系统中加入新的osd导致系统规模增大时,大部分pg与osd之间的映射关系不会发生改变,只有少部分pg的映射关系会发生变化并引发数据迁移。这种可配置性和稳定性都不是普通hash算法所能提供的。因此,crush算法的设计也是ceph的核心内容之一。

3.2.3 pg与pool

ceph存储系统支持“池”(pool)的概念,这是存储对象的逻辑分区。

ceph client端从ceph mon端检索cluster map,写入对象到pool。pool的副本数目,crush规则和pg数目决定了ceph将数据存储的位置,如图3-1所示。

pool至少需要设定以下参数。

对象的所有权/访问权。

pg数目。

该pool使用的crush规则。

对象副本的数目。

object、pg、pool、osd关系图,如图3-2所示。

图3-2 映射关系图

pool相关的操作如下。

1)创建pool。

ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \

     [crush-ruleset-name] [expected-num-objects]

ceph osd pool create {pool-name} {pg-num}  {pgp-num}   erasure \

     [erasure-code-profile] [crush-ruleset-name] [expected_num_objects]

2)配置pool配额。

ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]

3)删除pool。

ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]

4)重命名pool。

ceph osd pool rename {current-pool-name} {new-pool-name}

5)展示pool统计。

rados df

6)给pool做快照。

ceph osd pool mksnap {pool-name} {snap-name}

7)删除pool快照。

ceph osd pool rmsnap {pool-name} {snap-name}

8)配置pool的相关参数。

ceph osd pool set {pool-name} {key} {value}

9)获取pool参数的值。

ceph osd pool get {pool-name} {key}

10)配置对象副本数目。

ceph osd pool set {poolname} size {num-replicas}

11)获取对对象副本数目。

ceph osd dump | grep 'replicated size'

继续阅读