CEPH分布式存储应用实践——Ceph的组件解析与资源划分和存储

CEPH分布式存储应用实践------分布式存储简介与CEPH分布式存储https://blog.csdn.net/xiaochenXIHUA/article/details/162394922

一、Ceph其他组件与概念

1.1、Pool

Pool是存储对象的逻辑分区(或者叫存储池)它规定了数据冗余的类型和对应的副本分布策略,默认存储3份副本;支持两种类型:【副本(replicated)】和 【纠删码( Erasure Code)】。

存储池的两种类型 说明
Replicated pool(默认) 副本池,默认的存储池类型,把每个存入的对象(Object)存储为多个副本,其中分为主副本和从副本,从副本相当于备份副本,从而确保在部分 OSD 丢失的情况下数据不丢失。 这种类型的 pool 需要更多的裸存储空间,但是它支持所有的 pool 操作。 如果客户端在上传对象的时候不指定副本数,默认为3个副本。在开始存数据之前会计算出该对象存储的主副本与从副本的位置,首先会将数据存入到主副本,然后主副本再将数据分别同步到从副本。主副本与从副本同步完毕后会通知主副本,这时候主副本再响应客户端,并表示数据上传成功。所以如果客户端收到存储成功的请求后,说明数据已经完成了所有副本的存储。
Erasure-coded pool 纠删码池,此类型会将数据存储为K+M(其中K是数据块数量,每个对象存储到Ceph集群的时候会分成多个数据块分开进行存储。而M为最多容忍可坏的数据块数量,类似于磁盘阵列RAID5,在最大化利用空间的同时,还能保证数据丢失可恢复性,相比副本池更节约磁盘的空间)。 因为副本池很浪费存储空间,如果Ceph集群总容量为100T,如果使用副本池,那么实际可用空间按3个副本算,那么只有30T出头。 而使用纠删码池就可以更大化的利用空间,但纠删码池更浪费计算资源(如:存储一个100M的资源,若使用副本池,按3副本计算实际上要使用300M的空间。而使用纠删码池,如果将100M资源分为25块,如果将M指定为2,那么总共只需要108M空间即可,计算公式为100+100/25*2)。 注意:如果存储RBD镜像,那么不支持纠删码池。关于此类型存储池使用不多,不做过多介绍。

1.2、PG与PG temp

PG(全称:Placement Group,又叫归置组),可以将PG看做一个逻辑容器,这个容器包含多个对象,同时这个逻辑对象映射多个OSD上。如果没有PG,在成千上万个OSD上管理和跟踪数百万计的对象的复制和传播是相当困难的。没有PG这一层,管理海量的对象所消耗的计算资源也是不可想象的。

PG的作用:PG相当于一个虚拟组件,出于集群伸缩,性能方面的考虑(Ceph将每个存储池分为多个PG,如果存储池为副本池类型,并会给该存储池每个PG分配一个主OSD和多个从OSD,当数据量大的时候,PG将均衡的分布在集群中的每个OSD上面)【OSD(object storage device)是负责存储文件的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。**主要功能是存储数据、复制数据、平衡数据、恢复数据,以及与其它OSD间进行心跳检查,负责响应客户端请求返回具体数据的进程等;**在Ceph集群中所有的文件都会以对象的形式存储到OSD中。OSD与OSD之间是可以相互通信的】。

PG temp :一个PG组里有三个组员(OSD),三个组员第一个是组长,组长负责对外提供服务,组员负责备份,一旦组长挂掉后,相当于公司中一个部门的项目经理辞职了,公司会招聘一个新的项目经理,但新的项目经理刚来的时候还什么都不知道(即新加进来的osd是没有任何组内数据的),此时公司会让某个组员先临时接替一下组长的职务、对外提供服务,一旦新来的组长了解了业务(即新加进来的osd已经同步好数据了),那么就可以让新组长出山了。

1.3、PGP

PGP(Placement Groups of Placement)是为了实现定位而设置的PG,是存储池PG中OSD分布组合个数,它的值应该和PG的总数(即pg_num)保持一致。对于Ceph的一个pool而言,如果增加pg_num,还应该调整pgp_num为同样的值。这样集群才可以开始再平衡。

1.4、Object

Object(存储对象)是最底层的存储单元,包含元数据和原始数据。

1.5、Pool、PG、 Object、OSD之间的关系

LVM逻辑卷对应Ceph Pool、PG、Object、OSD之间的关系类比LVM逻辑卷
pv------>osd 把一系列的盘都做好标记,由LVM管理起来
vg------>pool 是把一系列的pv给归类到一起,相当于一块大磁盘
lv------>image 相当于从vg这个"大磁盘"中分出的一个"分区"

如上图所示:

  1. Object与PG是多对一关系;
  2. PG与OSD daemon是多对多关系;
  3. OSD daemon与Disk是一对一关系;
  4. Pool是PG对象的逻辑集合,pool中的副本数若设置为3,则一个pg中包含3个osd(即同一个PG接收到的所有object将在这3个osd上被复制)。
  5. 一个OSD上的PG则可达到数百个。PG数量的设置牵扯到数据分布的均匀性问题。PG 和 OSD 之间的映射关系由 CRUSH 决定,而它做决定的依据是 CRUSH 规则(rules)。
  6. 对象的副本数目,也就是被拷贝的次数,是在创建 Pool 时指定的。该份数决定了每个PG会在几个OSD上保存对象。如果一个拷贝型Pool的size(拷贝份数)为 2,它会包含指定数目的PG,每个PG使用两个 OSD,其中,第一个为主OSD (primary),其它的为从 OSD(secondary)。不同的 PG 可能会共享一个 OSD。
  7. PG 是Ceph集群做清理(scrubbing)的基本单位,也就是说数据清理是一个一个PG来做的。

1.6、PG数目的确定

创建 pool 时需要确定其 PG 的数目,在 pool 被创建后也可以调整该数字,但是增加池中的PG数是影响ceph集群的重大事件之一,生成环境中应该避免这么做,因为pool中pg的数目会影响到数据的均匀分布性。

每个 OSD 上的PG数目不宜过大,否则,会降低数据的持久性,可以肯定的一点是osd数越多,存储池中包含的pg的数目也应对应增加,这样每个osd上的pg数才会尽量均匀、不会过大。那如何确定一个Pool中有多少 PG?Ceph不会自己计算,而是给出了一些参考原则,让Ceph用户自己计算:

单OSD的PG副本数推荐阈值
单Pool基准PG数 = (集群OSD总数 × 100) / pool_size * pool_size:副本池 = 副本数(size=3 则填 3);纠删码池 = K+M 之和(如 4+2=6); * 计算结果向上取最近 2 的幂(64/128/256/512/1024/2048/4096/8192/...),CRUSH 哈希效率最优Ceph;
单Pool建议PG = (单OSD目标PG副本数 × OSD总数 × 该池数据占比) / pool_size 1. 单 OSD 目标 PG 副本:集群不扩容选 100;未来扩容一倍选 200; 2. % Data:该池存储数据占集群总数据比例(多 RGW / 多业务池必须分摊); * 少于 5 个 OSD daemon, 建议将pool中的pg数设为 128; * 5 到 10 个 OSD daemon,建议将pool中的pg数设为 512; * 10 到 50 个 OSD daemon,建议将pool中的pg数设为 4096;
PG 设置正反影响: 1. PG 过少:数据分布不均、热点 OSD、IO 并发差、故障恢复粒度大; 2. PG 过多:OSD 内存 / CPU 暴涨、Peering/Recovery 速度大幅下降、集群卡顿、触发mon_max_pg_per_osd告警;

1.7、RBD、CephFS、Crush

RBD (全称RADOS block device)是Ceph对外提供的块设备服务;

CephFS (全称Ceph File System)是Ceph对外提供的分布式文件存储服务;

CRUSH 是Ceph底层使用的数据分布算法,让数据分配到预期的地方,通过Crush算法的寻址操作,Ceph得以摒弃了传统的集中式存储元数据寻址方案。而Crush算法在一致性哈希基础上很好的考虑了容灾域的隔离,使得Ceph能够实现各类负载的副本放置规则(如:跨机房、机架感知等)同时,Crush算法有相当强大的扩展性,理论上可以支持数千个存储节点。

二、Ceph的资源划分与存储过程

2.1、Ceph的资源划分与存储过程原理

Ceph采用crush算法,在大规模集群下,实现数据的快速、准确存放,同时能够在硬件故障或扩展硬件设备时,做到尽可能小的数据迁移,其原理如下:

Ceph的资源划分与存储过程原理
《1》当用户要将数据存储到Ceph集群时,数据先被分割成多个object,(每个object一个object id,大小可设置,默认是4MB),object是Ceph存储的最小存储单元。
《2》由于object的数量很多,为了有效减少了Object到OSD的索引表、降低元数据的复杂度,使得写入和读取更加灵活,引入了pg(Placement Group ):PG(归置组)用来管理object,每个object通过Hash,映射到某个pg中,一个pg可以包含多个object。
《3》Pg再通过CRUSH计算,映射到osd中。如果是三副本的,则每个pg都会映射到三个osd,保证了数据的冗余。

2.2、Ceph的数据写入流程

Ceph的数据写入流程
《1》数据通过负载均衡获得节点动态IP地址;
《2》通过块、文件、对象协议将文件传输到节点上;
《3》数据被分割成4M对象并取得对象ID;
《4》对象ID通过HASH算法被分配到不同的PG;
《5》不同的PG通过CRUSH算法被分配到不同的OSD。

2.3、Ceph的网络

可以在 Ceph 配置文件的 global 部分配置两个网络:

  • public network = {public-network/netmask}
  • cluster network = {cluster-network/netmask}

public network是连接客户端通信的网络【网络带宽没有严格要求,一般千兆就够了】。cluster network是连接 Ceph 各存储节点集群内通信的网络【涉及各种数据的大量传输,需要很高的网络带宽,一般都需要万兆或者光纤】。