我是靠谱客的博主 如意小甜瓜,最近开发中收集的这篇文章主要介绍Ceph 基本数据结构(1)-object,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Ceph的基本的概念就是对象object,在ceph的rados概念中,一个对象就是一个文件系统中的文件,具体在代码实现中,有object, sobject, hobject, ghobject等概念,在阅读ceph 的源代码时,上述几个概念有时候容易理不清。

struct object_t {
  string name;
  ......
}

object_t 就是对于的低层文件系统的一个文件,name就对于的文件名

struct sobject_t {
  object_t oid;
  snapid_t snap;
  ......
}

sobject_t 就是 加了snapshot相关信息的object_t ,snap 就是该对象对于的snapshot的以snap 号,
这个主要用于快照。如果一个对象不是快照,那么这个对象的snap 字段就设置为CEPH_NOSNAP,非snapshot对象,ceph称之为该对象对于的 head对象

struct hobject_t {
  object_t oid;
  snapid_t snap;
private:
  uint32_t hash;
  bool max;
  uint32_t nibblewise_key_cache;
  uint32_t hash_reverse_bits;
  static const int64_t POOL_META = -1;
  static const int64_t POOL_TEMP_START = -2; // and then negative
  friend class spg_t;  // for POOL_TEMP_START
public:
  int64_t pool;
  string nspace;

private:
  string key;
  ......
}

hobject_t 是名字应该是 hash object的缩写。
其除了已经介绍过的数据成员:
object_t oid; 保存对象的名字
snapid_t snap; 保存对象的snap号
新增加了成员:
int64_t pool 所在的pool的id
string nspace
string key
string hash

nspace一般为空,hash和key 不能同时设置,hash就是pg的id

struct ghobject_t {
  hobject_t hobj;
  gen_t generation;
  shard_id_t shard_id;
  bool max;

public:
  static const gen_t NO_GEN = UINT64_MAX;
  ......
}

ghobject 在对象hobject_t的基础上,添加了 generation字段 和 shard_id 字段
这个主要用于ErasureCode 用于rollback用的。如果是Replicate,那么shard_id字段就设置为NO_SHARD(-1),这两个字段对于replicate是没有用的。

当PG为EC时,写操作需要区分写前后两个版本的object. 写操作保存对象的上一个版本(generation)的对象,当EC写失败时,可以恢复到上一个版本

rados对象的名字:
name+[“head”|”snapdir”|snap] + “_” + hash(十六进制)+ “_” +pool_id + [“_” + generaion +”_” + shard_id]

具体的代码实现在函数如下,大家有兴趣可以自己研究一下
string LFNIndex::lfn_generate_object_name(const ghobject_t &oid)

最后

以上就是如意小甜瓜为你收集整理的Ceph 基本数据结构(1)-object的全部内容,希望文章能够帮你解决Ceph 基本数据结构(1)-object所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部