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

news2025/1/6 10:12:01

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Midjourney Imagine API 使用

Midjourney Imagine API 申请及使用 Midjourney 是一款非常强大的 AI 绘图工具,只要输入关键字,就能在短短一两分钟生成十分精美的图像。Midjourney 以其出色的绘图能力在业界独树一帜,如今,Midjourney 早已在各个行业和领域广泛…

docker从下载到Python项目打包到容器中运行(解决下拉超时问题)

docker安装(如果第一步或者第二步没有成功,说明是你的镜像源有问题,私聊我获取镜像源)镜像位置_/etc/yum.repos.d/CentOS-Base.repo sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/dock…

运算指令(PLC)

加 ADD 减 SUB 乘 MUL 除 DIV 浮点运算 整数运算

Linux高级--3.2.5 “外挂式”死锁监测设计

一、生活中“死锁”的场景 三个人,甲乙丙, 甲借了丙的钱,丙借了乙的钱,乙借了甲的钱。 甲找乙还钱,乙说:“别人还我 我就还你 ”,甲说:“好,那我等你” 乙找丙还钱&am…

图像去雾 | 基于Matlab的图像去雾系统(四种方法)

图像去雾 | 基于Matlab的图像去雾系统(四种方法) 目录 图像去雾 | 基于Matlab的图像去雾系统(四种方法)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Matlab的图像去雾系统(四种方法) 关于图像…

解决Vue中设置el-select的高度不生效问题

el-select是Element UI框架中的一个选择器组件&#xff0c;它允许用户从多个选项中选择一个或多个项目。但这里确存在一个小坑&#xff0c;我们可以看到直接修改el-select的高度是无法生效的 <template><div id"login"><el-select v-model"role…

嵌入式驱动开发详解8(阻塞/非阻塞/异步通信)

文章目录 前言阻塞非阻塞异步通知后续 前言 首先来回顾一下“中断”&#xff0c;中断是处理器提供的一种异步机制&#xff0c;我们配置好中断以后就 可以让处理器去处理其他的事情了&#xff0c;当中断发生以后会触发我们事先设置好的中断服务函数&#xff0c; 在中断服务函数…

人工智能之数学基础:向量内积以及应用

本文重点 向量的点积(Dot Product),又称数量积(Scalar Product)或内积,是线性代数中的一个重要概念。它接受两个向量作为输入,并返回一个实数作为输出。点积不仅在数学和物理学中有广泛应用,而且在人工智能领域也扮演着重要角色。 内积 在数学上,向量x和向量y的内积…

集线器,交换机,路由器,mac地址和ip地址知识记录总结

一篇很不错的视频简介 基本功能 从使用方面来说&#xff0c;都是为了网络传输的标识&#xff0c;和机器确定访问对象 集线器、交换机和路由器 常听到路由器和集线器&#xff0c;下面是区别&#xff1a; 集线器 集线器&#xff1a;一个简单的物理扩展接口数量的物理硬件。…

linux 逻辑卷挂盘

1.输入 sudo-i 转到root账号下。 2. 输入root密码后登录&#xff0c;输入parted -l &#xff0c;发现与以前的挂盘不一样&#xff0c;未挂的盘与系统盘在一起&#xff0c;都是/dev/vda里。 2.输入 lsblkr,查看逻辑分区的设备名称 3. 新增目录 mkdir /data 4. 尝试直接将逻辑分…

python23-常用的第三方库01:request模块-爬虫

requests 模块是 Python 中的一个第三方库&#xff0c;用于发送 HTTP 请求。 它提供了一个简单且直观的 API&#xff0c;使得发送网络请求和解析响应变得非常容易。requests 模块支持各种 HTTP 方法&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并且具有处理 cookies…

解释一下:运放的输入失调电流

输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…

常规继承类对象大小

这个相对简单&#xff0c;只需要考虑类对象大小的累加和内存对齐 #include<iostream> using namespace std;class Base { public:int ma;int mb;char mc; };class Derive :public Base { public:int md; };class Derive2 :public Derive { public:int me; };int main() …

Scrum中敏捷项目经理(Scrum Master)扮演什么角色?

敏捷开发模式已经逐渐被主流的软件研发团队所接受&#xff0c;其中Scrum是最具代表性的敏捷方法之一。Scrum框架中有三个核心角色&#xff1a;Product Owner&#xff08;PO&#xff09;、Scrum Master&#xff08;SM&#xff09;和Development Team&#xff08;DT&#xff09;。…

[网络安全]数据安全领域关键技术总结

去标识计算技术 概念 去标识计算 (Differential Privacy) 是一种数据隐私保护技术&#xff0c;它可以在不暴露个人敏感信息的前提下进行统计分析&#xff0c;并保证对隐私的泄露控制在可承受的范围之内。 底层逻辑 基于差分隐私的去标识计算是指在计算处理中采用一些差分隐私…

手机租赁平台开发实用指南与市场趋势分析

内容概要 在当今快速变化的科技时代&#xff0c;手机租赁平台的发展如火如荼。随着越来越多的人希望使用最新款的智能手机&#xff0c;但又不愿意承担昂贵的购机成本&#xff0c;手机租赁平台应运而生。这种模式不仅为用户提供了灵活的选择&#xff0c;还为企业创造了新的商机…

【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写

文章目录 一、随机数1、Random.Next()生成随机整数示例&#xff1a;生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例&#xff1a;生成随机浮点数 3、 生成随机字母或字符示例&#xff1a;生成随机字母示例&#xff1a;生成随机小写字母 二、…

overleaf写学术论文常用语法+注意事项+审阅修订

常用语法 导入常用的宏包 \usepackage{cite} \usepackage{amsmath,amssymb,amsfonts} \usepackage{algorithmic} \usepackage{algorithm} \usepackage{graphicx} \usepackage{subfigure} \usepackage{textcomp} \usepackage{xcolor} \usepackage{lettrine} \usepackage{booktab…

Rabbitmq追问1

如果消费端代码异常&#xff0c;未手动确认&#xff0c;那么这个消息去哪里 2024-12-31 21:19:12 如果消费端代码发生异常&#xff0c;未手动确认&#xff08;ACK&#xff09;的情况下&#xff0c;消息的处理行为取决于消息队列的实现和配置&#xff0c;以下是基于 RabbitMQ …

DeepSpeed训练得到checkpoint如何像Huggingface模型一样评测evaluation?zero_to_fp32.py有什么用?怎么用?

DeepSpeed训练得到checkpoint如何像Huggingface模型一样评测evaluation&#xff1f; 具体步骤 首先看一个样例&#xff1a; 这是我用open-instruct框架&#xff0c;使用DeepSpeed训练1728个steps得到的一个checkpoint。请注意&#xff0c;下文我演示用的例子是基于step_1152&…