文章目录
- 简介
- 使用
- 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 encfile
export <outfile> write encoded data to outfile
set_features <num> set feature bits used for encoding
get_features print feature bits (int) to stdout
list_types list supported types
type <classname> select in-memory type
skip <num> skip <num> leading bytes before decoding
decode decode into in-memory object
encode encode in-memory object
dump_json dump in-memory object as json (to stdout)
hexdump print encoded data in hex
copy 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 object
is_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的可靠,高度自治的特性。
就这样吧,存储路漫漫~