王豪迈
作者王豪迈·2017-01-05 11:01
CTO·星辰天合(XSKY)

解析 Ceph: OSD 端操作自定义扩展

字数 1898阅读 1564评论 0赞 1

LibRados 是 Ceph 集群提供的基本 API 库,它封装了对象的增删改查操作,对象级快照能力,单对象的事务能力和基本的统计,池管理。实际上,在绝大多数传统应用场景下,基本的增删改查是无法实现应用需求的,比如原子计数器,复杂的条件写操作等等。大部分键值数据库实际上都会面临这个窘境,然后通过丰富 API 比如增加 CAS(Compare And Swap)方法,带一些基本条件判断的写操作。但是,应用的复杂性使得不断会有一些特殊的要求,如果只提供基本甚至丰富全面的接口不仅会增加接口复杂性,增加维护难度,并且仍然会存在缺口。Ceph 提供了基本的 CMP 接口来直接供用户使用,但是为了满足在分布式存储上构建 Data Aware 计算的需求,Ceph 提供了更加弹性的方式。

因此,类似于 Lua 之于 Redis,Ceph 提供了动态加载二进库的方式来增加对于用户定义操作的支持,可以使用 LibRados 提供的 exec 方法来执行特定要求:

void exec(const char *cls, const char *method, bufferlist& inbl, bufferlist *obl, int *prval)

cls 是方法集合名称,method 是方法名称,inbl 和 obl 都是一个序列化参数列表,caller 和该方法实现端会自己解释该序列化字符串。

注册方法

举一个例子,比如实现一个原子计数器方法,那么用户可以定义如下的操作:

方法集合名: atomic_counter
方法名: atomic_add
方法参数(inbl):
name(计数器名字)
返回值(obl):
value(目前数值)
有了这个目标以后,可以在 ceph 的 src/cls 目录下新建一个文件为 atomic_counter/atomic_counter.cc,实现 atomic_add 方法:

static int atomic_add(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
{
  string name;
  uint64_t value;

  bufferlist::iterator iter = in->begin();
  try {
    ::decode(name, iter);
  } catch (const buffer::error &err) {
    return -EINVAL;
  }

  int r = read_key(hctx, name, &value);
  value++;

  ::encode(value, *out);
  r = cls_cxx_map_set_val(hctx, name, out);
  return 0;
}

这个方法简单实现了从参数里获得计数器名字,然后递增再存回去,将递增后的值返回给用户。然后使用 cls_register_cxx_method 注册该方法。具体例子可以参考 src/cls/hello/hello.cc 样例。

为何需要自定义操作?

实际上,看起来上面那个方法非常冗长和麻烦,远不如提供一个 Native 的计数器来的简便。但是在复杂的应用需求下,有大量复杂的逻辑可以在此实现。比如 src/cls/rbd/rbd.cc 实现了众多提供 rbd 操作的方法,比如创建快照,克隆等等。通过自定义操作可以方便的定义一个复杂的操作,并在服务器端提供全局唯一的锁操作。

当然,除了为了应付应用对于接口的需求外,更多的为了减少数据的传输量。我们知道像 Oracle 的 Exadata 就提供了在存储端进行简单计算的能力,避免造成在计算节点上数据集中造成的大量带宽和延迟。类似的,Ceph 作为一个分布式存储系统,除了标准的存储接口如 POSIX,块接口和对象接口外,LibRados 提供的接口语意和可扩展方法使得一个依赖于 Ceph 的分布式应用变得更加高效。比如一个分布式的日志系统ZLOG,所有的日志数据存储在 Ceph 集群里,这时候我们需要对日志做基本的搜索,这时候如果我们在应用层构建搜索逻辑,实际上就需要把所有的 Ceph 数据导入到计算节点进行处理,而利用扩展的操作就使得在存储节点上进行计算。

我们通用可以参考社区用户的一个例子,直接在扩展中封装了 LUA 解释器DYNAMIC OBJECTS IN LUA! 客户端可以直接发送 LUA 代码给 OSD,然后在 OSD 执行 LUA 代码。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广