Ceph如何操作底层对象数据

news2024/11/24 4:07:05

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/

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

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

相关文章

配资平台app(正规股票配资软件)架构是怎么搭建的?

随着股票市场的发展,越来越多的投资者开始尝试使用股票配资平台进行杠杆炒股,因此,搭建一套稳定、可靠的配资平台app架构显得尤为重要。本文将介绍配资平台app架构设计的关键要素,以及建立一个正规的配资平台app所需考虑的问题。 …

独立站站群模式是什么意思?站群模式的定义?自建站站群策略含义是什么?

什么是独立站站群模式? 在当今数字化时代,互联网已经成为了人们生活中不可或缺的一部分。随着互联网的发展,独立站站群模式逐渐引起了人们的关注。那么,究竟什么是独立站站群模式呢?让我们一起深入了解一下。 独立站…

85-基于stm32单片机厨房MQ4天然气泄露浓度DHT11温湿度监测报警系统Proteus仿真+源码...

资料编号:085 一:功能介绍: 1、采用stm32单片机OLED显示屏MQ4可燃气体浓度检测DHT11温湿度电机按键蜂鸣器,制作一个温湿度采集、MQ4可燃气体浓度采集,OLED显示相关数据, 2、通过按键设置温度上限、可燃气体…

高性能本地缓存Ristretto(四)—— NumCounters 与 MaxCost参数的设置

ristretto 参数 我在使用ristretto时,对于参数的设置有些疑问。主要是 NumCounters ,MaxCost 分别表示什么含义,以及如何确定其数值的问题。 在此记录并分享一下,欢迎各位批评指正,谢谢 官方的指导 先看一下官方的…

模糊测试面面观 | 模糊测试工具知多少

自1988年威斯康星大学的Barton Miller首次提出模糊测试这一概念以来,模糊测试领域经历了持续长久发展。模糊测试作为一种软件测试方法,旨在通过向程序输入模糊、随机、异常的数据,探测和发现潜在的漏洞和错误。这种方法备受安全研究人员的青睐…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价

近年来,国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究,他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合,评价不同类型研究区的生态脆弱特征,其研究内容…

win下qwidget全屏弹窗后其他窗口鼠标样式无法更新的问题

在win平台下,实现截取选桌面执行推理功能,用一个qwidget(j对象名为m_selectWidget)来显示选取范围的边框,但这个qwidget显示后,其他窗口在他下面可以接受鼠标相应的事件,但原来的鼠标形状功能失效(mac正常&…

构建去中心化微服务集群,满足高可用性和高并发需求的实践指南!

随着互联网技术的不断发展,微服务架构已经成为了开发和部署应用程序的一种主流方式。然而,当应用程序需要满足高可用性和高并发需求时,单一中心化的微服务架构可能无法满足性能和可靠性的要求。因此,构建一个去中心化的微服务集群…

Fine tune简介

目录 Intro Related work Example .1 重新训练 .2 使用新的数据集进行fine tune .3 修改net结构 References 移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(Fine-tune)。通过修改预训练网络模型结构(如修改样本类别输出个数),选择性载入预训练网络…

BOXTRADE-天启量化分析平台 主要功能介绍

BOXTRADE-天启量化分析平台 主要功能介绍 potato 数学 web 缘起 月晕而风,础润而雨 BOXTRADE-天启量化 欢迎来到天启量化!这是一个专注于量化分析的网站。我们致力于为用户提供市场行情技术指标和量化策略分析方面的优质内容和资源。 我们的使命是 做…

马斯克为何说大模型中R语言会替代Python

为什么不是Python? 当今的LLM应用程序,包括推理应用程序和代理,大多是用 Python 编写的。但这种情况即将改变。对于新一波的开发人员来说,Python 实在是太慢、太臃肿,而且要命的是太笨拙了。事实上, LLVM、…

安防视频汇聚平台EasyCVR视频监控综合管理平台H.265转码功能更新,新增分辨率配置的具体步骤

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

sql server安装报错 合成活动模板库(ATL) 失败

错误 “合成活动模板库(ATL) 规则失败“ 解决办法: 进入SQL Server 2008R2安装包目录找到文件:sqlsupport_msi,安装此文件之后,再安装SQL Server,便可解决该问题。C:\SQL Server 2008R2\new\SQL Server 2008R2\2052_CH…

专访阿里云席明贤,视频云如何运用大模型与小模型来破茧升级2.0

不久前,LiveVideoStack与阿里云视频云负责人席明贤(花名右贤)展开一场深度的对话,一个是圈内专业的社区媒体,一个是20年的IT老兵,双方有交集、有碰撞、有火花。 面对风云变幻的内外环境,阿里云…

【开发】视频云存储EasyCVR视频汇聚平台AI智能算法定制

安防视频集中存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

Golang 基础语法问答

使用值为 nil 的 slice、map 会发生什么? 允许对值为 nil 的 slice 添加元素,但是对值为 nil 的 map 添加元素时会造成运行时 panic。 // map错误示例 func main() {var m map[string]intm["one"] 1 // error: panic: assignment to entry …

构建高可用的去中心化微服务集群架构指南

随着云计算、大数据和物联网的快速发展,企业对于可扩展的、高性能的微服务架构的需求也日益增长。传统的集中式架构已经不能满足这些需求,因此出现了去中心化的微服务集群架构。本文将介绍如何构建高可用的去中心化微服务集群架构,以满足企业…

多路复用epoll函数组

epoll函数组 /*创建epoll句柄*/ int epoll_create(int size);//size参数实际上已经被弃用 /*epoll句柄的控制接口*/ int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event); epfd:epoll专用的文件描述符,epoll_create()的返回值 op:表示动作&#x…

美国大模型风向速报(一)为何重视提示工程?LangChain+向量数据库+开源大模型真香...

多家,且独家来自美国的信源同时向“亲爱的数据”表示, 提示工程(Prompt Engineering)在美国大模型领域备受重视。 读者都要聊, 那就干活。 (一)开源真香 现阶段,AI开源极客大展身手&…

认识容器,走进Docker

文章目录 容器技术简介容器的核心技术容器平台技术容器的支持技术 Docker理念Docker安装配置阿里云镜像加速器 容器技术简介 一切在云端,万物皆容器,说到容器,大家都会想到Docker,Docker现在几乎是容器的代名词,什么是Docker&…