ceph-dencoder工具使用详解
文章目錄
- 簡介
- 使用
- decode命令用法
- encode
簡介
ceph-dencoder工具是一個序列化編碼、解碼并且打印ceph數據結構的工具。它主要用來調試和測試ceph不同版本之間的兼容性問題
該工具是由
ceph-common-12.2.1.06-0.el7.centos.x86_64 rpm包生成
本文章是根據ceph-12.2.1版本來描述改命令的使用方式
使用
執行ceph-dencoder -h 命令可以查看到如下幫助信息
[root@node1 ~]# ceph-dencoder -h
usage: ceph-dencoder [commands ...]version print version string (to stdout)import <encfile> read encoded data from encfileexport <outfile> write encoded data to outfileset_features <num> set feature bits used for encodingget_features print feature bits (int) to stdoutlist_types list supported typestype <classname> select in-memory typeskip <num> skip <num> leading bytes before decodingdecode decode into in-memory objectencode encode in-memory objectdump_json dump in-memory object as json (to stdout)hexdump print encoded data in hexcopy copy object (via operator=)copy_ctor copy object (via copy ctor)count_tests print number of generated test objects (to stdout)select_test <n> select generated test object as in-memory objectis_deterministic exit w/ success if type encodes deterministically
decode命令用法
本文我們主要看一下decode命令的具體使用方式
如果我們想要查看一個cephfs內部的元數據對象內容,執行如下命令
- 先獲取元數對象,通過
rados命令get獲取,關于rados命令可以參考文檔rados使用詳解[root@node1 ~]# ceph fs ls #獲取元數據pool name: cephfs, metadata pool: fs_meta_pol, data pools: [fs_pol ] [root@node1 ~]# rados -p fs_meta_pol ls #通過rados命令獲取元數據pool中的對象 601.00000000 602.00000000 600.00000000 603.00000000 1.00000000.inode mds_snaptable 605.00000000 mds0_inotable 100.00000000 mds0_sessionmap ... [root@node1 ~]# rados -p fs_meta_pol get 601.00000000 mds.out #借用rados命令將對象內容放入到指定文件mds.out中 ceph-dencoder命令解析
先執行命令ceph-dencoder list_types命令來獲取你想知道的對象屬性信息,改屬性信息包括ceph各個組件元數據操作信息,從集群各個組件表項,到pg元數據信息,到對象元數據信息,都會存放在bufferlist,由bufferlist進行編碼序列化(encode)存放到數據庫中,使用得時候又從數據庫中取出,經過bufferlist進行反序列化(decode)進行使用。這里的list_types即是各個數據屬性存放再bufferlist中的內容,在進行反序列化查看屬性內容的時候需要進行指定[root@node1 ~]# ceph-dencoder type MDSMap::mds_info_t import mds.out decode dump_json {"gid": 0,"name": "","rank": -1,"incarnation": 0,"state": "up:standby","state_seq": 0,"addr": "-","standby_for_rank": -1,"standby_for_fscid": -1,"standby_for_name": "","standby_replay": false,"export_targets": [],"features": 0 }
如果我們想要查看osdmap 進行decode之后的元數據內容時可以進行如下操作
ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list|grep osdmap|tail -n 10 使用ceph-kvstore-tool工具從mon數據庫查看較新的osdmap表項以及對應的版本
[root@node1 mdsmap]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ list|grep osdmap|tail -n 10
osdmap full_992
osdmap full_993
osdmap full_994
osdmap full_995
osdmap full_996
osdmap full_997
osdmap full_998
osdmap full_999
osdmap full_latest
osdmap last_committed
獲取osdmap的制定版本內容,并放入指定文件中如下,關于ceph-kvstore-tool工具的使用可以參考文章ceph-kvstore-tool 工具使用詳解
[root@node1 mdsmap]# ceph-kvstore-tool rocksdb /var/lib/ceph/mon/ceph-node1/store.db/ get osdmap full_998 out osdmap.998
(osdmap, full_998)
此時osdmap的full_998版本內容已經放入到了osdmap.998文件之中,因為該文件時序列化之后的,需要進行解碼decode,同樣我們的ceph-dencoder工具的decode子命令,可以看到如下decode之后的輸出,osdmap數據結構非常清晰(由于內容較多,包括pool,osd的信息都有描述,暫不一一列舉)
[root@node1 mdsmap]# ceph-dencoder import osdmap.998 type OSDMap decode dump_json
{"epoch": 998,"fsid": "fa27f041-0ce9-4df1-a4bd-5e37678834bd","created": "2019-07-22 15:43:30.494296","modified": "2019-08-07 19:26:56.518397","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",...
encode
encode子命令主要是將內存中產生對應type的ceph元數據實例進行序列化,并放入bufferlist之中
ceph-dencoder import osdmap.998 type OSDMap encode
關于ceph-dencoder的其他子命令的使用可以參見幫助文檔,或者官方社區文檔,個人認為該工具同樣有助于我們對ceph源碼的理解。ceph設計去固化什么樣類型的元數據到數據庫中,才能維持ceph的可靠,高度自治的特性。
就這樣吧,存儲路漫漫~
總結
以上是生活随笔為你收集整理的ceph-dencoder工具使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ceph-kvstore-tool 工具
- 下一篇: C++ 函数参数 值传递与引用传递