ceph-kvstore-tool 工具使用详解
文章目录
- 简介
- 使用
- 总结
简介
ceph-kvstore-tool
工具是用来获取存放在leveldb
或者rocksdb
数据库中的键值元数据。并且该工具能够对kvstore中的数据进行配置,就像是对离线后的osd操作osd map一样
使用该工具,需要安装ceph-test-12.2.1.06-0.el7.centos.x86_64
包
本文该工具的介绍是基于ceph12.2.1
版本的
使用
执行ceph-kvstore-tool -h
查看帮助信息如下
[root@node1 ~]# ceph-kvstore-tool -h
Usage: ceph-kvstore-tool <leveldb|rocksdb|bluestore-kv> <store path> command [args...]Commands:list [prefix]list-crc [prefix]exists <prefix> [key]get <prefix> <key> [out <file>]crc <prefix> <key>get-size [<prefix> <key>]set <prefix> <key> [ver <N>|in <file>]rm <prefix> <key>rm-prefix <prefix>store-copy <path> [num-keys-per-tx]store-crc <path>compactcompact-prefix <prefix>compact-range <prefix> <start> <end>
我们一个一个参数查看具体如何使用
list[prefix]
查看所有数据库存储的kv键值属性,如有prefix字段,则打印时会对打印出的键值结果加上URL的编码属性- 查看mon数据库的键值内容
a.cat /var/lib/ceph/mon/ceph-node1/kv_backend
查看mon 数据库类型
b.[root@node1 ~]# cat /var/lib/ceph/mon/ceph-node1/kv_backend rocksdb
systemctl stop ceph-mon@node1
需要停止mon服务,此时该目录下有锁,不允许访问数据库中的键值内容。
如果不停止mon服务,则会有如下问题,很明显LOCK文件在mon运行时是存在的,阻止其他工具尝试获取数据库内容
停掉mon之后即可访问[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list failed to open type rocksdb path /var/lib/ceph/mon/ceph-node1/store.db/: (22) Invalid argument 2019-08-09 19:59:31.796330 7fb705a48e80 -1 rocksdb: IO error: lock /var/lib/ceph/mon/ceph-node1/store.db//LOCK: Resource temporarily unavailable
此时list命令会列举出当前mon数据库中存放的所有的表项,每个表项都是类似’auth’ : 251形式存在
c. 查看mon数据库中都有哪些表项
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list|awk '{print $1}'|uniq
输出如下具体的表项:
可以看到mon维护的集群表非常多,基本囊括了ceph所有的组件表auth health logm mds_health mds_metadata mdsmap mgr mgr_command_descs mgr_metadata mgrstat monitor monitor_store monmap osd_metadata osd_pg_creating osdmap paxos pgmap
d. 查看其中的osdmap表项
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list|grep osdmap |head -10
输出如下:health osdmap osdmap 1000 osdmap 1001 osdmap 1002 osdmap 1003 osdmap 1004 osdmap 1005 osdmap 1006 osdmap 1007 osdmap 1008
- 查看bluestore数据库中存放的键值内容
a. 同样,需要先停止一个osd
systemctl stop ceph-osd@1
b. 因为bluestore的数据库并没有显式存在,它需要用对应的工具ceph-bluestore-tool
才能取出,关于该工具的使用可以参考ceph-bluestore-tool工具使用
mkdir /ceph-1
创建一个存放bluestore rocksdb数据库的文件夹
ceph-bluestore-tool bluefs-export --path /var/lib/ceph/osd/ceph-1 --out-dir /ceph-1/
输出如下
此时infering bluefs devices from bluestore path action bluefs-exportslot 1 /var/lib/ceph/osd/ceph-1/block db/ db/000059.sst db/000060.sst db/000061.sst db/000063.sst db/000066.sst db/000069.sst db/000072.sst db/000075.sst db/000078.sst db/000081.sst db/000084.sst db/000086.log db/CURRENT db/IDENTITY db/LOCK db/MANIFEST-000085 db/OPTIONS-000085
/ceph-1
目录已经存放导出的db文件夹
bluestore中主要存放对象的元数据,所以它的有序字节表(.sst)很明显多于mon
c. 查看bluestore的kv内容如下
ceph-kvstore-tool rocksdb /ceph-1/db/ list|head -10
B blocks B blocks_per_key B bytes_per_block B size C 1.0s2_head C 1.10s0_head C 1.11s0_head C 1.12s2_head C 1.13s0_head C 1.14s0_head ...
- 查看mon数据库的键值内容
list-crc [prefix]
打印数据库中的kv键值对的crc校验码
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list-crc |grep osdmap |head -10
结果输出如下:
再次验证crc校验码对每个表项都是唯一的如下:[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list-crc |grep osdmap |head -10 health osdmap 3928512586 osdmap 1000 798511892 osdmap 1001 1507770938 osdmap 1002 2750577144 osdmap 1003 4273498913 osdmap 1004 1590290088 osdmap 1005 636668385 osdmap 1006 1658794114 osdmap 1007 2689193714 osdmap 1008 2971171276 ...
可以看到每一个表项的crc校验码都是不同的,这里有兴趣得伙伴可以研究一下crc校验码加密机制的算法[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list-crc |grep osdmap |wc -l 1470 [root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list-crc |grep osdmap|awk '{print $3}'|uniq |wc -l 1470
exists <prefix> [key]
检查kv数据库中是否存在对应的map,如果map存在,则可以检查对应map的版本是否存在.该子命令可以核对数据库中相关组件的表项是否丢失[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ exists osdmap (osdmap, ) exists [root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ exists osdmap 1005 (osdmap, 1005) exists [root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ exists osdmap 6005 (osdmap, 6005) does not exist
get <prefix> <key> [out <file>]
该子命令可以获取对应的表项中对应版本的内容,并且可以指定结果的输出文件
根据以上输出,因为ceph对以上数据进行序列化操作之后,我们无法清楚知道osdmap的具体内容,由此我们即可入手一个新的工具[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ get osdmap 1000 (osdmap, 1000) 00000000 08 07 94 16 00 00 05 01 97 15 00 00 fa 27 f0 41 |.............'.A| 00000010 0c e9 4d f1 a4 bd 5e 37 67 88 34 bd e8 03 00 00 |..M...^7g.4.....| 00000020 95 b5 4a 5d a5 ba 74 35 ff ff ff ff ff ff ff ff |..J]..t5........| 00000030 ff ff ff ff 00 00 00 00 00 00 00 00 ff ff ff ff |................| 00000040 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 |................| 00000050 03 00 00 00 01 01 01 1c 00 00 00 01 00 00 00 19 |................| 00000060 48 00 00 10 00 00 00 02 00 1a 90 0a c0 37 b1 00 |H............7..| 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000080 01 00 00 01 01 00 00 00 00 00 00 00 00 00 00 00 |................| 00000090 ff ff ff ff 00 00 00 00 01 01 00 00 00 00 00 00 |................| 000000a0 00 01 00 00 00 ff ff ff ff 00 00 00 00 01 01 00 |................| 000000b0 00 00 00 00 00 00 02 00 00 00 ff ff ff ff 00 00 |................| 000000c0 00 00 01 01 00 00 00 00 00 00 00 03 00 00 00 ff |................| ...
ceph-dencoder
- 这里取一个较新的osdmap内容,先将
full_999
版本的内容输入到一个文件
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ get osdmap full_999 out ./osdmap.full
- 使用
ceph-dencoder
工具进行反序列化解析,获取OSDMap
内容
ceph-dencoder import osdmap.full type OSDMap decode dump_json
因为osdmap的一个版本内容信息量还是十分庞大,所以这里仅列出一部分内容{ "epoch": 999, "fsid": "fa27f041-0ce9-4df1-a4bd-5e37678834bd", "created": "2019-07-22 15:43:30.494296", "modified": "2019-08-07 19:26:59.891852", "flags": "noout,nobackfill,norecover,sortbitwise,recovery_deletes,purged_snapdirs", "crush_version": 30, "full_ratio": 0.950000, "backfillfull_ratio": 0.900000, "nearfull_ratio": 0.850000, "cluster_snapshot": "", "pool_max": 15, "max_osd": 10, "require_min_compat_client": "jewel", "min_compat_client": "jewel", "require_osd_release": "luminous", "pools": [{"pool": 1,"pool_name": "data","flags": 5,"flags_names": "hashpspool,ec_overwrites","type": 3,...
- 这里取一个较新的osdmap内容,先将
crc <prefix> <key>
获取对应表项对应版本的crc校验码[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ crc osdmap 1000 (osdmap, 1000) crc 4064685290
get-szie [<prefix> <key>]
获取评估的存储容量大小或者对应表项版本的占用存储的大小[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ get-size osdmap 1000 log - 0 misc - 8580 sst - 17752013 total - 17760593 total: 17760593 estimated store size: 17760593 (osdmap,1000) size 5786
set <prefix> <key> [ver <N>lin <file>]
设置表项的版本编号,可以指定对应的版本或者文本作为设定值
如下可以将osdmap中的指定表项的版本号进行重新指定,该指定也可以通过我们之前描述的get
取到的版本文件来注入
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ set osdmap 1000 ver 1001
同样我们可以将自己配置的集群map,修改后序列化encode之后注入到数据库中rm <prefix> <key>
删除指定表项的版本号
rm-prefix <prefix>
删除指定表项的所有版本,慎重操作store-copy <path> [num-keys-per-tx]
将所有的键值属性拷贝到指定的path之下,num-keys-per-tx是每一次拷贝事务中要进行拷贝的键值个数
这里有一点不解的是它这个拷贝和我们普通的cp有啥区别?难道是目录可以自己随意指定,不需要考虑存在与否?不太懂store-crc <path> [num-keys-per-tx]
备份所有键值的crccompact
默认触发rocksdb数据库的compaction(压缩)操作,在执行compaction之后一些磁盘空间会被释放。这个是针对所有的键值属性compact-prefix <prefix>
触发针对指定表项的compaction操作compacti-range <prefix> <start> <end>
对指定表项的版本范围进行compaction操作
总结
个人认为该工具主要是用来检查各个组件数据库是否有被损坏得数据,并且能够提供接口去获取ceph各个组件的元数据层的内容,通过ceph对元数据的存储方式的了解能够让我们对ceph存储系统的可靠性,高度自治性有更加深刻的理解。
此外能够通过get
和set
子命令对一些损坏的元数据map版本进行手动修复,这一点同样也是非常有价值得
相关文章:

springboot 订单重复提交_Spring Boot (一) 校验表单重复提交
一、前言在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据。存在如上问题可以交给前端解决,判断多长时间内不能再次点击保存按钮&a…

智能会议白板系统每日开发记录
智能会议白板系统,在开发过程中,整个项目期限内,每月,每周,每天要做的事情,作为组长的记录,多有不足之处,望指点。 转载于:https://www.cnblogs.com/mayijun/p/3458039.html

java.lang.OutOfMemoryError: PermGen space及其解决方法
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入Per…

ceph-dencoder工具使用详解
文章目录简介使用decode命令用法encode简介 ceph-dencoder工具是一个序列化编码、解码并且打印ceph数据结构的工具。它主要用来调试和测试ceph不同版本之间的兼容性问题 该工具是由 ceph-common-12.2.1.06-0.el7.centos.x86_64 rpm包生成 本文章是根据ceph-12.2.1版本来描述改…

EBS fnd_global.apps_initialize
原型:fnd_global.apps_initialize(user_ID, Responsibility_id,Responsibility_application_id);作用:在数据库的会话中设置全局变量,和用户概要信息。参数获得:参数一,用户ID select user_idfrom fnd_userwhere user_…

js判断鼠标靠近屏幕最侧面的监听_threejs按鼠标位置缩放场景
threejs的orbitcontrol,默认的缩放模式为整体以target为中心进行缩放。有时候,我们想让场景按照鼠标位置进行缩放,体验起来就和地图的缩放一样,最直观的感觉就是整个场景会越来越靠近鼠标点的位置,而不是整体的缩放大小…

hibernate中多对多分解成一对多,
1,参考:http://blog.csdn.net/yaerfeng/article/details/6969632

C++ 函数参数 值传递与引用传递
以前我们在C语言中函数参数传递过程中,如果我们想要让当A函数作用域中的变量经过B函数处理之后的数值仍然在A函数中生效,这个时候函数参数的传递时需要引用方式去传递,方式如下: #include <stdio.h> //函数参数为指针&…

SharePoint 2013 图文开发系列之代码定义列表
在SharePoint的开发中,用Visual Studio自定义列表是经常会用到的,因为很多时候,我们并不会手动创建列表,而手动创建列表在测试服务器和正式机之间同步字段,也很麻烦,所以我们经常用代码来定义列表或者文档库…

arduino下载库出错_【arduino】DIY音乐播放器,arduino播放wav音乐,TRMpcm库测试及使用...
微信关注 “DLGG创客DIY”设为“星标”,重磅干货,第一时间送达。arduino特点库超多,想必大家都领教了,今天来分享一下之前玩过的TRMpcm库。这个库是干嘛用的?简单粗暴用arduino(这里特指arduino官方那几个板子uno、nan…

vim替换技巧4
、 转自:http://www.confay.com/2008/03/vim4.html [技巧一] 第一个是在VIM邮件列表中看到的,给出了一个如何统计文章字数的方法。 统计一个完整文件的字数,可以使用Unix下的wc工具,它能够统计一个文件的行数、单词数和字符数。 如…

spark1.x和2.xIterable和iterator兼容问题
1. spark 1.x 升级到spark 2.x 对于普通的spark来说,变动不大 : 1 举一个最简单的实例:spark1.x public static JavaRDD<String> workJob(JavaRDD<String> spark1Rdd) {JavaPairRDD<String, Integer> testRdd spark1Rdd.flatMapToPair(new PairFlatMapFunct…

C++ 拷贝构造函数和重载赋值运算符的区别
文章目录拷贝构造函数重载赋值运算符赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成,而拷贝构造函数会生成新的对象。 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别,将详细通过代码展示两者之间得差异。 拷贝构造函数 首先…

单元格内多个姓名拆分成一列_EXCEL拆分单元格中的姓名,这都不叫事儿
作者:祝洪忠 转自:Excel之家ExcelHome小伙伴们好啊,今天老祝和大家来分享一个数据整理的技巧。下面的表格形式,想必大家不会陌生吧:在这个表格内,同一个部门的人员名单都挤到一个单元格内。现在问题来了&am…
3.1 A Historical Perspective 历史观点
1.从1978年的8086到现在的2008年core i7 ,从29K个晶体管到781M个晶体管,地址线(也叫地址位长(bit long))8086只有20个地址线,1982年,MS-windows 使用80286平台开发了自己的windows。直到1985年,i386正式扩展…

idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml,
第一种错误 :idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml, 解决方案如下:将maven的安装目录\conf目录下的setting.xml拷贝到C:\Users\lenevo\.m2目录下即可。 第二种错误: This a…

关于部署osd过程中:Device is in use by a device-mapper mapping问题解决
ceph环境:12.2.1 使用古老的ceph-disk工具部署osd,仅仅prepare过程中就出现如上所示问题 Device is in use by a device-mapper mapping md127 解决方法如下: 由于device-mapper为系统自己的磁盘映射器,此时检查系统是否有逻辑卷 pvs lvs vg…

spyder一打开就卡了_欧姆龙plc 用 SD 卡上传/下载程序
以Nx102为例,NJ类似。使用 SD 卡将 Sysmac Studio 编写的程序传入 NX1P2 内; 使用 SD 卡对NX1P2 的程序进行备份, 查看备份的程序, 并把备份的程序传入另一台对应型号的 NX1P2 内。一、 使用 SD 卡将 Sysmac Studio 写的程序传入 …

Unity3D 中 2D_Toolkit插件下载 和 导入方法
Unity3D 中 2D_Toolkit插件下载 和 导入方法 1.你把下载来的包放到 安装目录:Editor\Standard Packages里面。 2.然后按ctrl9,进入asset store,等页面加载。 3.页面加载成功后,如果有账号,就登录,没有账号先…

Emacs 使用YASnippet
<?xml version"1.0" encoding"utf-8"?> Emacs 使用YASnippetUP | HOME Emacs 使用YASnippet Table of Contents 1 安装YASnippent2 安装 org-mode字典3 org-mode中使用教程4 YASnippet增加模板1 安装YASnippent $ cd ~/.emacs.d/plugins $ git c…

ruoyi后台管理系统分析(三)---admin包
三、admin包 --web包 -----controller包 -----------common包 CommonController.java------通用请求处理 package com.ruoyi.web.controller.common;import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest;…

ceph-objectstore-tool工具使用详解
文章目录简介使用OSD相关操作PG相关操作对象相关操作总结简介 ceph-objectstore-tool工具,能够操作到ceph最底层的数据,包括pg,对象层级。它能够对底层pg以及对象相关数据进行获取、修改。并能够对一些问题pg和对象进行简单修复。所以使用该工具进行操作…

slf4j导入那个依赖_学习SPRINGBOOT结合日志门面SLF4J和日志实现LOGBACK的混合使用
一、此处主要介绍在springboot工程下如何使用 logback slf4j 进行日志记录。logback主要包含三个组成部分:Loggers(日志记录器)、Appenders(输出目的在)、Layouts(日志输出格式) slf4j :如jdbc一样,定义了一套接口,是一个日志门面…

linux下发布的执行文件崩溃的问题定位 心得一则
C Release版本发布到客户处执行时,如果程序崩溃,有什么办法能够快速的确认程序的问题呢? 如果能gdb调试的话,比较简单了,可以使用gdb命令,类似如下:gdb ##set args ****b mainr#eipx/10i 0xb736…

7 个漂亮的 JavaScript 的时间轴组件 [转]
时间轴:通过互联网技术,依据时间顺序,把一方面或多方面的 时间足迹事件串联起来,形成相对完整的记录体系,再运用图文的形式呈现给用户;时间轴可以运用于不同领域,最大的作用就是把过去的事物系统…

Python 学习笔记: 反射
Python 反射应用 例子1: class Person:def __init__(self, name, age):self.name nameself.age agedef show(self):print(%s \s age is %s%(self.name, self.age))alex Person(alex, 18) # alex.show() if hasattr(alex, show):getattr(alex, show)() 转载于:ht…

C++多线程:互斥变量 std::mutex
文章目录描述成员函数总结描述 头文件 <mutex>使用 std::mutex <variable>简介 mutex是一种多线程变成中的同步原语,它能够让共享数据不被多个线程同时访问,它不支持递归得对互斥对象上锁特点 用方线程从它成功调用 lock 或 try_lock 开始&…

vim替换字符串带斜杠_Vim、gvim操作替换
~ 回复 以下关键词 查看更多IC设计教程 ~目前支持的关键词有:Innovus ICC or IC CompilerDC or Design Compiler PT or PrimeTimeUser Guide or UG LedaVCS Formality工艺节点 …

SharePoint2010沙盒解决方案基础开发——关于TreeView树形控件读取列表数据(树形导航)的webpart开发及问题...
转:http://blog.csdn.net/miragesky2049/article/details/7204882 SharePoint2010沙盒解决方案基础开发——关于TreeView树形控件读取列表数据(树形导航)的webpart开发及问题 1、实现效果如下: 点击各个节点进入相应的链接 2、测试…

智能医疗?轻松实现!
每个中国人都及其关注养老和住房问题,在中国每个人都十分有存钱的意识。就目前来看,现在的医疗和住房保障还没有能够满足我们现在的需求,因而,存钱显得尤为重要。我们关注医疗,是因为每个人都会面临年老,每…