Ceph 入门——内部构件

来源:互联网 发布:免费电子相册制作软件 编辑:程序博客网 时间:2024/05/01 10:11

  • 对象
  • CRUSH
    • 1 CRUSH 查找
    • 2 CRUSH 层级结构
    • 3 恢复和再平衡
    • 4 编辑 CRUSH map
    • 5 定制集群布局
  • PG 归置组
    • 1 PG 数计算
    • 2 PG 与PGP
    • 3 PG peeringup集合和acting 集合
  • Ceph池
    • 1 POOL与PG
  • Ceph 数据管理

1 对象

一个对象包含绑定在一起的数据和元数据,并有唯一标识的表示符(ID)。另外对象的大小是可以随着大小可变的元数据而变得更大的。元数据是数据的数据。在一个对象中,数据存储为丰富的元数据,它们存储上下文和数据的实际内容等信息。

一个对象的元数据并不受限于类型或者数量,可以在元数据中添加自定义的类型。对象不是不使用层次结构或者树状结构,而是使用没有任何复杂度的线性地址空间中。对象可以存储在本地,也可以是地理上分开的线性地址空间。这种机制可以帮助对象唯一的标识自己。对象以复制的方式存储在基于对象存储的设备中(OSD)。

Ceph中的所有数据单元都是以对象的形式存储在一个池中。Ceph的池是一个用来存储对象的逻辑分区。

2 CRUSH

元数据是数据的数据,存储的信息是数据存储在存储节点和磁盘阵列的位置信息。添加数据时,元数据最新更新,然后才是实际的数据存储。如果失去元数据,将会失去所有的数据。因此为了防止元数据丢失,所做出的处理,如在单节点上保持多个副本或者复制整个数据和元数据来保证容错度,将会造成伸缩、可用性、性能上的瓶颈。

Ceph使用可扩展散列下的受控复制(Controlled Replication Under Scalable Hashing,CRUSH)算法,它是Ceph的智能数据分发机制。与传统的依赖于存储和管理一个核心元数据/索引不同的是,Ceph使用CRUSH算法来准确计算数据写入或者读取的位置。CRUSH按需计算元数据,而不是存储元数据。

2.1 CRUSH 查找

CRUSH 机制的运行方式:元数据计算的负载是分布式的、按需的。元数据计算的过程也叫 CRUSH查找,CRUSH不依赖于系统。Ceph给客户端提供了足够的灵活性来按需执行元数据计算,客户端可以使用自己的系统资源来执行CRUSH查找,从而取消中心查找。


这里写图片描述

对于一次读写操作,客户端先从monitor获取集群的map。从map中获取集群的状态和信息配置,使用对象和池名/ID 将数据转化为对象。然后将对象和PG(placement groups,归置组)数经过散列来生成应当存放的PG。针对这个PG ID经过CRUSH查找来确定存储或者获取数据所需的OSD的位置。得到OSD ID之后,客户端直接联系OSD存取数据。计算都有客户端来执行,不会影响集群的性能,数据写入OSD后,主OSD所在节点将执行CRUSH查找操作来计算辅助归置组和OSD的位置来实现数据复制。

2.2 CRUSH 层级结构

CRUSH 了解所有的基础设施并支持自定义配置,它维护一个所有基础设施组件的一个嵌套层次结构。CRUSH层次列表通常包含数据中心、房间、组、机架等,这些组件称为故障域或者CRUSH bucket。CRUSH包含可用的bucket,这些bucket表明了设备的具体物理位置。还包含一些规则,告诉CRUSH如何为不同的Ceph池复制数据。


这里写图片描述

根据基础设施,CRUSH扩故障域来传播数据及其副本,解决了单点故障问题,同事保证高可用性。CRUSH均匀地在整个集群磁盘上写数据,确保所有磁盘都同等的利用,而不考虑他们的能力。CRUSH为每个OSD分配权重,OSD权重越高,表示物理存储容量越大,CRUSH会写入更多的数据到这个OSD上。

2.3 恢复和再平衡

故障域内任何组件发生故障以后,默认下Ceph会等待300s ,而后Ceph将该OSD标记为down和out并初始化恢复操作。CRUSH会复制数据到多个磁盘,这些复制的数据在恢复的时候使用。

CRUSH会复制数据到多个磁盘,这些复制的数据在恢复的时候使用。恢复期间CRUSH试图移动尽量少的数据来构建一个新的集群布局。

当一个新的主机或者磁盘添加到Ceph集群中时,CRUSH开始执行再平衡,从现有的主机/磁盘 移动数据到新的主机磁盘。再平衡保证所有磁盘能够均匀的使用,在再平衡期间要注意集群的性能,不能因为再平衡而下降。可以在新加入的OSD设置权重为0,然后依次提升到容量对应水平的权重。

2.4 编辑 CRUSH map

使用ceph-deploy 部署Ceph后,它会为配置文件生成一个默认的CRUSH map。Ceph提供定制CRUSH map的功能。

1) 提取现有的CRUSH map

#ceph osd getcrushmap -o crushmap.txt

2) 反编译CRUSH map。

#crushtool -d rushmap.txt -o crushmap-decompile 

3) 使用任何编辑器编辑CRUSH map:

#vi crushmap-decompile

4) 重新编译这个新的CRUSH map

#crushtool -c crushmap-decompile -o crushmap-compile

5)将新的CRUSH map 引用到Ceph 集群中

#ceph osd setcrushmap -i crushmap-compiled

2.5 定制集群布局

默认的Ceph部署是不知道非交互式组件的,如机架、数据中心等。初始化部署只有主机和OSD,我们需要按照要求制定不觉。

1)查找当前集群布局

ceph osd tree

2)在Ceph集群中添加机架

ceph osd crush add-bucket [rack name] rack

3) 移动主机到指定机架下

ceph osd crush move [node-name] rack=[rack name]

4)移动机架到主机下

ceph osd crush move [rack name] root=default

3 PG 归置组

PG (placement Group)是一组对象的逻辑集合。当集群收到数据存储请求时,CRUSH将数据分解成一组对象,根据对象的名称、复制级别和系统中PG总数执行散列,将结构生成PG ID。根据复制级别,每个PG的数据会被复制并分发到多个OSD上。可以将PG 看成是一个逻辑容器,这个逻辑容器包含多个对象,同时这个逻辑容器被映射到多个OSD上。PG是保障Ceph存储系统可伸缩性和性能的重要因素。

![这里写图片描述](http://img.blog.csdn.net/20171128181342669?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1NORF9QQU4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)系统只管理包含大量对象的PG,使得Ceph 成为一个更易于管理的系统。PG需要一定的资源(CPU 和内存),因为每个PG需要管理多个对象。因此PG的数量因当精心计算。增加集群PG的数量能够降低每个OSD的负载,为了避免PG占用OSD节点太多的资源,数量也应当限制。

3.1 PG 数计算

计算Ceph 集群PG总数公式如下:
PG总数 = (OSD)总数×100/最大副本数
结果必须舍入到2的N次幂

同事还应计算Ceph集群中每一个池中的PG数。
池PG总数 = ((OSD总数)×100)/最大副本数)/池数
同样的这个结果也要舍入到2的N次幂

3.2 PG 与PGP

PGP是为了实现定位而设置的PG,它的值应该与PG总数(即pg_num)保持一致。当增加PG的数量时,应该调整pgp_num 到同样的值,这样才能够开始再平衡。

参数pg_num 定义了PG数量。这些PG映射到OSD。当任意的pg_num 增加的时候,这个池的每个PG都一份为二。但是它们都跟源OSD保持映射。Ceph还没有开始再平衡,此时增加pgp_num 的值时,PG才开始从源OSD迁移到其它OSD,在开始再平衡。

3.3 PG peering、up集合和acting 集合

Ceph用多副本来保证数据可靠性。一般设置为2或者3副本。每个pg通过peering,来使它的多个副本达到一致的状态。Ceph的OSd守护进程会为每一个PG的所有对象及其元数据的状态在所有副本间执行peeing操作,包括存放该PG的所有OSD之间的确认操作。

Ceph会将多个PG上的任意对象存储多份,再通过PG将这几份放到不同的OSD上。通常称为主OSD、第二OSdD、第三OSD等。acting集合指负责该PG的所有OSD的集合,acting中第一个就是主副本。它负责该PG与第二、三副本间的peering操作。并且主OSD是唯一能够从客户端接收写操作的OSD。

主状态(处于up)状态的OSD会一直保持在acting集合中。主OSD的状态变为down,首先会将它从up集合中移除,然后第二OSD变成主OSD。并将该OSD添加到up集合中。

acting set & up set:每个pg都有这两个集合,acting set中保存是该pg所有的副本所在OSD的集合,比如acting[0,1,2],就表示这个pg的副本保存在OSD.0 、OSD.1、OSD.2中,而且排在第一位的是OSD.0 ,表示这个OSD.0是PG的primary副本。在通常情况下 up set 与 acting set是相同的。区别不同之处需要先了解pg_temp。

pg_temp : 假设当一个PG的副本数量不够时,这时的副本情况为acting/up = [1,2]/[1,2]。这时添加一个OSD.3作为PG的副本。经过crush的计算发现,这个OSD.3应该为当前PG的primary,但是呢,这OSD.3上面还没有PG的数据,所以无法承担primary,所以需要申请一个pg_temp,这个pg_temp就还采用OSD.1作为primary,此时pg的集合为acting,pg_temp的集合为up。当然pg与pg_temp是不一样的,所以这时pg的集合变成了[3,1,2]/[1,2,3]。当OSD.3上的数据全部都恢复完成后,就变成了[3,1,2]/[3,1,2]。

4 Ceph池

Ceph池是一个用来存储对象的逻辑分区。Ceph中的每个池都包含一定数量的PG,进而实现把一定数量的对象映射到集群内部不同的OSD上。每一个池都是交叉分布在集群的所有节点上。一个pool由多个PG构成。

池可以通过创建需要的副本数来保障数据的高可用性,比如复制或者纠删码。
在创建池的时候,可以指定副本数。当把数据写入一个池的时候,Ceph的池会映射到一个CRUSH规则集,CRUSH规则集就是通过识别池来实现集群内对象的分布和副本。并且池还支持快照功能,也可以给池分配一个用户ID来标识池的拥有者。

4.1 POOL与PG

pool 是一个抽象的存储池。它规定了数据荣誉的类型以及对应的副本分布策略。目前实现了两种pool类型:replictated 类型和Erasure Code 类型。一个pool由多个PG构成。

PG 可以理解为一个放置策略,它是对象的集合,集合里的所有对象都具有相同的放置策略。

![这里写图片描述](http://img.blog.csdn.net/20171128192351344?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1NORF9QQU4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) - PG1h和PG2都属于同一个pool,所以都是副本类型,并且都是两副本(都映射到了两个OSD) - PG1和PG2都包含多个对象,PG1上的所有对象主从副本分别比在OSD1和OSD2上,PG2的所有对象的主从副本都在OSD2 和OSD3上 - 一个对象只能属于,一个PG可以包含多个对象 - 一个PG的副本分布在对应的OSD列表上,一个OSD可以分布多个PG组。并且对于不同的对象同一个OSD可能是主OSD,可能是辅OSD。

5 Ceph 数据管理

数据管理始于客户端向Ceph 池中写入数据。一旦客户端准备写数据到Ceph池中,数据首先写入到基于池副本数的主OSD中。主OSD在复制相同的数据到第二OSD和第三OSD中,并等待他们确认写入完成。只要写入完成就会发送一个应答信号给主OSD,最后主OSD再返回一个应答信号给客户端,以确认完成整个写入操作。

数据是如何存储到Ceph集群中的

1.新建一个测试文件、一个存储池并设置副本数为3

[ceph@admin my-cluster]$ echo "123" > /tmp/helloceph[ceph@admin my-cluster]$ ceph osd pool create HPC_pool 128 128pool 'HPC_pool' created[ceph@admin my-cluster]$ ceph osd pool set HPC_pool size 3set pool 15 size to 3

2.将生成的测试文件存入该存储池中,并查看文件对象是否在池中

[ceph@admin my-cluster]$ rados -p HPC_pool put object1 /tmp/helloceph[ceph@admin my-cluster]$ rados -p HPC_pool lsobject1

3.可以看到文件存入存储池中了,数据都是以对象的形式存储在存储池中,这些对象属于一个PG,这些PG又对应多个OSD。

[ceph@admin my-cluster]$ ceph osd map HPC_pool object1osdmap e513 pool 'HPC_pool' (15) object 'object1' -> pg 15.bac5debc (15.3c) -> up ([3,2,0], p3) acting ([3,2,0], p3)

4.检查这些OSD的物理位置,可以看到他们在不同的故障域中。

[ceph@admin my-cluster]$ ceph osd treeID WEIGHT  TYPE NAME          UP/DOWN REWEIGHT PRIMARY-AFFINITY -1 0.05067 root default                                         -2       0     host node1                                       -3 0.01689     host node2                                        3 0.01689         osd.3           up  1.00000          1.00000 -4       0     host localhost                                   -5 0.01689     host admin                                        0 0.01689         osd.0           up  1.00000          1.00000 -6 0.01689     host rgw-node1                                    2 0.01689         osd.2           up  1.00000          1.00000 

5.登录到存储实际数据的一个节点中,在3中 pg 15.bac5debc (15.3c) 我们可以知道PG归置组的ID 是15.3c。

[ceph@node2 ceph-3]$ cd /var/lib/ceph/osd/ceph-3/current[ceph@node2 current]$ ls -l | grep -i 15.3cdrwxr-xr-x. 2 ceph ceph    65 Nov 28 19:55 15.3c_headdrwxr-xr-x. 2 ceph ceph     6 Nov 28 19:54 15.3c_TEMP[ceph@node2 current]$ cd 15.3c_head[ceph@node2 15.3c_head]$ ls -ltotal 8-rw-r--r--. 1 ceph ceph 0 Nov 28 19:54 __head_0000003C__f-rw-r--r--. 1 ceph ceph 4 Nov 28 19:55 object1__head_BAC5DEBC__f
原创粉丝点击