开源存储详解-分布式存储与ceph

ceph体系结构

rados:reliable, autonomous, distributed object storage, rados

rados采用c++开发

对象存储

ceph严格意义讲只提供对象存储能力,ceph的块存储能力实际是基于对象存储库librados的rbd

对象存储特点

对象存储采用put/get/delete,不支持修改

对象存储结构是扁平结构,不支持多层容器嵌套结构

rados

rados集群主要由两种节点组成,osd和monitor。osd节点负责数据维护和存储,monitor节点负责检测和维护系统状态。osd和monitor节点之间相互传递节点状态信息,共同得出系统总体运行状态,并将其保存在一个全局数据结构中(集群运行图)

使用rados系统时,客户端向monitor索取最新集群运行图,然后直接在本地运算,得到存储的位置,便直接与osd通信,完成数据操作

osd,monitor,ceph客户端均可直接通信,意味osd也可以分担monitor等重要节点的部分业务,缓解节点压力

osd

osd可被抽象为系统进程和守护进程

osd节点实质是一个安装了os和fs的节点,同时还应当 保证osd拥有一定的计算能力,内存能力,网络带宽

osd的守护进程可完成osd的所有逻辑功能,包括monitor和其他osd的通信,维护系统及更新状态等

rados接收来自ceph客户端发送的数据,然后存储为对象,对象在节点是fs中的一个文件。对象存储中,是扁平结构,没有目录层次。文件只有文件id,对象内容的二进制格式和文件的元数据。文件元数据取决于客户端请求发送的一些信息,如文件创建者,创建日期,最后修改日期等

osd状态

osd状态直接影响数据重新分配

osd状态用两个维度表示:up或down(daemon和monitor连接是否正常)和in或out(osd是否有pg),两种状态叠加起来,osd总共有四种状态

up && in:osd正常工作状态

up && out:一般是osd刚启动,osd还没有pg

down && in:可能网络中断或daemon意外退出

down && out:osd无法恢复,

PG:Placement Group,用来映射osd节点和存储的对象

osd状态检测

ceph是基于通用计算机硬件构建的分布式系统,故障概率远高于专用硬件构建的分布式系统。如何检测节点故障和网络故障是ceph高可用的一个重点,ceph采用了心跳检测机制,但增加了监控维度

osd之间心跳包:如果osd之间都相互发送心跳,则时间复杂度是pow(n,2),ceph选择仅peerOSD之间发送心跳包,这样时间复杂度是pow(n,1)。peerOSD是osd存储对象和其PG副本所在的osd。ceph同时提供公共网络(osd和客户端通信)和集群网络(osd之间通信网络),peerOSD心跳包也可按网络进行分类。

osd和monitor之间心跳包:osd之间心跳检测结果通过osd和monitor心跳包传送

数据寻址

分布式系统有两个最基本的问题:数据放在哪,数据写在哪。ceph寻址过程如图

file:面向客户的文件对象

object:面向rados的文件对象。object和file的区别是,object单元最大大小存在上限(如2MB或4MB),大于单个object单元大小的file会被切分为一系列统一大小的object进行存储

PG:一个PG负责组织多个object,一个object只能被映射在一个PG,一个PG会被映射在n多个OSD中,实际工作中,n可能大于等于2

file->object映射

将file切分为object进行存储,每个object有唯一的oid,oid可分为两部分,分别是切分的object的元数据和object在切分列表里的序号,比如某个id为filename的文件被切分为序号为0,1,2的三个object,则三个object的oid分别为filename0 filename1 filename2

此处存在一个隐含问题,及文件的id(元数据)必须不重复,否则无法映射

object->PG映射

映射公式:hash(oid) && mask -> pgid

先对oid哈希,再和mask按位与。按rados设计,PG总数应为2的整数次幂,mask的值为PG总数-1所以此映射公式含义是从总数为m的PG中随机均匀地选取一个PG,这样的话,rados保证了object和pg尽量均匀的映射

PG->OSD映射

rados使用一个名为CRUSH的算法,输入pgid,输出n个osd id,n需配置为大于等于2。CRUSH算法和pgid的映射不同,它不是固定输出结果的,而是会受到其他因素影响:系统状态和存储策略配置。

系统状态:即集群运行图。其他osd状态变化时,可能导致集群运行图变化

存储策略配置:和安全有关,即管理员指定PG分配在OSD的规则,比如亲和规则

当系统状态和存储策略配置不变时,PG和OSD的映射才是固定不变的

使用CRUSH算法的原因,一个是算法结果收到配置osd亲和的影响,还有一个是CRUSH算法稳定性的特点,即系统中加入大量osd时,大部分PG和OSD之间的映射不会改变,只有少部分映射会发生改变,并引发数据迁移

小结

三个映射没有任何全局查表的操作,唯一的全局数据结构:集群运行图,其操作与维护是轻量级的,不会对系统造成太大影响

为什么在object和osd之间引入PG

如果没有PG,(1) 则osd损坏时,或新增osd时,原有的object和osd之间的映射无法被更新 (2)有PG时,osd间心跳检测是以PG为粒度,而PG数量在每个osd是基本固定的,当文件增多,PG不会增加。如果不用PG,则osd间心跳则以文件为粒度,当object变多,心跳花的时间也会变多

存储池

一个存储池包含若干PG

存储池创建命令

ceph osd pool create {POOL_NAME} {PG_NUM} [{PGP_NUM}] [REPLICATED] [CRUSH_RULESET_NAME]

ceph osd pool create {POOL_NAME} {PG_NUM} {PGP_NUM} erasure [erasure_code_profile] [crush_ruleset_name]

pgp数目通常和pg数目一致,增加pg数量通常不会发生迁移,增加pgp数量时用户数据才会发生迁移

PGP含义:

注意到,当PG增加时,原PG分为两半,所以新PG和原PG在同一个OSD上

monitor

客户端处理数据前必须通过monitor获取集群状态图。ceph也支持只有一个monitor节点

monitor不会主动查询osd状态,而是osd给monitor主动上报osd状态

集群运行图实际是多个map统称,如monitor map, osdmap, pg map, crush map, mds map等,各运行图维护各自的运行状态。CRUSH MAP用于定义如何选择OSD,CRUSH MAP是树形结构

default下是主机,主机下是主机自己的osd。CRUSH MAP中,所有非叶节点称为桶(Bucket),所有Bucket的ID都是负数,OSD ID是正数,这样可以区分OSD的ID。选择OSD时,需要先从一个指定的bucket开始,往树底下寻找,直到到达叶节点。目前有五种算法来实现子节点的寻找,包括Uniform,List,Tree,Straw,Straw2,不同算法性能如下

monitor与客户端通信

客户端包括rbd客户端,rados客户端,ceph fs客户端等。根据通信内容分为获取OSDMAP和命令行操作

命令行操作:主要由monitor执行或monitor转发到osd执行

获取OSDMAP:因为有了集群状态图,客户端可不经过monitor直接与osd通信,所以仅需要获取OSDMAP时,客户端才需要与monitor通信。再就是客户端初始化。再就是某些特殊情况会主动获取OSDMAP,如找不到PG(PG删除或创建),存储池等空间占满,或者OSDMAP设置了暂停所有读/写,每次读写都会获取OSDMAP

monitor与osd通信

相比monitor与客户端通信,monitor与osd通信更复杂

osd定期将其PG信息发给monitor。PG信息包含PG状态,Object信息等

osd操作命令通过monitor转发给osd

数据操作流程

ceph读写仅对object的主osd进行读写,保证了数据的强一致性。primary收到写请求后,负责把数据发给副本,只有副本都成功写,primary才接收object的写请求,保证了副本一致性,写入流程可参考下图

图中先经过前述章节的数据寻址找到对应的osd,然后客户端将数据发给primary osd,primary osd再给osd副本发送数据进行写请求,副本的写请求都完成并返回给primary时,primary再返回结果给客户端

cache tiering

分布式存储一个硬件组合是一般PC+一般机械硬盘。当需要优化系统的iops时,一个方法是新增快速的存储设备作为缓存,热数据在缓存中被访问到,缩短数据的访问延时。Ceph在FireFly0.80版本开始引入这种技术,称为Cache Tiering

Cache Tiering理论基础是数据访问是不均匀的,缓存那些访问频率最高的数据(热点数据),就可以提升读写响应时间

Cache Tiering的做法是,用比如固态硬盘等快速存储设备组成一个存储池作为缓存层,用相对慢速的机械硬盘等组成冷数据存储池。缓存层采用多副本模式

Cache Tiering中有个分层代理,当缓存层中数据不再活跃时,代理会把数据从缓存层移除,放入Storage层,这种操作称为Flush刷新或Evict逐出

Cache Tiering支持几种模式

写回模式 对于写操作,在缓存层写入完成后,直接返回客户端,再由缓存层的代理线程负责写回storage层。读操作可以看是否命中,若命中直接从缓存读,若未命中则可重定向到storage层访问,然后按一定规则判断是否将未命中的数据提升到缓存层

forward模式 所有请求都重定向到storage层

readonly模式 写请求直接重定向到storage层,读请求会使用缓存命中

readforward模式 读全部重定向到storage,写请求使用写回模式

readproxy模式 写采用写回模式,读请求使用缓存层作为代理,缓存层代理去storage读,再返回给客户端,缓存层不会存储读取数据到缓存层

块存储

ceph中的块设备称为image,是精简分配的,大小可调且可存储在多个osd中,且可对数据进行条带化

条带化:一块数据不支持多个进程同时访问,当多个进程访问时,就要排队,条带化是将连续的数据分片存储,减少访问进程的等待时间。条带化可将多个磁盘驱动器合并为一个卷,这个卷的速度比单个盘的速度快很多。ceph的块设备对应lvm的逻辑卷,块设备创建时,可指定某些参数进行条带化:stripe-unit-条带大小,stripe-count-在多少数量的对象之间进行条带化

使用块设备有两种方法:(1)将块设备交给内核,成为一个虚拟块设备,就像其他块设备一样,格式化然后可以挂载使用,名字一般为/dev/rbd0... (2) 通过librbd,librados进行管理,此种方法可工虚拟机进行使用

ceph fs

ceph fs是一个可移植操作系统接口兼容的分布式存储系统,与通常的nfs一样,访问fs时需要有对应的客户端。ceph fs支持两种客户端,ceph fs fuse和ceph fs kernel,也就是有两种使用ceph fs的方式,一个是通过kernel module,内核包含了ceph fs代码;一个是通过用户空间文件系统(FUSE)。Fuse的存在是因为某种情况无法升级kernel,将ceph和kernel分开弄,就互不影响

ceph fs底层除了osd monitor,还添加了元数据服务器(MDS),cephfs要求ceph存储集群至少有一个MDS,MDS只为cephfs服务,如果不需要cephfs,则不必使用MDS

MDS即能提高集群性能,也能降低集群负载。因为MDS以mds守护进程形式工作,当对文件对象进行ls,cd这些操作,如果让osd来处理会增加负载,如果将元数据相关操作和存储分离出来,可减少osd负载和请求次数

multi active MDS

目录长度

Luminous版本后,引入了multi active MDS。当目录越来越大,这个大目录的mds会成为性能瓶颈,multi active MDS采用了折中的目录划分方法,用户可以将不同的目录绑定到不同MDS,当某个目录长度增大时,超过mds_bal_split_size(默认10000),会对目录进行分割,一般情况下不会立即分割,因为可能影响到正常操作,而是会在mds_bal_fragment_interval秒后进行分割,如果目录长度超过mds_bal_fragment_fast_factor就会马上分割目录,分割产生的子目录数位2^mds_bal_split_bits

访问频率

mds为每个目录单独维护时间衰减计数器,用于对目录片段进行读写操作,当某个目录写或读操作,会导致计数器的计数增加,当写的计数或读的计数超过mds_bal_split_wr和mds_bal_split_rd时,会触发目录拆分

配额

后端存储objectstore

CRUSH算法

ceph可靠性

ceph中的缓存

ceph加密与压缩

qos

ceph性能测试与分析

ceph与openstack

相关推荐
lisanmengmeng12 天前
ceph 中的OSD
ceph
lisanmengmeng14 天前
CEPH的基本结构
ceph
lisanmengmeng16 天前
ceph一些命令
ceph
lisanmengmeng25 天前
cephadm 17.2.5安装部署 (二)
linux·运维·服务器·ceph
only_Klein25 天前
kubernetes集群下的分布式存储方案-ceph
ceph·kubernetes·分布式存储
苦逼IT运维25 天前
Helm 实战指南(四):生产环境 Helm 部署 CVAT 全记录:Ceph 存储、GPU 节点污点调度与 HTTPS 指南
ceph·网络协议·https
大新新大浩浩1 个月前
ceph平台-未及时移除故障osd导致根目录100%问题的故障记录
ceph
北亚数据恢复1 个月前
分布式数据恢复—Ceph+TiDB数据恢复报告
分布式·ceph·数据恢复·tidb·服务器数据恢复·北亚数据恢复·存储数据恢复
lisanmengmeng1 个月前
添加ceph节点
linux·服务器·ceph
张小凡vip1 个月前
Kubernetes---存储方案:Rook自动结合Ceph
ceph·容器·kubernetes