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的编码属性 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服务,此时该目录下有锁,不允许访问数据库中的键值内容。[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之后即可访问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所有的组件表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
systemctl stop ceph-osd@1
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文件夹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
...
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 [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 [out ]
该子命令可以获取对应的表项中对应版本的内容,并且可以指定结果的输出文件[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
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
{
"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,...
crc
获取对应表项对应版本的crc校验码[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ crc osdmap 1000
(osdmap, 1000) crc 4064685290
get-szie [ ]
获取评估的存储容量大小或者对应表项版本的占用存储的大小[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 [ver lin ]
设置表项的版本编号,可以指定对应的版本或者文本作为设定值get
取到的版本文件来注入ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ set osdmap 1000 ver 1001
rm
删除指定表项的版本号rm-prefix
删除指定表项的所有版本,慎重操作store-copy [num-keys-per-tx]
将所有的键值属性拷贝到指定的path之下,num-keys-per-tx是每一次拷贝事务中要进行拷贝的键值个数store-crc [num-keys-per-tx]
备份所有键值的crccompact
默认触发rocksdb数据库的compaction(压缩)操作,在执行compaction之后一些磁盘空间会被释放。这个是针对所有的键值属性compact-prefix
触发针对指定表项的compaction操作compacti-range
对指定表项的版本范围进行compaction操作个人认为该工具主要是用来检查各个组件数据库是否有被损坏得数据,并且能够提供接口去获取ceph各个组件的元数据层的内容,通过ceph对元数据的存储方式的了解能够让我们对ceph存储系统的可靠性,高度自治性有更加深刻的理解。
此外能够通过get
和set
子命令对一些损坏的元数据map版本进行手动修复,这一点同样也是非常有价值得
文章目录简介使用decode命令用法encode 简介 ceph-dencoder工具是一个序列化编码、解码并且打印ceph数据结构的工具。它主要用来调试和测试ceph不同版本之间的兼容性问题 该工具是由 ceph-common-12.2.1.06-0.el7.centos.x86_64 rpm包生成 本文章是根据ceph-...