文章目錄
- 簡介
- 使用
- 總結
簡介
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>