本文简单介绍librados,并给出相应的使用范例。参看:http://docs.ceph.com/docs/master/rados/api/librados-intro/
1. librados介绍
ceph存储集群提供的基本存储服务,使ceph能够在一个联合文件系统中独一无二的实现对象存储(object storage)、块存储(block storage)以及文件存储(file storage)。然而,你并不一定需要通过RESTful API、block API或者POSIX文件系统接口才能访问ceph存储集群。依赖于RADOS,你可以直接通过librados API来访问ceph存储集群。
librados API可以访问ceph存储集群的两类守护进程:
- Ceph Monitor: 维持cluster map的一份主拷贝
- Ceph OSD Daemon: 在存储节点上存储对象数据
2. 安装librados开发环境
客户端应用程序必须通过librados
来连接到ceph存储集群。在你使用librados
的时候必须安装librados及其依赖库。 librados API由C++写成,但是也提供了C、python、java、PHP接口。这里我们重点介绍一下C/C++接口:
对于Debian/Unbuntu系统:
对于RHEL/Centos系统:
安装之后可以在/usr/include/rados目录下找到。
3. 配置一个cluster handler
通过librados创建的Ceph Client可以直接和OSD来进行交互来存取数据。要想和OSD进行交互,client app必须要调用librados并且连接到Ceph Monitor。一旦连接成功,librados就可以从Ceph Monitor处获得Cluster Map。当client app想要读写数据的时候,其需要创建一个IO context并且绑定到一个pool上。pool是和rule相关联的,其定义了如何将数据存入集群。通过IO Context,client向librados提供object名称,librados采用该名称及获取到的cluster map就能够计算出需要将数据存放到哪个PG和OSD。client app并不需要直接的了解到集群的拓扑结构:
ceph storage cluster handle封装了客户端的配置,这包括:
- user ID(针对rados_create())或user name(针对rados_create2())
- cephx身份认证的key
- monitor ID和IP地址
- 日志级别
- 调试级别
这样要使用librados的步骤就是:1) 创建cluster handler 2)使用cluster handler连接到存储集群。 要想连接到集群,app必须提供monitor IP,username和身份认证的key(假如启用了cephx的话)
NOTE: 与不同的ceph存储集群交互,或以不同的用户名和同一个ceph存储集群交互都需要创建不同的cluster handler。
rados提供了多种方式来设置这些值。对于monitor及身份认证的key的设置,一种简单的方法就是将它们写在配置文件中。配置文件中包含至少一个monitor IP及keyring文件路径。例如:
一旦你成功创建handle,你就可以读取该配置文件来配置handle。你也可以通过向你的app client传递参数然后对应的函数来解析命令行参数(例如:rados_conf_parse_argv()),或者解析ceph环境变量(例如:rados_conf_parse_env())的方式来配置handle。下图提供了初始化连接的一个高层视图:
一旦handle连接成功,你就可以采用该handle来操作整个ceph集群了:
- 获得集群数据信息
- 使用pool相关操作(exists,create,list,delete等)
- 获取或设置配置
如下给出一个C版本的例子:
采用如下命令进行编译:
gcc ceph-client.c -lrados -o ceph-client
4. 创建一个IO context
一旦app client已经有了cluster handle并且连接上了ceph存储集群,你就可以创建一个IO Context,然后开始读写数据。IO Context将连接绑定到一个特定的pool。用户必须有适当的CAPS
权限来访问该pool。IO Context功能包括:
- 读写数据和extended属性
- 遍历出对象和extended属性
- pools快照,列出快照
rados同时支持同步/异步访问集群。一旦创建了IO Context之后,只需要通过object/xatrr名称即可进行读写操作。封装在librados中的CRUSH算法使用crush map选择合适的OSD进行操作。 OSD Daemons负责复制数据的副本。
如下的例子采用默认的data
存储池来进行演示。对于写操作,我们采用synchronous模式;对于读操作,我们采用asynchronous模式。
Note: 与上一个例子不同,我们这里还演示了通过解析命令行参数的方式来配置handle。rados_conf_parse_argv()函数使用起来有些怪异,这里特意给出例子。
请参看如下代码:
关闭sessions
一旦app client完成了相关操作,用户需要关闭连接和handle。针对asynchronous IO,用户也应确保该异步操作已经完成。