日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

ceph-kvstore-tool 工具使用详解

發布時間:2023/11/27 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的編碼屬性
    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
      
      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
      
    2. 查看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
      ...
      
  • 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
    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的一個版本內容信息量還是十分龐大,所以這里僅列出一部分內容
      {
      "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操作

總結

個人認為該工具主要是用來檢查各個組件數據庫是否有被損壞得數據,并且能夠提供接口去獲取ceph各個組件的元數據層的內容,通過ceph對元數據的存儲方式的了解能夠讓我們對ceph存儲系統的可靠性,高度自治性有更加深刻的理解。
此外能夠通過getset子命令對一些損壞的元數據map版本進行手動修復,這一點同樣也是非常有價值得

總結

以上是生活随笔為你收集整理的ceph-kvstore-tool 工具使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。