ceph-kvstore-tool 工具使用详解
生活随笔
收集整理的這篇文章主要介紹了
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的編碼屬性- 查看mon數據庫的鍵值內容
a.cat /var/lib/ceph/mon/ceph-node1/kv_backend查看mon 數據庫類型
b.[root@node1 ~]# cat /var/lib/ceph/mon/ceph-node1/kv_backend rocksdbsystemctl stop ceph-mon@node1需要停止mon服務,此時該目錄下有鎖,不允許訪問數據庫中的鍵值內容。
如果不停止mon服務,則會有如下問題,很明顯LOCK文件在mon運行時是存在的,阻止其他工具嘗試獲取數據庫內容
停掉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
此時list命令會列舉出當前mon數據庫中存放的所有的表項,每個表項都是類似’auth’ : 251形式存在
c. 查看mon數據庫中都有哪些表項
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list|awk '{print $1}'|uniq
輸出如下具體的表項:
可以看到mon維護的集群表非常多,基本囊括了ceph所有的組件表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
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
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 -10B 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 ...
- 查看mon數據庫的鍵值內容
list-crc [prefix]打印數據庫中的kv鍵值對的crc校驗碼
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list-crc |grep osdmap |head -10
結果輸出如下:
再次驗證crc校驗碼對每個表項都是唯一的如下:[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校驗碼都是不同的,這里有興趣得伙伴可以研究一下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 1470exists <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 existget <prefix> <key> [out <file>]該子命令可以獲取對應的表項中對應版本的內容,并且可以指定結果的輸出文件
根據以上輸出,因為ceph對以上數據進行序列化操作之后,我們無法清楚知道osdmap的具體內容,由此我們即可入手一個新的工具[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-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內容
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,...
- 這里取一個較新的osdmap內容,先將
crc <prefix> <key>獲取對應表項對應版本的crc校驗碼[root@node1 ~]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ crc osdmap 1000 (osdmap, 1000) crc 4064685290get-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 5786set <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]備份所有鍵值的crccompact默認觸發rocksdb數據庫的compaction(壓縮)操作,在執行compaction之后一些磁盤空間會被釋放。這個是針對所有的鍵值屬性compact-prefix <prefix>觸發針對指定表項的compaction操作compacti-range <prefix> <start> <end>對指定表項的版本范圍進行compaction操作
總結
個人認為該工具主要是用來檢查各個組件數據庫是否有被損壞得數據,并且能夠提供接口去獲取ceph各個組件的元數據層的內容,通過ceph對元數據的存儲方式的了解能夠讓我們對ceph存儲系統的可靠性,高度自治性有更加深刻的理解。
此外能夠通過get和set子命令對一些損壞的元數據map版本進行手動修復,這一點同樣也是非常有價值得
總結
以上是生活随笔為你收集整理的ceph-kvstore-tool 工具使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信个性签名大全情侣
- 下一篇: ceph-dencoder工具使用详解