BlueStore BlueFS rocksdb 关联性梳理

news2024/10/7 16:19:06

Tag: ceph 12.2.4

BlueStore空间初始化

BlueStore磁盘空间管理

总述

  1. OSD挂载目录基于文件系统管理,Slow、WAL、DB空间区域基于裸盘管理;
  2. Slow区域:此类空间主要用于存储对象数据,由BlueStore管理,其中分配于BlueFS空间段使用bluefs_extents结构进行管理;
  3. WAL区域:单独由BlueFS管理并且对于BlueStore不可见,上电时由BlueFS自身负责初始化,对于.log文件以及自身产生的日志,BlueFS优先选择使用WAL类型设备空间,如果不存在或者WAL设备空间不足,则逐级降级选择DB、SLOW分区;
  4. DB区域:单独由BlueFS管理并且对BlueStore不可见,上电时由BlueFS自身负责初始化;对于.sst文件,则优先使用DB类型设备空间,如果不存在或者DB设备空间不足,则选择Slow类型设备空间;
  5. rocksdb:基于文件系统KV存储引擎,外部接口供BlueStore调用;
  6. BlueStore为支持rocksdb, 实现小型文件系统BlueFS,同时实现BlueRocksEnv为rocksdb提供底层系统封装;
  7. BlueFS: 扁平化目录和文件层次(树状)组织结构,定位某个具体文件共需要经过两次查找:通过dir_map找到文件所在最底层文件夹;再在该文件夹下file_map找到对应文件;每个文件bluefs_fnode_t结构管理,extents属性表示磁盘上的物理段集合,prefer_bdev属性表示存储该文件优先使用的块设备;extents集合中各个extent中bdev属性标识归属设备,每个文件都可能使用来自多个不同块设备(WAL、DB和Slow)空间;BlueFS:_allocate方法指定各个extent中bdev_属性值;重新上电,通过BlueFS::_replay通过DB分区第二个4K存储空间(superblock)固定入口位置,读取日志文件内容重放还原元数据(dir_map、file_map)。

初始化过程

[ceph_osd.cc]
int main(int argc, const char **argv)
>> OSD::mkfs(g_ceph_context, store, g_conf->osd_data, mc.monmap.fsid, whoami);

[OSD.cc]
int OSD::mkfs(CephContext *cct, ObjectStore *store, const string &dev, uuid_d fsid, 
  int whoami)
>> store->mkfs();
>> store->mount();

[BlueStore.cc]
int BlueStore::mkfs()
>> _setup_block_symlink_or_file("block", cct->_conf->bluestore_block_path,
	cct->_conf->bluestore_block_size, cct->_conf->bluestore_block_create);
>> _setup_block_symlink_or_file("block.wal", cct->_conf->bluestore_block_wal_path,
	cct->_conf->bluestore_block_wal_size, cct->_conf->bluestore_block_wal_create);
>> _setup_block_symlink_or_file("block.db", cct->_conf->bluestore_block_db_path,
	cct->_conf->bluestore_block_db_size, cct->_conf->bluestore_block_db_create);
>> _open_db(true);
>> _open_fm(true);  初始化FreelistManager

[BlueStore.cc]
int BlueStore::_open_db(bool create)
>> if (do_bluefs):
   >> bluefs = new BlueFS(cct);
   >> bluefs->add_block_device(BlueFS::BDEV_DB, bfn);
>> if (create): bluefs->add_block_extent(BlueFS::BDEV_DB, SUPER_RESERVED, 
                   bluefs->get_block_device_size(BlueFS::BDEV_DB) - SUPER_RESERVED);
>> if (create):
   >> bluefs->add_block_extent(bluefs_shared_bdev, start, initial);
   >> bluefs_extents.insert(start, initial);
>> if (create):
   >> bluefs->add_block_extent(BlueFS::BDEV_WAL, BDEV_LABEL_BLOCK_SIZE, 
         bluefs->get_block_device_size(BlueFS::BDEV_WAL) - BDEV_LABEL_BLOCK_SIZE);
>> if (create): bluefs->mkfs(fsid);
>> bluefs->mount();

[BlueFS.cc]
int BlueFS::mkfs(uuid_d osd_uuid)
>> _init_alloc();
>> 设置superblock信息
>> 初始化log_file

[BlueFS.cc]
int BlueFS::mount()
>> _init_alloc();
>> _replay(false);
>> for (auto& p : file_map):
    for (auto& q : p.second->fnode.extents):
      alloc[q.bdev]->init_rm_free(q.offset, q.length);
>> log_writer = _create_writer(_get_file(1));

[BlueFS.cc]
int BlueFS::_replay(bool noop)
>> 逐个回放事务op

BlueStore调用rocksdb相关接口

RocksDBStore实现KeyValueDB接口,BlueStore通过RocksDBStore实现对rocksdb操作。

open操作

[BlueStore.cc]
int BlueStore::_open_db(bool create)
>> db = KeyValueDB::create(cct, kv_backend, fn, static_cast<void*>(env));
>> if (create): db->create_and_open(err);

[RocksDBStore.cc]
int RocksDBStore::create_and_open(ostream &out)
>> do_open(out, true);

[RocksDBStore.cc]
int RocksDBStore::do_open(ostream &out, bool create_if_missing)
>> rocksdb::DB::Open(opt, path, &db);

read操作

[BlueStore.cc]
int BlueStore::read(const coll_t& cid, const ghobject_t& oid,
  uint64_t offset, size_t length, bufferlist& bl, uint32_t op_flags)
>> read(c, oid, offset, length, bl, op_flags);

[BlueStore.cc]
int BlueStore::read(CollectionHandle &c_, const ghobject_t& oid,
  uint64_t offset, size_t length, bufferlist& bl, uint32_t op_flags)
>> OnodeRef o = c->get_onode(oid, false);
>> _do_read(c, o, offset, length, bl, op_flags);
[注]
每个Onode包含一个ExtentMap,每个ExtentMap包含若干个Extent,
每个Extent负责管理一段逻辑范围内的数据并管理一个Blob,
由Blob通过若干个pextent负责将数据映射到磁盘

[BlueStore.cc]
BlueStore::OnodeRef BlueStore::Collection::get_onode(const ghobject_t& oid, bool create)
>> store->db->get(PREFIX_OBJ, key.c_str(), key.size(), &v);

[KeyValueDB.h]
virtual int get(const string &prefix,const char *key, size_t keylen, bufferlist *value)
>> get(prefix, string(key, keylen), value);

[KeyValueDB.h]
virtual int get(const std::string &prefix, const std::string &key, bufferlist *value)
>> get(prefix, ks, &om);

[RocksDBStore.cc]
int RocksDBStore::get(const string &prefix,
    const string &key, bufferlist *out)
>> db->Get(rocksdb::ReadOptions(), rocksdb::Slice(k), &value);

write操作

[BlueStore.cc]
void BlueStore::_kv_sync_thread()
>> db->submit_transaction_sync(synct);

[KeyValueDB.h]
virtual int submit_transaction_sync(Transaction t)
>> submit_transaction(t);

[RocksDBStore.cc]
int RocksDBStore::submit_transaction(KeyValueDB::Transaction t)
>> db->Write(woptions, &_t->bat);

remove操作

数据库中删除指定元数据键值对

[BlueStore.cc]
int BlueStore::_remove(TransContext *txc, CollectionRef& c, OnodeRef &o)
>> _do_remove(txc, c, o);

[BlueStore.cc]
int BlueStore::_do_remove(TransContext *txc,
  CollectionRef& c, OnodeRef o)
>> txc->t->rmkey(PREFIX_OBJ, o->key.c_str(), o->key.size());

[KeyValueDB.h]
virtual void rmkey(const std::string &prefix,   
  const char *k, size_t keylen)
>> rmkey(prefix, string(k, keylen));

[RocksDBStore.cc]
void RocksDBStore::RocksDBTransactionImpl::rmkey(const string &prefix, const string &k)
>> bat.Delete(combine_strings(prefix, k));

compact操作

可通过客户端命令行中对OSD相关指令(asok_command)

[BlueStore.h]
void compact() override
>> db->compact();

[RocksDBStore.cc]
void RocksDBStore::compact()
>> db->CompactRange(options, nullptr, nullptr);

[参考文献]

  1. 《Ceph设计原理与实现》 第2章 性能之巅—新型对象存储引擎BlueStore

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

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

相关文章

如何将枯燥的大数据进行可视化处理?

在数字时代&#xff0c;大数据已经成为商业、科学、政府和日常生活中不可或缺的一部分。然而&#xff0c;大数据本身往往是枯燥的、难以理解的数字和文字&#xff0c;如果没有有效的方式将其可视化&#xff0c;就会错失其中的宝贵信息。以下是一些方法&#xff0c;可以将枯燥的…

Python入门 类class 基础篇

记住一句话&#xff1a;类是模板&#xff0c;而实例则是根据类创建的对象。 我初学时对类的理解是从类的字面上&#xff0c;可以片面的认为它是一个种类&#xff0c;它是相似特征的抽像&#xff0c;也就是相似的东西&#xff0c;可以把相似特征的事务抽象成一个类。&#xff0…

基于串口校时的数字钟设计

文章目录 设计目标硬件设计数码管串口 软件设计顶层模块串口接收模块数据处理模块时钟模块串口发送模块 总结 设计目标 环境&#xff1a;ACX720开发板 实现功能&#xff1a; 数码管能够显示时分秒能够接收串口数据修改时间能够将当前时间以1s一次速率发送到电脑 硬件设计 数…

java之SpringBoot基础篇、前后端项目、MyBatisPlus、MySQL、vue、elementUi

文章目录 前言JC-1.快速上手SpringBootJC-1-1.SpringBoot入门程序制作&#xff08;一&#xff09;JC-1-2.SpringBoot入门程序制作&#xff08;二&#xff09;JC-1-3.SpringBoot入门程序制作&#xff08;三&#xff09;JC-1-4.SpringBoot入门程序制作&#xff08;四&#xff09;…

virtualbox 扩展磁盘大小

此处设置完成后&#xff0c;还需要进入虚拟机&#xff0c;实际扩展磁盘大小 参考 https://zhuanlan.zhihu.com/p/319431032

搭一个shinyAPP就是一篇《Bioinformatics》?

写在前面 原本想引用一番shiny&#xff0c;结果并没有检索出shiny研发团队所发表的论文&#xff0c;倒是有诸多shiny爱好者搭建shinyApp所发表的文章。例如这篇题为“ShinyGO: a graphical gene-set enrichment tool for animals and plants”、于2020年发表于《Bioinformatic…

【AWS】如何用SSH连接aws上的EC2实例(虚拟机)?

目录 0.环境 1.连接结果示例 2.SSH连接思路 3.具体步骤 1&#xff09;安装并运行ssh服务 2&#xff09;启动ssh服务 3&#xff09;在AWS上找到正在运行的EC2实例&#xff0c;并且根据提供的ssh连接语句进行连接 0.环境 windows 11 64位 前提&#xff1a; 有aws账户&…

B. Swap and Reverse

Problem - B - Codeforces 思路&#xff1a;这个题想复杂了&#xff0c;对于第一个条件&#xff0c;我们发现其实就是可以对所有的奇数位置之间任意交换&#xff0c;所有的偶数位置之间任意交换&#xff0c;对于第二个条件来说&#xff0c;如果k为奇数是没有意义的&#xff0c;…

2022年12月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;走迷宫 一个迷宫由R行C列格子组成&#xff0c;有的格子里有障碍物&#xff0c;不能走&#xff1b;有的格子是空地&#xff0c;可以走。 给定一个迷宫&#xff0c;求从左上角走到右下角最少需要走多少步…

跑得快的快递和跑得慢的快递差在哪些环节?

快递速度是现代物流的核心竞争力之一&#xff0c;对于电商行业和消费者而言&#xff0c;快捷、高效的快递服务意味着更好的购物体验和更高的客户满意度。大家都有过这样的经历&#xff1a;有时候我们选择了跑得快的快递公司&#xff0c;包裹几乎可以说是眨眼间就到达了目的地&a…

​SIGIR 2023 | 用于序列推荐的多兴趣预训练框架

©PaperWeekly 原创 作者 | 唐作立 单位 | 武汉大学硕士生 研究方向 | 推荐系统 引言 在推荐系统中&#xff0c;由于用户具备多种兴趣的特点&#xff0c;使用多兴趣学习&#xff08;Multi-interest Learning&#xff09;对用户进行建模能够带来显著的性能提升&#xff0c;…

【2023集创赛】加速科技杯二等奖作品:基于ATE的电源芯片测试设计与性能分析

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;加速科技杯二等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电子礼…

自然语言处理 微调大模型ChatGLM-6B

自然语言处理 微调大模型ChatGLM-6B 1、GLM设计原理2、大模型微调原理1、P-tuning v2方案2、LORA方案 1、GLM设计原理 bert的主要任务是随机的去除掉某个单词&#xff0c;使用上下文将其预测出来&#xff08;相当于完形填空任务&#xff09;&#xff1b; GPT的主要任务是根据前…

idea配置gitLab

前言&#xff1a;网上有很多类似的文章&#xff0c;但描述不够详细 步骤1&#xff1a;安装git 如果安装成功再次点击TEST按钮展示如下&#xff1a;git版本 步骤2&#xff1a;idea配置gitlab 查看当前项目管理的 远程仓库再git的地址&#xff0c;该地址可是gitLab的&#xff0…

基于sonar 的C#静态代码扫描使用总结

1.原理简介 C#语言接入Sonar代码静态扫描相较于Java、Python来说&#xff0c;相对麻烦一些。Sonar检测C#代码时需要预先编译&#xff0c;而且C#代码必须用MSbuid进行编译&#xff0c;如果需要使用SonarQube对C#进行代码质量分析&#xff0c;则需要Sonar-Scanner-MSBuild和MSBu…

WorldCoin 运营数据,业务安全分析

WorldCoin 运营数据&#xff0c;业务安全分析 Worldcoin 的白皮书中声明&#xff0c;Worldcoin 旨在构建一个连接全球人类的新型数字经济系统&#xff0c;由 OpenAI 创始人 Sam Altman 于 2020 年发起。通过区块链技术在 Web3 世界中实现更加公平、开放和包容的经济体系&#…

PHP 影院售票管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页代码

一、源码特点 PHP 影院售票管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 https://download.csdn.net/download/qq_41221322/88297676 PHP 影院售票管理系统Dr…

OpenCV(十九):模板匹配

1.模板匹配&#xff1a; OpenCV提供了一个模板匹配函数&#xff0c;用于在图像中寻找给定模板的匹配位置。 2.图像模板匹配函数matchTemplate void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask noArray() ); image…

小程序上传文件

wx.chooseImage({success (res) {const tempFilePaths res.tempFilePathswx.uploadFile({url: https://example.weixin.qq.com/upload, //仅为示例&#xff0c;非真实的接口地址filePath: tempFilePaths[0],name: file,formData: {user: test},success (res){const data res.…

GEE:空气污染指数 (API)计算

作者:CSDN @ _养乐多_ 本文记录了基于以下公式计算的空气污染指数代码: API = 0:7(NO2)+ 0:15(SO2)+ 0:1(O3)+ 0:05(CO) 计算空气污染指数 (API)。 文章目录 一、完整代码二、完整连接一、完整代码 var roi = table;var dataset_NO2 = ee.ImageCollection(