谈谈BlueStore

目录

    • 未完待续
    • 前言
    • 组成
    • 前期准备工作
      • 基础概念
        • 对象
        • Pextent
        • extent
        • Blob
        • Node
      • 线程
      • 事务
      • 磁盘的抽象与分配
        • 位图法
        • 分层位图
    • 上电流程
    • 写流程
    • 读流程
    • 参考资料

未完待续

前言

BlueStore是什么?
Ceph是一个统一的分布式存储系统。BlueStore是Ceph的存储引擎。
它的作用是什么?
存储引擎的作用还能是什么?把Ceph上层交给他的数据安稳的存储在磁盘上,需要的时候再读出来或者删除。这就是他的作用。

组成

在这里插入图片描述
如上图,BlueStore由下面接模块构成:

  • RocksDB:为BlueStore提供kv存储。
  • BlueFs:RocksDB是一个持久化的kv存储系统,但是Rocksdb本身又不能直接操作磁盘读写数据,在这个情况下,BlueFS就承担了这个职责,作为一个文件系统,为RocksDB提供了磁盘上文件的读写能力。
  • BlueRocksEnv:在RocksDB与BlueFS间提供一个桥梁。
  • Allocator:磁盘的空间管理器。
  • BlockDevice:以HDD或者SSD为代表的裸盘
    从上图我们可以看到,对于用户数据本身是由BlueStore直接操作裸盘进行读写,但是对于用户数据的元数据,是通过RocksDB进行读写的。

前期准备工作

在开始研究BlueStore的工作流程前,咱们先了解一下必要的知识。

基础概念

对象

咱们尽量从一个实际的例子进行说明。假定我需要存储《流浪地球2》这个电影,电影本身是20个GB。在Ceph里,会把这个20GB的文件切分称2MB(或者4BM,参数,可配)的一个个文件块,我们把这个文件块就叫做对象。而在BlueStore这一层,是感知不到20GB的《浏览地球2》,它只能感知到2MB的对象块。

Pextent
struct bluestore_pextent_t {
    // 磁盘上的物理偏移
    uint64_t offset = 0;

    // 数据段的长度
    uint32_t length = 0;
}

Pextent就是代表真实的物理磁盘上的一个区间。offset就是相对于磁盘上起始位置的偏移量,length的单位就是字节。

extent
struct Extent {
    // 对象内逻辑偏移,不需要块对齐。
    uint32_t logical_offset = 0;

    // 逻辑段长度,不需要块对齐。
    uint32_t length = 0;

    // 当logical_offset是块对齐时,blob_offset始终为0;
    // 不是块对齐时,将逻辑段内的数据通过Blob映射到磁盘物理段会产生物理段内的偏移称为blob_offset。
    uint32_t blob_offset = 0;
	// 多个物理块
	BlobRef  blob; 
  
}

对于那个2MB的对象,在BlueStore里,也会对他进行逻辑切分。假定把2MB的对象切分成3块,第一块512KB,第二块512KB,第二块1024KB,那么
第一个Extent的logical_offset 是0,length是5121024
第二个Extent的logical_offset是1
5121024,length是5121024
第三个Extent的logical_offset是25121024,length是1024*1024

上面还有blob_offset 的概念,大家暂时忽略。

Blob

在上面的Extent里面还有一个Blob是什么意思?
就上面那个例子,在真实的物理磁盘上,不一定有一块连续的空闲的1MB的空间。所以BlueStore会把物理上不在一块的磁盘空间逻辑上放到一块。

struct Blob {
    // reference count
    std::atomic_int nref = {0};

    mutable vector<bluestore_pextent_t> blob;
}

一个512KB的Blob,内部可能是磁盘上3个并不相连的空间段拼起来的。

Node
// 内存数据结构
struct Onode {
    // reference count
    std::atomic_int nref;

    // onode 对应的PG
    Collection *c;

    // onode磁盘数据结构
    bluestore_onode_t onode;

    // 有序的Extent逻辑空间集合,持久化在RocksDB。lexetnt--->blob
    ExtentMap extent_map;
    ......
}
// 磁盘数据结构 onode: per-object metadata
struct bluestore_onode_t {
    // 逻辑ID,单个BlueStore内部唯一。
    uint64_t nid = 0;

    // 对象大小
    uint64_t size = 0;

    // 对象扩展属性
    map<mempool::bluestore_cache_other::string, bufferptr> attrs;
    ......
}

上面的Onode 描述一个对象(就是那个2M的对象)的信息。
上面的ExtentMap,大家猜一下也能知道,假定一个对象被分成了3个Extent,那都是哪3个Extent呢,对象本身得知道,自己的数据逻辑上分成了哪几块么。

线程

事务

磁盘的抽象与分配

位图法

BlueStore面对的一块完完全全的裸盘。那么第一个问题就是,BlueStore怎么知道磁盘上那一块用了,哪一块没有用呢。
首先对磁盘进行分块,假定就按照4KB分块。
其实一个思路就是先把磁盘上的块进行编号,然后对于每个块使用一个比特的0代表已经被使用,1代表没有使用。这样以来我只要使用原始硬盘空间的32768分之1的空间就能描述磁盘里每个区域的使用情况了(410248=32768)
那么一个100GB的磁盘,大概只需要32MB的内存比特流就能描述。
以上,就叫做位图法。

分层位图

以上面的例子来说,假如我需要再1块100GB的磁盘上分配4KB的块,最最极端情况下,我就得扫描32MB的数据,才能知道哪个块没有被使用。这个是不可接受的。
大家知道跳表么?
还是那个100GB的空间,我假定L0层就是32MB的内存块。
我在L1层申请64KB的内存块,L1的一个比特对应L0层的512个比特。
假定L0的前512个比特都是0(代表磁盘上5124KB的一段区域都已经被分配了)那么我L1上第1个比特就是0。
假定L0的前512个比特不都是0(代表磁盘上512
4KB的一段区域还没有被完全分配完)那么我L1上第1个比特就是1。
如果磁盘空间更大了,那么L1上面还可以加一个L2。
这样以来,分配空闲磁盘的时间复杂度就可控了。

上电流程

写流程

读流程

参考资料

https://zhuanlan.zhihu.com/p/68067068
https://zhuanlan.zhihu.com/p/92397191

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言:内存函数(memcpy memmove memset memcmp使用)

和黛玉学编程呀------------- 后续更新的节奏就快啦 memcpy使用和模拟实现 使用 void * memcpy ( void * destination, const void * source, size_t num ) 1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 2.这个函数在遇到 \0 的时候…

深入理解网络编程之BIO和NIO

目录 原生JDK网络编程BIO BIO通信模型服务端代码 BIO通信模型客户端代码 伪异步模型服务端代码&#xff08;客户端跟之前一致&#xff09; 原生JDK网络编程NIO 什么是NIO&#xff1f; NIO和BIO的主要区别 阻塞与非阻塞IO NIO之Reactor模式 NIO中Reactor模式的基本组成…

【深度学习】基于PyTorch架构神经网络学习总结(基础概念基本网络搭建)

神经网络整体架构 类似于人体的神经元 神经网络工作原来为层次结构&#xff0c;一层一层的变换数据。如上述示例有4层&#xff0c;1层输入层、2层隐藏层、1层输出层神经元&#xff1a;数据的量或矩阵的大小&#xff0c;如上述示例中输入层中有三个神经元代表输入数据有3个特征…

国家博物馆逆向抢票协议

逆向工程的具体步骤可以因项目和目标系统的不同而有所变化。然而&#xff0c;以下是一般逆向工程的一般步骤&#xff1a; 1. 分析目标系统&#xff1a;对待逆向的系统进行调研和了解&#xff0c;包括其架构、功能、使用的技术等方面的信息。 2. 反汇编或反编译&#xff1a;使…

简单实践 java spring boot 自动配置模拟

1.概要 1.1 需求&#xff0c;自己写一个redis-spring-boot-starter模拟自动配置 自动配置就是在引入*-starter坐标后&#xff0c;可以已经spring框架的规则实现一些Bean的自动注入&#xff0c;并设置一些参数的默认值&#xff0c;且也可以在引入的工程中修改这些配置的值。这…

【算法】约数之和(数论)

题目 给定 n 个正整数 ai&#xff0c;请你输出这些数的乘积的约数之和&#xff0c;答案对 1097 取模。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 ai。 输出格式 输出一个整数&#xff0c;表示所给正整数的乘积的约数之和&#xff0c;答案需…

openssl3.2 - 官方demo学习 - pkcs12 - pkwrite.c

文章目录 openssl3.2 - 官方demo学习 - pkcs12 - pkwrite.c概述学到的知识点笔记PEM证书可以拼接实验 pkcs12 - pkwrite.c用win10的证书管理器安装P12证书是成功的END openssl3.2 - 官方demo学习 - pkcs12 - pkwrite.c 概述 openssl3.2 - 官方demo学习 - 索引贴 上次PKCS12的…

比瓴科技入围软件供应链安全赛道!为关键信息基础设施安全建设注入新动力

1月20日&#xff0c;中关村华安关键信息基础设施安全保护联盟会员大会暨关键信息基础设施安全保护论坛在北京成功举办&#xff0c;比瓴科技作为会员单位受邀出席。 本次论坛发布了《关键信息基础设施安全保护支撑能力白皮书&#xff08;2023&#xff09;》&#xff0c;比瓴科技…

智能分析网关V4+EasyCVR视频融合平台——高速公路交通情况的实时监控和分析一体化方案

随着2024年春运帷幕的拉开&#xff0c;不少人的返乡之旅也即将开启&#xff0c;从这几日的新闻来看&#xff0c;高速上一路飘红。伴随恶劣天气&#xff0c;加上激增的车流&#xff0c;极易导致高速瘫痪&#xff0c;无法正常使用。为解决此问题&#xff0c;助力高速高效运营&…

Cmake语法学习2:常用变量

目录 1.常用变量简介 1.1提供信息的变量 1.2改变行为的变量 1.3描述系统的变量 ​编辑1.4控制编译的变量 2.提供信息的变量 2.1PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 2.2 CMAKE_SOURCE_DIR 和 CMAKE_BINARY_DIR 2.3CMAKE_CURRENT_SOURCE_DIR 和CMAKE_CURRENT_BIN…

gRPC使用详解

起源特点主要优缺点应用场景组成部分使用方法SpringBoot集成gRPCVert.x集成gRPCNacos集成gRPC监控gRPC调用过程Java使用示例 起源 gRPC的起源可以追溯到2015年&#xff0c;当时谷歌发布了一款开源RPC框架&#xff0c;名为gRPC。gRPC的设计初衷是为了提供一种标准化、可通用和跨…

excel统计分析——卡方独立性检验(下)

参考资料&#xff1a;生物统计学 书接上文&#xff1a;https://blog.csdn.net/maizeman126/article/details/135893731 2、配对列联表 配对设计的数据&#xff0c;进行列联表检验时&#xff0c;采用McNemar-Bowker检验法进行检验。检验统计量为&#xff1a; 自由度dfk(k-1)/2…

CSS是一门需要单独学习的技术吗?

CSS (Cascading Style Sheets) &#xff0c;做前端开发的人都很清楚&#xff0c;因为这是他们的一项必不可少的技能。我以前也是知道CSS&#xff0c;但从来没有单独学习过&#xff0c;认为就它只是用来渲染网页的表现层效果&#xff0c;定制页面和内元素的布局、颜色和字体等&a…

python 蓝桥杯处理各种输入的数据

文章目录 空格间隔提取数字 空格间隔提取数字 对于以空格间隔的数字&#xff0c;由于输入的形式是字符串&#xff0c;那么就可以使用split 函数进行对输入的一个分隔&#xff0c;然后利用split 函数返回的是分隔之后的一个列表&#xff0c;再利用下标对于每一个部分进行相对应的…

C++学习Day01之C++对C语言增强和扩展

目录 一、程序及输出1.1 全局变量检测增强1.2 函数检测增强1.3 类型转换检测增强1.4 struct增强1.5 bool类型扩展1.6 三目运算符增强1.7 const增强1.7.1 全局Const对比1.7.2 局部Const对比1.7.3 Const变量初始化数组1.7.3 Const修饰变量的链接性 二、分析总结 一、程序及输出 …

Linux——存储管理

文章目录 基本分区磁盘简介磁盘分类linux的磁盘命名磁盘的分区方式 管理磁盘虚拟机添加硬盘查看磁盘信息磁盘分区流程创建分区创建文件系统挂载mount查看挂载信息 剩余空间继续分区MBR如何划分更多的分区为什么只能有4个主分区扩展分区的引入 逻辑卷LVM是什么特点术语创建LVMVG…

算法40:线段树 + 懒更新

线段树&#xff1a;一种支持范围整体修改和范围整体查询的数据结构 解决的问题范畴&#xff1a; 大范围信息可以只由左、右两侧信息加工出&#xff0c; 而不必遍历左右两个子范围的具体状况。 白话版解释就是&#xff1a;针对数组可以范围进行修改和查询。 假设&#xff0c;一…

云原生 API 网关链路追踪能力重磅上线

云原生API网关介绍 云原生 API 网关是腾讯云基于开源网关推出的一款高性能高可用的云原生 API 网关产品&#xff0c;作为云上流量入口&#xff0c;集成请求分发、API 管理、流量监控、访问限制等功能&#xff0c;是微服务架构和容器架构中的重要组件。 TSE 云原生 API 网关提…

蓝桥杯-常用STL(二)

常用STL &#x1f388;1.集合&#x1f388;2.set的基础使用&#x1f52d;2.1引入库&#x1f52d;2.2插入元素&#x1f52d;2.3删除元素&#x1f52d;2.4判断元素是否存在&#x1f52d;2.5遍历元素&#x1f52d;2.6清空 &#x1f388;3.set与结构体 &#x1f388;1.集合 &#x…

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中&#xff0c;scope的默认值是compile。 scope的分类 compile&#xff08;默认&#xff09; 含义&#xff1a; compile 是默认值&#xff0c;如果没有指定 scope 值&#xff0c;该元素…
最新文章