背景
当object的元数据发生错误时,例如分片上传后的对象分片信息不对或者桶的数据统计信息不对,又或者集群升级要做数据割接的时候,修改object的元数据例如attr和omapheader是必要的,这个时候就要使用ceph-dencoder。
但是ceph-dencoder的原有逻辑挤不上不支持元数据的修改功能,那是因为ceph-dencoder缺失下图虚线框内的逻辑(以为作为ceph的设计者来说,对象元数据的损坏是bug,他们会在修改损坏发生的地方的逻辑,并不会开设人工干预修改这种治标不治本的工具,但是有时线上环境的问题等不及去官网提bug等待补丁的时间)。这时需要修改ceph-dencoder以及rados了。
修改ceph-dencoder的代码,为之添加json解析成对应结构体的逻辑,其中需要注意原有的元数据机构的dump极有可能只dump显示了部分重要信息,从而导致根据json解析出来的元数据不全,因而需要修改元数据结构的dump函数,使之能够显示所有的元数据信息。另外rados命令有的元数据结构体的set方法是接受流的,但是有些结构体只接受字符串,所以必要时修改rados的代码,使其接受流。
实验
实验修改桶的数据统计信息中的压缩后大小信息:
1. radosgw-admin bucket stats --bucket {bucket name}
可以明显看到size_utilized是不对的,因为桶内对象并没有进行压缩,压缩大小应该与size字段保持一致
2. rados -p cn-north-3a.rgw.buckets.index getomapheader .dir.{bucket id} header
3. ceph-dencoder type rgw_bucket_dir_header import header decode dump_json > json
修改json中的actual_size为size字段中的值
4. ceph-dencoder import json type rgw_bucket_dir_header parse_json encode export mod
parse_json 为添加的命令参数
5. rados -p cn-north-3a.rgw.buckets.index setomapheader .dir. {bucket id} < mod
修改rados setomapheader时接受流式输入
6. radosgw-admin bucket stats --bucket {bucket name}
观察压缩后的容量,应该修改完完成。