ceph-dencoder的使用
来源:互联网 发布:复杂网络社区发现研究 编辑:程序博客网 时间:2024/05/18 10:51
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 -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)
- 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
在具体使用时,可以通过以下命令查看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__0
- rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0
- [root@ceph03 0.0_head]# attr -l rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0
- Attribute "cephos.spill_out" has a 2 byte value for rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0
- Attribute "ceph._" has a 250 byte value for rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0
- Attribute "ceph._@1" has a 16 byte value for rb.0.5e9a.2ae8944a.00000000002e__head_0F06D640__0
- Attribute "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__0
- user.ceph._=0sDwgEAQAABANAAAAAAAAAAB8AAAByYi4wLjVlOWEuMmFlODk0NGEuMDAwMDAwMDAwMDJl/v////////9A1gYPAAAAAAAAAAAAAAAAAAYDHAAAAAAAAAAAAAAA/////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
- [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": {}
- }
- ceph-dencoder的使用
- Ceph高级工具介绍之ceph-dencoder的使用
- ceph 0.47的使用
- ceph-rest-api的使用
- ceph-rest-api的使用
- Ceph高级工具介绍之ceph-kvstore-tool的使用
- Ceph高级工具介绍之ceph-objectstore-tool的使用
- ceph使用
- ceph rgw中所使用的池子
- Ceph中Bufferlist的设计与使用
- 使用Ceph作为OpenStack的后端存储
- 有关Ceph的一些使用经验
- 使用Ceph作为OpenStack的后端存储
- kubernetes的ceph RBD volume(3): 动态volume的使用(ceph RBD)
- 不使用ceph-deploy 手动安装两个节点的Ceph集群
- kubernetes的ceph RBD volume(1):使用Ceph RBD作为后端Volume
- kubernetes的ceph RBD volume(2): 使用Ceph RBD作为persistent volume
- python使用Ceph API 查看image使用的大小
- Jfreechart-Jfreechart的使用(图表绘制)[柱状图]
- java基本数据类型-基本类型的类型转换
- APP从启动到主页面显示经历了哪些过程
- acpi_table_header的oem_id 可以区分不同的硬件
- [论文解读]Multi-View 3D Object Detection Network for Autonomous Driving
- ceph-dencoder的使用
- java第三方获取短信验证码
- 位运算符-按位与或非异或
- 上拉和下拉的作用
- java中Date的处理大全
- POJ 1753.Flip Game
- MVP+Dragger2+Rxjava2+Retrofit+OKhttp进行开发。
- 不定宽高的水平垂直居中
- 在一个空的Eclipse中安装Android开发的ADT和SDK