博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ceph高级工具介绍之ceph-dencoder的使用
阅读量:4026 次
发布时间:2019-05-24

本文共 4183 字,大约阅读时间需要 13 分钟。

0 简介

贯穿Ceph OSD端数据处理的一个核心结构就是ObjectStore::Transaction,OSD处理的所有操作以及其关联的数据都会封装进入Transaction中的bufferlist结构里,这里的封装也就是序列化(encode),它将各种数据结构无论简单或者复杂都作为字节流,存入bufferlist中。最终Transaction会由具体的ObjectStore后端实现来处理,当然,处理时会对bufferlist中的数据进行反序列化(decode)。而本文介绍的ceph-dencoder工具就是Ceph提供的可以进行encode、decode以及dump ceph相关数据结构的工具,同时它也可以用来调试以及测试Ceph不同版本之间的兼容性。今天这里主要介绍它的decode功能,其他功能大家可以自行研究。

1 安装

ceph-dencoder工具是默认安装的。

2 使用

可以通过它的manpage或者help文档来了解它的使用

[root@ceph03 ~]# man ceph-dencoder

 
[root@ceph03 ~]# ceph-dencoder -husage: ceph-dencoder [commands ...]  version            print version string (to stdout)  import 
  read encoded data from encfile  export
   write encoded data to outfile  set_features
 set feature bits used for encoding  get_features        print feature bits (int) to stdout  list_types          list supported types  type
   select in-memory type  skip
         skip
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)  copy                copy object (via operator=)  copy_ctor           copy object (via copy ctor)  count_tests         print number of generated test objects (to stdout)  select_test
    select generated test object as in-memory object  is_deterministic    exit w/ success if type encodes deterministically
它的用法比较简单,即ceph-dencoder跟上相应的子命令即可。

在具体使用时,可以通过以下命令查看ceph-dencoder当前支持哪些结构:

# ceph-dencoder list_types

要确定需要通过哪种结构来进行数据解析,只能通过阅读源码,找到encode数据时,数据对应的数据结构。

3 使用事例

下面以查看object的object_info信息为例,介绍一下这个工具的使用。

在使用XFS作为后端存储时,一个object就对应一个文件,obejct的object_info信息通常是作为文件的扩展属性存在的。

首先先找到一个object对应的文件,并查看object文件的扩展属性,这里会用到XFS一个工具attr,主要用于操作XFS文件的扩展属性的:

[root@ceph03 0.0_head]# pwd/var/lib/ceph/osd/ceph-2/current/0.0_head[root@ceph03 0.0_head]# ls__head_00000000__0rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0[root@ceph03 0.0_head]# attr -l rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0Attribute "cephos.spill_out" has a 2 byte value for rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0Attribute "ceph._" has a 250 byte value for rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0Attribute "ceph._@1" has a 16 byte value for rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0Attribute "ceph.snapset" has a 31 byte value for rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0

从上面的输出可以看到扩展属性中总共有3部分,其中"ceph._"和"ceph._@1"应该算是一部分,因为ceph._超出了XFS扩展属性的长度限制,所以拆成了两个。而它里面就存放了我们要找的object_info_t的数据。"cephos.spill_out"是一个两个字节的字符数组,用于记录文件的扩展属性是否溢出到了Omap里,一般它的值是“0”或者“1”,“0”就是源码里的宏定义XATTR_NO_SPILL_OUT,表示没有溢出,而“1”是XATTR_SPILL_OUT,表示有溢出。“ceph.snapset"用来记录和Object相关的Snapshot信息,它的数据以SnapSet这个结构的形式存在。

另外还有一个通用的命令getfattr也可以干类似的事情。

[root@ceph03 0.0_head]# getfattr -d rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0 -m 'user\.ceph\._'# file: rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0user.ceph._=0sDwgEAQAABANAAAAAAAAAAB8AAAByYi4wLjVlOWEuMmFlODk0NGEuMDAwMDAwMDAwMDJl/v9A1gYPAAAAAAAAAAAAAAAAAAYDHAAAAAAAAAAAAAAA/wAAAAAAAAAA//8AAAAANAwAAAAAAAB4AQAAMwwAAAAAAAB4AQAAAgIVAAAACJ1eAAAAAAAAExcCAAAAAAABAAAAAABAAAAAAAAL2pBXQLuEOQICFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQMAAAAAAAAAAAAAAAAAAAAJAAAAA==user.ceph._@1=0sDNqQV32Low///w==

接着,我们将扩展属性中的数据dump到一个文件当中,注意应该将"ceph._"和"ceph._@1"的数据拼起来。

[root@ceph03 0.0_head]# attr -q -g "ceph._" rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0 > 1.txt[root@ceph03 0.0_head]# attr -q -g "ceph._@1" rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0 >> 1.txt
最后使用ceph-dencoder工具将其内容解析出来。

[root@ceph03 0.0_head]# ceph-dencoder import 1.txt type object_info_t decode dump_json{    "oid": {        "oid": "rb.0.5e9a.2ae8944a.00000000002e",        "key": "",        "snapid": -2,        "hash": 252106304,        "max": 0,        "pool": 0,        "namespace": ""    },    "version": "376'3124",    "prior_version": "376'3123",    "last_reqid": "client.24221.1:136979",    "user_version": 3124,    "size": 4194304,    "mtime": "2016-07-21 22:19:55.965000",    "local_mtime": "2016-07-21 22:19:56.262376",    "lost": 0,    "flags": 36,    "snaps": [],    "truncate_seq": 0,    "truncate_size": 0,    "data_digest": 4294967295,    "omap_digest": 4294967295,    "watchers": {}}
很不错吧。

转载地址:http://uvxbi.baihongyu.com/

你可能感兴趣的文章
NLP数据增强方法-(一)
查看>>
BERT+实体-百度ERNIE优化了啥
查看>>
NLP数据增强方法-动手实践
查看>>
学习让机器学会学习-Meta Learning课程笔记-1
查看>>
学习让机器学会学习-Meta Learning课程笔记-2
查看>>
RNN及其变种LSTM/GRU/SRU
查看>>
我还不知道Attention有哪些-公式代码都带你搞定
查看>>
自学习-怎么让对话助手越来越强
查看>>
BERT-flow:bert的向量表达是SOTA吗?
查看>>
Preprocessing data-sklearn数据预处理
查看>>
Java实现Oracle到MySQL的表迁移
查看>>
子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
查看>>
android:style和theme
查看>>
wait()、notify()和notifyAll()、sleep()、Condition、await()、signal()
查看>>
Arrays.asList()
查看>>
Big Endian 和 Little Endian
查看>>
java中重写方法应遵循规则
查看>>
Comparable的使用(用于Arrays.sort)
查看>>
Comparator(用于Arrays.sort)
查看>>
对自己的计划
查看>>