ceph : librados 接口使用

rados 访问的基本流程

    1. 创建初始化rados对象
librados::Rados rados;
ret = rados.init("admin"); // 使用client.admin keyring
    1. 连接cluster
ret = rados.connect();
    1. rados 操作
    • 创建pool
rados.pool_create(pool_name);
    1. IO操作
    • 4.1 创建IO Context
      io操作需要先创建ioctx,并指定要针对哪个pool进行IO操作。一个rados可以创建多个ioctx
    ret = rados.ioctx_create(pool_name, io_ctx);
    
    • 4.2 写对象
      所有数据在写之前需要先将数据序列化为bufferlist,然后调用ioctx的write函数,写入对象时会指定对象的名称oid。
    librados::bufferlist bl;
    std::string hello("hello world!");
    bl.append(hello);
    ret = io_ctx.write_full(“hello”, bl);
    
    同时还支持,在某个位置写入特定长度,以及附加写
    int write(const std::string& oid, bufferlist& bl, size_t len, uint64_t off);
    int append(const std::string& oid, bufferlist& bl, size_t len);
    
  • 4.3 读对象
    这个例子中采用异步读,首先准备一个读缓存区,创建一个读完成处理的对象,执行异步读。
    等待读完成,获取返回值。从缓存区可以取出读取的内容。
    librados::bufferlist read_buf;
    int read_len = 4194304; 
    librados::AioCompletion *read_completion = librados::Rados::aio_create_completion();
    ret = io_ctx.aio_read(object_name, read_completion, &read_buf, read_len, 0);
    read_completion->wait_for_complete();
    ret = read_completion->get_return_value();
    std::string read_string;
    read_buf.copy(0, ret, read_string);
    
    rados也支持同步读
    int read(const std::string& oid, bufferlist& bl, size_t len, uint64_t off);
    
  • 4.4 xattr 读写
    可以对对象的xattr进行读写
    librados::bufferlist version_bl;
    version_bl.append('1');
    ret = io_ctx.setxattr(object_name, "version", version_bl);
    
  • 4.5 可以将多个内容作为一个原子操作一起提交
    同时将对象data和xattr内容一起提交
     librados::bufferlist bl;
     bl.append(hello);
     bl.append("v2");
     librados::ObjectWriteOperation write_op;
     write_op.write_full(bl);
     librados::bufferlist version_bl;
     version_bl.append('2');
     write_op.setxattr("version", version_bl);
     ret = io_ctx.operate(object_name, &write_op);
    
    可以在写入前检查对象的版本,从而实现CAS的功能。即写入对象前判断对象是否已经被更新。
    librados::ObjectWriteOperation failed_write_op;
    librados::bufferlist bl;
    bl.append(hello);
    bl.append("v2");
    librados::ObjectWriteOperation write_op;
    write_op.write_full(bl);
    librados::bufferlist version_bl;
    version_bl.append('2');
    librados::bufferlist old_version_bl;
    old_version_bl.append('1');
    failed_write_op.cmpxattr("version", LIBRADOS_CMPXATTR_OP_EQ, old_version_bl);
    failed_write_op.write_full(bl);
    failed_write_op.setxattr("version", version_bl);
    ret = io_ctx.operate(object_name, &failed_write_op);
    
    1. 条带化操作
  libradosstriper::RadosStriper* rs = new libradosstriper::RadosStriper;
  ret = libradosstriper::RadosStriper::striper_create(io_ctx,rs);
  ret = io_ctx.pool_required_alignment2(&alignment);
  rs->set_object_layout_stripe_unit(alignment);
  // 条带跨的对象数量
  rs->set_object_layout_stripe_count(strip_count);
  // 每个对象数据量
  rs->set_object_layout_object_size(obj_size);
  // 写数据
  rs->write_full(obj_name,bl);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。