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/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43302.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Optional的基礎運用

Optional的基礎運用 簡介代碼示例 簡介 代碼示例 package org.example;import org.junit.Test;import java.util.Optional;public class OptionalTest {Testpublic void advance() {String str "hello";str null;// of(T t):封裝數據t生成Optional對象&#xff0c…

【筆試題心得】關于正則的一些整理

本文部分內容摘抄整理自 正則表達式 – 教程 | 菜鳥教程 在筆試的過程中,也常常會對正則表達式進行考察,這里對正則表達式的常見用法,做一個學習和總結。 正則表達式的模式可以包括以下內容: 字面值字符:例如字母、數…

數據結構:堆的實現

1.堆的概念 如果有一個關鍵碼的集合 K { k1 &#xff0c;k2 &#xff0c;k3 &#xff0c;…&#xff0c;kn }&#xff0c;把它的所有元素按完全二叉樹的順序存儲方式存儲在一個一維數組中&#xff0c;并且 k(i) < k(i*21) 和 k(i) < k(i*22)&#xff0c; i 0 &#xff…

MongoDB增刪改查操作

數據庫操作&#xff1a; 在MongoDB中&#xff0c;文檔集合存在數據庫中。 要選擇使用的數據庫&#xff0c;請在mongo shell程序中發出 use <db> 語句 // 查看有哪些數據庫 show dbs;// 如果數據庫不存在&#xff0c;則創建并切換到該數據庫&#xff0c;存在則直接切換到…

分布式消息中間件

消息中間件是Java開發消息隊列的一種中間件產品。中間件類似windows編程開發中的插件。工具插件在軟件工具中是中間插件。插件也是應用程序。消息的分發過程包裝之后是chatlog 系統或者是手機短信。系統與系統之間的通信通過消息的發送和接收。堆積頻繁過多的系統通知消息需要進…

C++之模板進階

模板進階 非類型模板參數模板的特化概念函數模板特化類模板特化全特化偏特化 模板分離編譯什么是分離編譯模板的分離編譯解決方法 模板總結 非類型模板參數 模板參數分兩種&#xff1a;類型形參與非類型形參。 類型形參&#xff1a;出現在模板參數列表中&#xff0c;跟在class…

docker安裝consul

1、下載consul鏡像 docker pull consul2、啟動consul docker run -d --restartalways --name consul -p 8500:8500 consul agent -server -bootstrap-expect1 -ui -bind0.0.0.0 -client0.0.0.03、查看consul日志 docker logs consul4、檢驗是否安裝成功

drawio----輸出pdf為圖片大小無空白(圖片插入論文)

自己在寫論文插入圖片時為了讓論文圖片放大不模糊&#xff0c;啥方法都試了&#xff0c;最后摸索出來這個。 自己手動畫圖的時候導出pdf總會出現自己的圖片很小&#xff0c;pdf的白邊很大如下如所示&#xff0c;插入論文的時候后雖然放大不會模糊&#xff0c;但是白邊很大會顯…

【數據結構OJ題】用隊列實現棧

原題鏈接&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/ 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 可以用兩個隊列去實現一個棧&#xff0c;每次始終保持一個隊列為空。 入棧相當于給非空隊列進行入隊操作。 出棧相…

異步電機IM-改進的電壓模型磁鏈觀測器學習

導讀&#xff1a;本期文章主要介紹異步電機的改進型電壓模型磁鏈觀測器。傳統純積分形式的積分器在低速區域存在初始值問題和直流偏置問題&#xff0c;所以在實際應用中必須對電壓模型進行改進。本期文章中的對電壓模型改進是借鑒一篇IEEE中的方法。 如果需要文章中對應的仿真…

Apache Dubbo 云原生可觀測性的探索與實踐

作者&#xff1a;宋小生 - 平安壹錢包中間件資深工程師 Dubbo3 可觀測能力速覽 Apache Dubbo3 在云原生可觀測性方面完成重磅升級&#xff0c;使用 Dubbo3 最新版本&#xff0c;你只需要引入 dubbo-spring-boot-observability-starter 依賴&#xff0c;微服務集群即原生具備以…

貪心算法實現找零問題

思路&#xff1a; 使用 貪心算法 的思想 題目&#xff1a; 檸檬水找零 在檸檬水攤上&#xff0c;每一杯檸檬水的售價為5美元。顧客排隊購買你的產品,一次購買一杯。 每位顧客只買一杯檸檬水,然后向你付5美元、10美元或20美元。必須給每個顧客正確找零 注意,一開始你手頭沒有任何…

PSP - 基于擴散生成模型預測蛋白質結構 EigenFold 算法與環境配置

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132357976 Paper: EigenFold: Generative Protein Structure Prediction with Diffusion Models EigenFold 是用于蛋白質結構預測的擴散生成模型…

使用深度學習實現的圖像偽造檢測: 一個Python畢業項目指南

1. 引言 在當前的數字化時代&#xff0c;圖像處理和偽造技術越來越先進。從影視制作到社交媒體&#xff0c;人們常常與修飾或改變過的圖片打交道。雖然這為創意產業提供了無數機會&#xff0c;但也為不誠實的內容創造者帶來了偽造和篡改圖像的機會。因此&#xff0c;圖像偽造檢…

Selenium手動和自動兩種方式啟動Chrome驅動

1. 自動啟動chrome驅動(已經安裝了Selenium庫和Chrome驅動) 要使用Selenium自動跟隨自帶的Chrome驅動&#xff0c;你需要首先確保你已經安裝了Selenium庫和Chrome驅動。然后&#xff0c;你可以按照以下步驟進行操作&#xff1a; 導入必要的庫&#xff1a; from selenium imp…

【面試八股文】每日一題:談談你對線程的理解

每日一題-Java核心-談談你對線程的理解【面試八股文】 Java線程是Java程序中的執行單元。一個Java程序可以同時運行多個線程&#xff0c;每個線程可以獨立執行不同的任務。線程的執行是并發的&#xff0c;即多個線程可以同時執行。 1. 線程的特點 Java中的線程有如下的特點 輕…

react-native-webview使用postMessage后H5不能監聽問題(iOS和安卓的兼容問題)

/* 監聽rn消息 */ const eventListener nativeEvent > {//解析數據actionType、extraconst {actionType, extra} nativeEvent.data && JSON.parse(nativeEvent.data) || {} } //安卓用document&#xff0c;ios用window window.addEventListener(message, eventLis…

Jenkins-發送郵件配置

在Jenkins構建執行完畢后&#xff0c;需要及時通知相關人員。因此在jenkins中是可以通過郵件通知的。 一、Jenkins自帶的郵件通知功能 找到manage Jenkins->Configure System&#xff0c;進行郵件配置&#xff1a; 2. 配置Jenkins自帶的郵箱信息 完成上面的配置后&#xf…

DiffusionDet: Diffusion Model for Object Detection

DiffusionDet: Diffusion Model for Object Detection 論文概述不同之處整體流程 論文題目&#xff1a;DiffusionDet: Diffusion Model for Object Detection 論文來源&#xff1a;arXiv preprint 2022 論文地址&#xff1a;https://arxiv.org/abs/2211.09788 論文代碼&#xf…

kubesphere 使用流水線對接 sonar

官方文檔&#xff1a;使用圖形編輯面板創建流水線 創建憑證 創建 sonar 憑證 創建 gitlab 憑證 創建流水線 創建流水線&#xff0c;編輯流水線 自定義流水線 拉取代碼 代理選 kubernetes&#xff0c;label 填maven 添加步驟 - git 填寫 git 地址&#xff0c;選…