0
点赞
收藏
分享

微信扫一扫

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 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的可靠,高度自治的特性。
就这样吧,存储路漫漫~


举报

相关推荐

0 条评论