文章目录
- 简介
- 使用
- 总结
简介
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>
compact
compact-prefix <prefix>
compact-range <prefix> <start> <end>
-
查看所有数据库存储的kv键值属性,如有prefix字段,则打印时会对打印出的键值结果加上URL的编码属性list[prefix]
-
查看mon数据库的键值内容
a.
查看mon 数据库类型cat /var/lib/ceph/mon/ceph-node1/kv_backend
[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
b. 因为bluestore的数据库并没有显式存在,它需要用对应的工具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/
- 此时
/ceph-1
目录已经存放导出的db文件夹
bluestore中主要存放对象的元数据,所以它的有序字节表(.sst)很明显多于mon
c. 查看bluestore的kv内容如下
ceph-kvstore-tool rocksdb /ceph-1/db/ list|head -10
infering bluefs devices from bluestore path
action bluefs-export
slot 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
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
...
[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>]
[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
内容
因为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 <prefix> <key>
[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
取到的版本文件来注入
同样我们可以将自己配置的集群map,修改后序列化encode之后注入到数据库中ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ set osdmap 1000 ver 1001
-
删除指定表项的版本号rm <prefix> <key>
-
删除指定表项的所有版本,慎重操作rm-prefix <prefix>
-
store-copy <path> [num-keys-per-tx]
将所有的键值属性拷贝到指定的path之下,num-keys-per-tx是每一次拷贝事务中要进行拷贝的键值个数
这里有一点不解的是它这个拷贝和我们普通的cp有啥区别?难道是目录可以自己随意指定,不需要考虑存在与否?不太懂
-
备份所有键值的crcstore-crc <path> [num-keys-per-tx]
-
默认触发rocksdb数据库的compaction(压缩)操作,在执行compaction之后一些磁盘空间会被释放。这个是针对所有的键值属性compact
-
触发针对指定表项的compaction操作compact-prefix <prefix>
-
对指定表项的版本范围进行compaction操作compacti-range <prefix> <start> <end>