当前位置: 首页 > news >正文

Ceph如何操作底层对象数据

1.基本原理介绍

1.1 ceph中的对象(object)

在Ceph存储中,一切数据最终都会以对象(Object)的形式存储在硬盘(OSD)上,每个的Object默认大小为4M。

图片

通过rados命令,可以查看一个存储池中的所有object信息,例如下面的命令列出了存储池中的所有object。

rados -p pool-842bd759258f4ec9843afd1e78549350 ls

图片

1.2 rbd块与object之间的对应关系

知道一切数据都会以object的形式存在于硬盘中后,我们还需要了解对象和rbd块之间的对应关系是什么。在ceph存储中,每个rbd块都有一个block_name_prefix。这个值是唯一的,通过rbd info或rados命令可以查询到,每个存储rbd块真实数据的对象会以这个作为名称前缀。所以通过blocak_name_prefix我们可以找到rbd块对应的对象有哪些。

图片

1.3 rbd块中object的先后顺序如何区分

我们知道,一个object的大小为4M,因此一个rbd块对应的object通常会有多个。那么我们如何知道一个object对应rbd块中的哪一部分数据呢?要知道这个,我们就需要了解一下object的命令规则。

Object 名称由三部分组成:

  • rbd_data.:这是 RBD 存储卷的默认块名称前缀,用来标识这个 Object 存储的是一个 RBD 存储卷。

  • 115ea266096aee.:这是 RBD 存储卷的 ID,用来唯一标识一个 RBD 存储卷。每个 RBD 存储卷有一个唯一的 ID,可以通过 rbd info 命令查看。

  • 0000000000000c45:这是块的序号,用于标识这个 Object 存储的是 RBD 存储卷中的第几个块。在 RBD 存储卷中,每个块都有一个唯一的序号。采用的是16进制

所以通过objec的序号,我们可以知道object中保存了rbd块中哪个位置的数据。

图片

2.object操作工具介绍

ceph-objectstore-tool是ceph提供的一个能对osd中存储的object进行增删改查的工具。该工具只能操作处于停止状态的osd。

下面的命令列出osd2中所有的object,包括object所属的pg和位置信息

ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-2 --op list

下面的命令是根据上一条命令获取的信息将object导出到本地的文件test.raw中

ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-2/ --type bluestore --pgid $pgid ‘$Object_attr’ get-bytes > test.raw

图片

图片

 

3.离线导出数据实战
3.1数据导出整体流程

  1. 通过rbd的name,获取rbd块的object前缀

  2. 停止掉一台服务器上的全部osd,通过object前缀找出rbd相关的所有对象数据并导出。三副本故障域为服务器的情况下,如果ceph集群有四台或以上存储服务器的话,一台服务器上可能不具备一个rbd块的完整副本,需要将多个节点的osd上导出的数据拼成一个完整的副本。

  3. 通过dd命令将所有对象数据拼接成一个完整的rbd卷

3.2手动导出数据

rados -p $pool-name listomapvals rbd_directory|grep $rbd_name -C 5  ##获取rbd块的blocak_name_prefix信息

图片

通过上图可以看到rbd的id为59adb9d46665c,可以得到blocak_name_prefix为rbd_data.59adb9d46665c

接着查询osd2中与rbd块相关的对象,查询前需要先将osd2停,输出的结果中一行为一个对象。

systemctl stop ceph-osd@2ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-2 --op list 2>/dev/null  | grep rbd_data.59adb9d46665c

图片

再通过查询到的object信息,将object数据导出到本地

ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-$i/ --type bluestore --pgid $PGID '$OBJECT_JSON' get-bytes > $RBD_PREFIX/$OID

图片

通过dd命令创建一个新卷,再将object中的数据复制到新卷中,复制对象中的数据时,要根据object的位置调整数据写入的位置,即seek的值。object数据复制操作要执行多次,直到所有object中的数据都复制到创建的新卷中,数据导出操作完成。

dd if=/dev/zero of=rbd_data.1cabc42df0c8c4.raw bs=1 count=0 seek=2147483648  ##创建一个空文件,用来放对象的中的数据
echo $(( 0x00000000000000ff ))  ##16进制转十进制,获取对象在rbd块中的位置信息
dd if=rbd_data.1cabc42df0c8c4.0000000000000000 of=rbd_data.1cabc42df0c8c4.raw seek=0 bs=4M count=1 conv=notrunc   ##将对象中的数据复制到之前创建的空文件中。

图片

图片

 

数据导出完成后,默认是一个raw格式的文件,可以根据需要转换成qcow2或其他格式的文件。

图片

 

qemu-img convert -f raw -O qcow2 -p rbd_data.115ea266096aee.build.raw restore.qcow2

图片

3.3通过脚本导出数据

手动导出rbd数据是一个十分繁琐的操作,因此下面提供了两个脚本,可以完成导出对象数据,以及将对象数据合并成一个新卷的操作。

数据导出脚本,将某个rbd中的对象从osd中导出到本地。脚本执行前有两个地方需要修改。RBD_PREFIX的值修改为要导出rbd的blocak_name_prefix。declare osds的值修改为要执行脚本服务器上所有的osd id。

#!/bin/bash# Export rbd_data.xxxxxxxxx to local file from all inactive osds
# Number of concurrentN=64RBD_PREFIX=rbd_data.39c97c1ed6026c mkdir $RBD_PREFIX
#all osd id in one ceph nodedeclare osds=(8 9 10 11) for i in ${osds[@]}do(echo $RBD_PREFIX in osd $i
echo "Export object..."for j in $(ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-$i --op list 2>/dev/null|grep $RBD_PREFIX)doecho $jPGID=$(echo $j|jq ".[0]" -r)OBJECT_JSON=$(echo $j | jq ".[1]")OID=$(echo $j | jq ".[1].oid" -r)ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-$i/ --type bluestore --pgid $PGID "$OBJECT_JSON" get-bytes > $RBD_PREFIX/$OIDdone) &
if [[ $(jobs -r -p | wc -l) -ge $N ]]; thenwaitfidonewaitecho "All done."

数据合并脚本。将导出到本地的对象中的数据复制到一个新卷中。脚本在执行前需要将RBD_PREFIX的值修改为要导出rbd的blocak_name_prefix。

#!/bin/bashRBD_PREFIX=rbd_data.3262b63ba984f7IMAGE_NAME=$RBD_PREFIX.build.rawrm -f $IMAGE_NAMEdd if=/dev/zero of=$IMAGE_NAME bs=1 count=0 seek=2147483648for i in $(ls ./$RBD_PREFIX | sort)doidx=$(echo $i|awk -F '.' '{print $3}')idxOct=$(echo $((0x$idx)))dd if=./$RBD_PREFIX/$i of=$IMAGE_NAME seek=$idxOct bs=4M count=1 conv=notruncdone

4 总结

ceph本身提供了rbd export命令用来导出rbd块。用命令导出数据的方式更简单直接。本文主要针对某些osd无法启动、rbd命令无法执行的场景,可以通过文中的方式来进行数据导出。同时通过这种导出对象的方式,我们也能了解ceph数据存储的更多细节。

5 参考资料

https://docs.ceph.com/en/pacific/man/8/ceph-objectstore-tool/

相关文章:

Ceph如何操作底层对象数据

1.基本原理介绍 1.1 ceph中的对象(object) 在Ceph存储中,一切数据最终都会以对象(Object)的形式存储在硬盘(OSD)上,每个的Object默认大小为4M。 通过rados命令,可以查看一个存储池中的所有object信息,例如…...

sklearn机器学习库(二)sklearn中的随机森林

sklearn机器学习库(二)sklearn中的随机森林 集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。 多个模型集成成为的模型叫做集成评估器(ensemble estimator)&#xf…...

FlutterBoost 实现Flutter页面内嵌iOS view

在使用Flutter混合开发中会遇到一些原生比Flutter优秀的控件,不想使用Flutter的控件,想在Flutter中使用原生控件。这时就会用到 Flutter页面中内嵌 原生view,这里简单介绍一个 内嵌 iOS 的view。 注:这里使用了 FlutterBoost。网…...

走嵌入式还是纯软件?学长告诉你怎么选

最近有不少理工科的本科生问我,未来是走嵌入式还是纯软件好,究竟什么样的同学适合学习嵌入式呢?在这里我整合一下给他们的回答,根据自己的经验提供一些建议。 嵌入式领域也可以分为单片机方向、Linux方向和安卓方向。如果你的专业…...

【云计算原理及实战】初识云计算

该学习笔记取自《云计算原理及实战》一书,关于具体描述可以查阅原本书籍。 云计算被视为“革命性的计算模型”,因为它通过互联网自由流通使超级计算能力成为可能。 2006年8月,在圣何塞举办的SES(捜索引擎战略)大会上&a…...

Open3D (C++) 基于拟合高差的点云地面点提取

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、原始点云2、提取结果四、相关链接系列文章(连载中。。。): Open3D (C++) 基于高程的点云地面点提取Open3D (C++) 基于拟合平面的点云地面点提取Open3D (C++) 基于拟合高差的点云地面点提取</...

认识Transformer:入门知识

视频链接&#xff1a; https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 文章目录 Self-Attention layerMulti-head self-attentionPositional encodingSeq2Seq with AttentionTransformerUniversal Transformer Seq2Seq …...

《TCP IP网络编程》第二十四章

第 24 章 制作 HTTP 服务器端 24.1 HTTP 概要 本章将编写 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;服务器端&#xff0c;即 Web 服务器端。 理解 Web 服务器端&#xff1a; web服务器端就是要基于 HTTP 协议&#xff0c;将网页对…...

【AI】文心一言的使用

一、获得内测资格&#xff1a; 1、点击网页链接申请&#xff1a;https://yiyan.baidu.com/ 2、点击加入体验&#xff0c;等待通过 二、获得AI伙伴内测名额 1、收到短信通知&#xff0c;点击链接 网页Link&#xff1a;https://chat.baidu.com/page/launch.html?fa&sourc…...

CSAPP Lab2:Bomb Lab

说明 6关卡&#xff0c;每个关卡需要输入相应的内容&#xff0c;通过逆向工程来获取对应关卡的通过条件 准备工作 环境 需要用到gdb调试器 apt-get install gdb系统: Ubuntu 22.04 本实验会用到的gdb调试器的指令如下 r或者 run或者run filename 运行程序,run filename就…...

Java中使用流将两个集合根据某个字段进行过滤去重?

Java中使用流将两个集合根据某个字段进行过滤去重? 在Java中&#xff0c;您可以使用流(Stream)来过滤和去重两个集合。下面是一个示例代码&#xff0c;展示如何根据对象的某个字段进行过滤和去重操作&#xff1a; import java.util.ArrayList; import java.util.List; impor…...

自动驾驶HMI产品技术方案

版本变更 序号 日期 变更内容 编制人 审核人 文档版本 1 2 1....

Git判断本地是否最新

场景需求 需要判断是否有新内容更新,确定有更新之后执行pull操作&#xff0c;然后pull成功之后再将新内容进行复制到其他地方 pgit log -1 --prettyformat:"%H" HEAD -- . "origin/HEAD" rgit rev-parse origin/HEAD if [[ $p $r ]];thenecho "Is La…...

Spring 整合RabbitMQ,笔记整理

1.创建生产者工程 spring-rabbitmq-producer 2.pom.xml添加依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.7.RELEASE</version></dep…...

Lua 语言笔记(一)

1. 变量命名规范 弱类型语言(动态类型语言)&#xff0c;定义变量的时候&#xff0c;不需要类型修饰 而且&#xff0c;变量类型可以随时改变每行代码结束的时候&#xff0c;要不要分号都可以变量名 由数字&#xff0c;字母下划线组成&#xff0c;不能以数字开头&#xff0c;也不…...

【Redis】什么是缓存穿透,如何预防缓存穿透?

【Redis】什么是缓存穿透&#xff0c;如何预防缓存穿透&#xff1f; 缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存中不存在&#xff0c;这时会去数据库查询查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到数据库去查询&#xff0c;这…...

LeetCode128.最长连续序列

我这个方法有点投机取巧了&#xff0c;题目说时间复杂度最多O(n),而我调用了Arrays.sort(&#xff09;方法&#xff0c;他的时间复杂度是n*log(n)&#xff0c;但是AC了&#xff0c;这样的话这道题还是非常简单的&#xff0c;创建一个Hashmap&#xff0c;以nums数组的元素作为ke…...

Datawhale Django入门组队学习Task02

Task02 首先启动虚拟环境&#xff08;复习一下之前的&#xff09; 先退出conda的&#xff0c; conda deactivate然后cd到我的venv下面 &#xff0c;然后cd 到 scripts&#xff0c;再 activate &#xff08;powershell里面&#xff09; 创建admin管理员 首先cd到项目路径下&a…...

PCTA 认证考试高分通过经验分享

作者&#xff1a; msx-yzu 原文来源&#xff1a; https://tidb.net/blog/0b343c9f 序言 我在2023年8月10日&#xff0c;参加了 PingCAP 认证 TiDB 数据库专员 V6 考试 &#xff0c;并以 90分 的成绩通过考试。 考试总分是100分&#xff0c;超过60分就算通过考试。试卷…...

[Python]pytorch与C交互

文章目录 C库ctypes基础数据类型参数与返回值类型数组指针结构体类型回调函数工具函数 示例 ctypes是Python的外部函数&#xff0c;提供了与C兼容的类型&#xff0c;并允许调用DLL库中的函数。 C库 要使函数能被Python调用&#xff0c;需要编译为动态库&#xff1a; # -fPIC…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...