Ceph分布式存储实2.3 RADOS与LIBRADOS

简介:

2.3 RADOS与LIBRADOS


LIBRADOS模块是客户端用来访问RADOS对象存储设备的。Ceph存储集群提供了消息传递层协议,用于客户端与Ceph MonitorOSD交互,LIBRADOS以库形式为Ceph Client提供了这个功能,LIBRADOS就是操作RADOS对象存储的接口。所有Ceph客户端可以用LIBRADOSLIBRADOS里封装的相同功能和对象存储交互,LIBRBDLIBCEPHFS就利用了此功能。你可以用LIBRADOS直接和Ceph交互(如与Ceph兼容的应用程序、Ceph接口等)。下面是简单描述的步骤。

第1步:获取LIBRADOS。

第2步:配置集群句柄。

第3步:创建IO上下文。

第4步:关闭连接。

LIBRADOS架构图,如图2-5所示。

先根据配置文件调用librados创建一个rados,接下来为这个rados创建一个radosclient,radosclient包含3个主要模块(finisher、Messager、Objector)。再根据pool创建对应的ioctx,在ioctx中能够找到radosclient。再调用osdc对生成对应osd请求,与OSD进行通信响应请求。

下面分别介绍LIBRADOS的C语言、Java语言和Python语言示例。

1. LIBRADOS C语言示例

下面是LIBRADOS C语言示例。

#include <stdio.h>

#include <string.h>

#include <rados/librados.h>

int main (int argc, char argv**)

{

        /*声明集群句柄以及所需参数 */

        rados_t cluster;

        char cluster_name[] = "ceph";        //集群名称

        char user_name[] = "client.admin";   //指定访问集群的用户,这里用admin

        uint64_t flags;

        rados_ioctx_t io;                    //rados上下文句柄

        char *poolname = "data";             //目标pool名

        char read_res[100];

        char xattr[] = "en_US";

        /* 指定参数初始化句柄*/

        int err;

        err = rados_create2(&cluster, cluster_name, user_name, flags);

 

        if (err < 0) {

                fprintf(stderr, "%s: Couldn't create the cluster handle! %s\n", argv[0], strerror(-err));

                exit(EXIT_FAILURE);

        } else {

                printf("\nCreated a cluster handle.\n");

        }

        /* 读取配置文件用来配置句柄*/

        err = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf");

        if (err < 0) {

                fprintf(stderr, "%s: cannot read config file: %s\n", argv[0], strerror(-err));

                exit(EXIT_FAILURE);

        } else {

                printf("\nRead the config file.\n");

        }

 

        /* 分解参数 */

        err = rados_conf_parse_argv(cluster, argc, argv);

        if (err < 0) {

                fprintf(stderr, "%s: cannot parse command line arguments: %s\n", argv[0], strerror(-err));

                exit(EXIT_FAILURE);

        } else {

                printf("\nRead the command line arguments.\n");

        }

        /* 连接集群*/

        err = rados_connect(cluster);

        if (err < 0) {

                fprintf(stderr, "%s: cannot connect to cluster: %s\n", argv[0], strerror(-err));

                exit(EXIT_FAILURE);

        } else {

                printf("\nConnected to the cluster.\n");

        }

       //创建rados句柄上下文

        err = rados_ioctx_create(cluster, poolname, &io);

        if (err < 0) {

                fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0], poolname, strerror(-err));

                rados_shutdown(cluster);

                exit(EXIT_FAILURE);

        } else {

                printf("\nCreated I/O context.\n");

        }

 

        //写对象

        err = rados_write(io, "hw", "Hello World!", 12, 0);

        if (err < 0) {

                fprintf(stderr, "%s: Cannot write object \"hw\" to pool %s: %s\n", argv[0], poolname, strerror(-err));

                rados_ioctx_destroy(io);

                rados_shutdown(cluster);

                exit(1);

        } else {

                printf("\nWrote \"Hello World\" to object \"hw\".\n");

        }

       //设置对象属性

        err = rados_setxattr(io, "hw", "lang", xattr, 5);

        if (err < 0) {

                fprintf(stderr, "%s: Cannot write xattr to pool %s: %s\n", argv[0], poolname, strerror(-err));

                rados_ioctx_destroy(io);

                rados_shutdown(cluster);

                exit(1);

        } else {

                printf("\nWrote \"en_US\" to xattr \"lang\" for object \"hw\".\n");

        }

        rados_completion_t comp;

       //确认异步rados句柄成功创建

        err = rados_aio_create_completion(NULL, NULL, NULL, &comp);

        if (err < 0) {

                fprintf(stderr, "%s: Could not create aio completion: %s\n", argv[0], strerror(-err));

                rados_ioctx_destroy(io);

                rados_shutdown(cluster);

                exit(1);

        } else {

                printf("\nCreated AIO completion.\n");

        }

 

        /* Next, read data using rados_aio_read. */

        //异步读对象

        err = rados_aio_read(io, "hw", comp, read_res, 12, 0);

        if (err < 0) {

                fprintf(stderr, "%s: Cannot read object. %s %s\n", argv[0], poolname, strerror(-err));

                rados_ioctx_destroy(io);

                rados_shutdown(cluster);

                exit(1);

        } else {

                printf("\nRead object \"hw\". The contents are:\n %s \n", read_res);

        }

       //等待对象上的操作完成

        rados_wait_for_complete(comp);

 

        // 释放complete句柄

        rados_aio_release(comp);

        char xattr_res[100];

       //获取对象

        err = rados_getxattr(io, "hw", "lang", xattr_res, 5);

        if (err < 0) {

                fprintf(stderr, "%s: Cannot read xattr. %s %s\n", argv[0], poolname, strerror(-err));

                rados_ioctx_destroy(io);

                rados_shutdown(cluster);

                exit(1);

        } else {

                printf("\nRead xattr \"lang\" for object \"hw\". The contents are:\n %s \n", xattr_res);

        }

       //移除对象属性

        err = rados_rmxattr(io, "hw", "lang");

        if (err < 0) {

                fprintf(stderr, "%s: Cannot remove xattr. %s %s\n", argv[0], poolname, strerror(-err));

                rados_ioctx_destroy(io);

                rados_shutdown(cluster);

                exit(1);

        } else {

                printf("\nRemoved xattr \"lang\" for object \"hw\".\n");

        }

       //删除对象

        err = rados_remove(io, "hw");

        if (err < 0) {

                fprintf(stderr, "%s: Cannot remove object. %s %s\n", argv[0], poolname, strerror(-err));

                rados_ioctx_destroy(io);

                rados_shutdown(cluster);

                exit(1);

        } else {

                printf("\nRemoved object \"hw\".\n");

        }

    rados_ioctx_destroy(io);                  //销毁io上下文

    rados_shutdown(cluster);                  //销毁句柄

}

2. LIBRADOS Java语言示例

下面是LIBRADOS Java语言示例。

import com.ceph.rados.Rados;

import com.ceph.rados.RadosException;

import java.io.File;

public class CephClient {

        public static void main (String args[]){

                try {

                        //获取句柄

                        Rados cluster = new Rados("admin");

                        System.out.println("Created cluster handle.");

 

                        File f = new File("/etc/ceph/ceph.conf");

                        //读取配置文件

                        cluster.confReadFile(f);

                        System.out.println("Read the configuration file.");

                       //连接集群

                        cluster.connect();

                        System.out.println("Connected to the cluster.");

 

                } catch (RadosException e) {

                        System.out.println(e.getMessage()+":"+e.getReturnValue());

                }

        }

}

3. LIBRADOS Python语言示例

下面是LIBRADOS Python语言示例。

#!/usr/bin/python

#encoding=utf-8

import rados, sys

cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')   #获取句柄

print "\n\nI/O Context and Object Operations"

print "================================="

print "\nCreating a context for the 'data' pool"

if not cluster.pool_exists('data'):                  

raise RuntimeError('No data pool exists')

ioctx = cluster.open_ioctx('data')                  #获取pool的io上下文句柄

print "\nWriting object 'hw' with contents 'Hello World!' to pool 'data'."

ioctx.write("hw", "Hello World!")                 #写入对象

print "Writing XATTR 'lang' with value 'en_US' to object 'hw'"

ioctx.set_xattr("hw", "lang", "en_US")          #设置对象的属性

print "\nWriting object 'bm' with contents 'Bonjour tout le monde!' to pool 'data'."

ioctx.write("bm", "Bonjour tout le monde!")

print "Writing XATTR 'lang' with value 'fr_FR' to object 'bm'"

ioctx.set_xattr("bm", "lang", "fr_FR")

print "\nContents of object 'hw'\n------------------------"

print ioctx.read("hw")                   #读取对象

print "\n\nGetting XATTR 'lang' from object 'hw'"

print ioctx.get_xattr("hw", "lang")        #读取对象属性

print "\nContents of object 'bm'\n------------------------"

print ioctx.read("bm")

  print "\nClosing the connection."

ioctx.close()                           #关闭io上下文

 

print "Shutting down the handle."

cluster.shutdown()                      #销毁句柄

相关文章
|
存储 关系型数据库 数据库
【北亚企安数据恢复】Ceph分布式存储基本架构&Ceph数据恢复流程
Ceph存储可分为块存储,对象存储和文件存储。Ceph基于对象存储,对外提供三种存储接口,故称为统一存储。 Ceph的底层是RADOS(分布式对象存储系统),RADOS由两部分组成:OSD和MON。 MON负责监控整个集群,维护集群的健康状态,维护展示集群状态的各种图表,如OSDMap、MonitorMap、PGMap和CRUSHMap。 OSD负责存储数据、复制数据、平衡数据、恢复数据,与其它OSD间进行心跳检查等。通常情况下一块硬盘对应一个OSD。
|
2月前
|
存储 块存储
ceph分布式存储系统常见术语篇
关于Ceph分布式存储系统的常见术语解释和概述。
99 1
ceph分布式存储系统常见术语篇
|
2月前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
81 5
|
11月前
|
存储 关系型数据库 网络安全
小白带你学习ceph分布式存储
小白带你学习ceph分布式存储
216 1
|
6月前
|
存储 关系型数据库 Linux
ceph分布式存储
ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。
196 0
|
存储 大数据
大数据数据存储的分布式文件系统的Ceph
在分布式文件系统 Ceph 中,数据的存储和管理是基于块的分布式存储。
109 1
|
存储 运维 Kubernetes
分布式开源存储架构Ceph概述
k8s的后端存储中ceph应用较为广泛,当前的存储市场仍然是由一些行业巨头垄断,但在开源市场还是有一些不错的分布式存储,其中包括了Ceph、Swift、sheepdog、glusterfs等
953 0
|
存储 Kubernetes 关系型数据库
K8s部署分布式存储Ceph系统搭建与实战
K8s部署分布式存储Ceph系统搭建与实战
1314 0
|
存储 Swift 对象存储
Ceph分布式存储之对象存储
Ceph分布式存储之对象存储
316 0
Ceph分布式存储之对象存储
|
存储 数据安全/隐私保护
CentOS7.7.1908下部署Ceph分布式存储(下)
CentOS7.7.1908下部署Ceph分布式存储(下)
215 0
CentOS7.7.1908下部署Ceph分布式存储(下)