大同网站开发/网络营销软文范例大全800
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数据导出整体流程
-
通过rbd的name,获取rbd块的object前缀
-
停止掉一台服务器上的全部osd,通过object前缀找出rbd相关的所有对象数据并导出。三副本故障域为服务器的情况下,如果ceph集群有四台或以上存储服务器的话,一台服务器上可能不具备一个rbd块的完整副本,需要将多个节点的osd上导出的数据拼成一个完整的副本。
-
通过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@2
ceph-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 concurrent
N=64
RBD_PREFIX=rbd_data.39c97c1ed6026c
mkdir $RBD_PREFIX
#all osd id in one ceph node
declare 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)
do
echo $j
PGID=$(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/$OID
done
) &
if [[ $(jobs -r -p | wc -l) -ge $N ]]; then
wait
fi
done
wait
echo "All done."
数据合并脚本。将导出到本地的对象中的数据复制到一个新卷中。脚本在执行前需要将RBD_PREFIX的值修改为要导出rbd的blocak_name_prefix。
#!/bin/bash
RBD_PREFIX=rbd_data.3262b63ba984f7
IMAGE_NAME=$RBD_PREFIX.build.raw
rm -f $IMAGE_NAME
dd if=/dev/zero of=$IMAGE_NAME bs=1 count=0 seek=2147483648
for i in $(ls ./$RBD_PREFIX | sort)
do
idx=$(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=notrunc
done
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)…...

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:入门知识
视频链接: 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(HyperText Transfer Protocol,超文本传输协议)服务器端,即 Web 服务器端。 理解 Web 服务器端: web服务器端就是要基于 HTTP 协议,将网页对…...

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

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

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

自动驾驶HMI产品技术方案
版本变更 序号 日期 变更内容 编制人 审核人 文档版本 1 2 1....

Git判断本地是否最新
场景需求 需要判断是否有新内容更新,确定有更新之后执行pull操作,然后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. 变量命名规范 弱类型语言(动态类型语言),定义变量的时候,不需要类型修饰 而且,变量类型可以随时改变每行代码结束的时候,要不要分号都可以变量名 由数字,字母下划线组成,不能以数字开头,也不…...

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

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

Datawhale Django入门组队学习Task02
Task02 首先启动虚拟环境(复习一下之前的) 先退出conda的, conda deactivate然后cd到我的venv下面 ,然后cd 到 scripts,再 activate (powershell里面) 创建admin管理员 首先cd到项目路径下&a…...

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

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

C语言,静态变量static基础及使用实列
static关键字有多种用途。以下是关于静态变量 (static) 的简要概述: 1.静态局部变量: - 在函数内部定义的静态变量。 - 生命周期:从程序开始执行到程序结束。 - 作用域:仅限于在其被定义的函数中。 - 每次调用该函数…...

2023.8.19-2023.8.XX 周报【人脸3D+虚拟服装方向基础调研-Cycle Diffusion\Diffusion-GAN\】更新中
学习目标 1. 这篇是做diffusion和gan结合的,可以参照一下看看能不能做cyclegan的形式,同时也可以调研一下有没有人follow这篇论文做了类似cyclegan的事情 Diffusion-GAN论文精读https://arxiv.org/abs/2206.02262 2. https://arxiv.org/abs/2212.06…...

微表情识别(Python编程,cnn模型)
1.数据集包括7种类别微表情 anger文件夹,3995张 disgust文件夹, 436张照片 fear文件夹,4097张照片 happy文件夹,7215张照片 neutral文件夹,4965张照片 sad文件夹,4830张照片 surprised文件夹, 3…...

More Effective C++学习笔记(2)
目录 条款5:对定制的"类型转换函数"保持警觉条款6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别条款7:千万不要重载&&,||和,操作符条款8:了解各种不同意义的new和de…...

零售行业供应链管理核心KPI指标(三)
完美订单满足率和退货率 完美订单满足率有三个方面的因素影响:订单按时、足量、无损交货。通常情况下零售企业追求线上订单履行周期慢慢达到行业平均水平,就是交付的速度变快了,这个肯定是一件好事情,趋势越来越好。 同时&#…...

广州华锐互动:奶牛难产原因及救治VR仿真实训系统
奶牛难产是一种常见的疾病,对奶牛的健康和生产造成很大的影响。为了解决这一问题,许多奶牛养殖场开始采用VR仿真技术来培训奶牛兽医,帮助学生更好地理解奶牛养殖的实际过程,提高他们的实践能力的教学方式。 VR技术开发公司广州华锐…...

神经网络基础-神经网络补充概念-62-池化层
概念 池化层(Pooling Layer)是深度学习神经网络中常用的一种层级结构,用于减小输入数据的空间尺寸,从而降低模型的计算复杂度,减少过拟合,并且在一定程度上提取输入数据的重要特征。池化层通常紧跟在卷积层…...

第8章:集成学习
个体与集成 同质:相同的基学习器,实现容易,但是很难保证差异性。异质:不同的基学习器,实现复杂,不同模型之间本来就存在差异性,但是很难直接比较不同模型的输出,需要复杂的配准方法。…...

设计HTML5列表和超链接
在网页中,大部分信息都是列表结构,如菜单栏、图文列表、分类导航、新闻列表、栏目列表等。HTML5定义了一套列表标签,通过列表结构实现对网页信息的合理排版。另外,网页中还包含大量超链接,通过它实现网页、位置的跳转&…...

React Native 环境搭建
本文以 Android 开发环境(MacBook,已安装 JDK、SDK、Android Studio )为基础而进行 React Native 环境搭建,iOS 环境类似,可参考搭建。 1、安装 Homebrew 命令: ruby -e "$(curl -fsSL https://raw…...