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 数据库类型[root@node1 ~]# cat /var/lib/ceph/mon/ceph-node1/kv_backend rocksdb
b.
systemctl stop ceph-mon@node1
需要停止mon服务,此时该目录下有锁,不允许访问数据库中的键值内容。
如果不停止mon服务,则会有如下问题,很明显LOCK文件在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
停掉mon之后即可访问
此时list命令会列举出当前mon数据库中存放的所有的表项,每个表项都是类似’auth’ : 251形式存在
c. 查看mon数据库中都有哪些表项
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list|awk '{print $1}'|uniq
输出如下具体的表项: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
可以看到mon维护的集群表非常多,基本囊括了ceph所有的组件表
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
结果输出如下:[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校验码对每个表项都是唯一的如下:
[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
可以看到每一个表项的crc校验码都是不同的,这里有兴趣得伙伴可以研究一下crc校验码加密机制的算法
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>]
该子命令可以获取对应的表项中对应版本的内容,并且可以指定结果的输出文件[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对以上数据进行序列化操作之后,我们无法清楚知道osdmap的具体内容,由此我们即可入手一个新的工具
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版本进行手动修复,这一点同样也是非常有价值得
ceph-kvstore-tool 工具使用详解相关推荐
- ceph-dencoder工具使用详解
文章目录 简介 使用 decode命令用法 encode 简介 ceph-dencoder工具是一个序列化编码.解码并且打印ceph数据结构的工具.它主要用来调试和测试ceph不同版本之间的兼容性问题 ...
- Linux下暴力破解工具Hydra详解
Linux下暴力破解工具Hydra详解 一.简介 Number one of the biggest security holes are passwords, as every password s ...
- 微软Visual Studio2005开发工具路线图详解
微软Visual Studio2005开发工具路线图详解 随着企业需要的不断演变,Microsoft 依旧致力于提供创新的开发人员工具来满足这些不断变化的需求,从而确保客户的成功.为帮助组织规划未来的 ...
- Fuzz工具使用详解
Fuzz工具使用详解 (1)wfuzz 描述:wfuzz 是一款Python开发的Web安全模糊测试工具.简而言之就是wfuzz可以用在做请求参数参数类的模糊测试,也可以用来做Web目录扫描等操作. ...
- 火星遥感数据的获取与处理工具安装详解
火星遥感数据的获取与处理工具安装详解 文章目录 火星遥感数据的获取与处理工具安装详解 前言 1.火星遥感影像数据下载网址 2.火星遥感影像数据处理工具 前言 不知道有没有和我一样想做点跟火星相关的小实 ...
- 网络性能评估工具Iperf详解(可测丢包率)
原文链接:安全运维之:网络性能评估工具Iperf详解:技术成就梦想51CTO-中国领先的IT技术网站 参考博文:Install Iperf and Test Network Throughput,Sp ...
- 【linux】Valgrind工具集详解(八):Memcheck命令行参数详解
[linux]Valgrind工具集详解(五):命令行详解中不够全,在此专门针对Memcheck工具中的命令行参数做一次详细的解释. Memcheck命令行选项 –leak-check=<no| ...
- 【转】Linux命令工具 top详解
Linux命令工具 top详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不 ...
- PowerShell攻防进阶篇:nishang工具用法详解
PowerShell攻防进阶篇:nishang工具用法详解 导语:nishang,PowerShell下并肩Empire,Powersploit的神器. 开始之前,先放出个下载地址! 下载地址:htt ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
最新文章
- javascript的location/history
- python实战===图片转换为字符的源码(转)
- 荧光皮肤有哪些_价格适中又显白的口红有哪些?MAC占大头,KIKO卡拉泡泡超平价...
- Codeforces Round #705 (Div. 2) D. GCD of an Array 质因子分解 + stl维护
- E820-DTU与昆仑通态组态软件联机
- APACHE的简单应用一
- 《A Point Set Generation Network for 3D Object Reconstruction from a Single Image》论文笔记_2D图像生成3D点云
- STM32 CubeMX 串口通信
- 无标度网络的生成模型
- ubuntu18.04: 安装nanomsg
- 密码学笔记——培根密码
- ICMP协议详解和作用
- 硕士研究生计算机专业录取分数线,全国所计算机研究生录取分数线.doc
- 如何给图片加水印?分享怎么给图片加水印的方法
- SpringBoot整合MongoDB实现ResultFul风格接口
- 使用计算机VLOOKUP函数需注意什么,vlookup函数怎么用-vlookup函数使用方法介绍 - Iefans...
- 八核版三星Galaxy S4(I9500)root教程
- 技术管理者对知识组织的认识
- jQuery 库中的 $() 是什么
- 利用人性弱点的互联网产品(三)虚荣
热门文章
- MySQL计算指标连续两月金额相比_20160929
- 对输入框以及选择框集体的数据检验
- 聊聊高并发(十六)实现一个简单的可重入锁
- ubuntu14.04安装hadoop2.6.0(伪分布模式)
- [转]Android横竖屏切换解决方案
- UVA 10714 - Ants
- 安卓获取浏览器上网记录_Android 获取浏览器当前分享页面的截屏示例
- ++项目 cmake头文件路径_CMAKE入门实战
- 用sisotool设计调节参数_工业净化车间施工的重要参数
- java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...