天天看點

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>
  compact
  compact-prefix <prefix>
  compact-range <prefix> <start> <end>      
  • ​list[prefix]​

    ​檢視所有資料庫存儲的kv鍵值屬性,如有prefix字段,則列印時會對列印出的鍵值結果加上URL的編碼屬性
  1. 檢視mon資料庫的鍵值内容

    a. ​​

    ​cat /var/lib/ceph/mon/ceph-node1/kv_backend​

    ​ 檢視mon 資料庫類型
[root@node1 ~]# cat /var/lib/ceph/mon/ceph-node1/kv_backend 
rocksdb      
  1. 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      
  1. 停掉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      
  1. 可以看到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      
  1. 檢視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/​

    ​ 輸出如下
  2. 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      
  3. 此時​

    ​/ceph-1​

    ​目錄已經存放導出的db檔案夾

    bluestore中主要存放對象的中繼資料,是以它的有序位元組表(.sst)很明顯多于mon

    c. 檢視bluestore的kv内容如下

    ​ceph-kvstore-tool rocksdb /ceph-1/db/ list|head -10​

  4. 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      
  • ​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​

    1. 這裡取一個較新的osdmap内容,先将​

      ​full_999​

      ​ 版本的内容輸入到一個檔案

      ​ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ get osdmap full_999 out ./osdmap.full​

    2. 使用​

      ​ceph-dencoder​

      ​工具進行反序列化解析,擷取​

      ​OSDMap​

      ​内容

      ​ceph-dencoder import osdmap.full type OSDMap decode dump_json​

      ​ 因為osdmap的一個版本内容資訊量還是十分龐大,是以這裡僅列出一部分内容
    3. {
      "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 <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]​

      ​ 備份所有鍵值的crc
    • ​compact​

      ​預設觸發rocksdb資料庫的compaction(壓縮)操作,在執行compaction之後一些磁盤空間會被釋放。這個是針對所有的鍵值屬性
    • ​compact-prefix <prefix>​

      ​觸發針對指定表項的compaction操作
    • ​compacti-range <prefix> <start> <end>​

      ​對指定表項的版本範圍進行compaction操作

    總結