理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Too
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成:
(1)安装和部署
(2)Ceph RBD 接口和工具
(3)Ceph 与 OpenStack 集成的实现
(4)TBD
Ceph 作为一个统一的分布式存储,其一大特色是提供了丰富的编程接口。我们来看看下面这张经典的图:
其中,librados 是 Ceph 的基础接口,其它的接口比如 RADOSGW, RBD 和 CephFS 都是基于 librados 实现的。本文试着分析下 Ceph 的各种接口库和常用的工具。
1 librados 1.1 librados 概述Ceph 提供一个消息层协议(messaging layer protocol)使得 ceph 客户端可以和 Ceph Monitor 以及 Ceph OSD Daemon 交互。librados 就是一个该协议的编码库形式的实现。所有的 Ceph clients 要么使用 librados 要么使用其封装的更高层 API 与对象存储进行交互。比如,librbd 使用 librados 提供 Ceph 客户端与 RBD 交互 API。
librados 是使用 C++ 实现的,同时也提供 C, python,Java 和 PHD 语言的绑定。使用它之前,你需要安装它:
安装 C/C++ 版本的 librados,比如在 Ubuntu 环境中,运行 sudo apt-get install librados-dev,然后你就会在 /usr/include/rados 目录中找到C/C++的头文件。
使用 Python 版本的 librados,比如在 Ubuntu 环境中,运行 sudo apt-get install python-rados。具体请见 1.1.2 部分。
一个 Ceph client 通过 librados 存放或者读取数据块到 Ceph 中,需要经过以下步骤:
Client 调用 librados 连接到 Ceph monitor,获取 Cluster map。
当 client 要读或者写数据时,它创建一个与 pool 的 I/O Context。该 pool 关联有 ruleset,它定义了数据在 Ceph 存储集群中是怎么存放的。
client 通过 I/O Context 提供 object name 给 librados,它使用该 object name 和 cluster map 计算出 PG 和 OSD 来定位到数据的位置。
client 直接和 OSD Deamon 交互来读或者写数据。
可见,第一步中,ceph client 需要知道 Ceph Minotor 的访问方法,以及用户的身份信息,而这些信息往往是放在 ceph 配置文件中,比如:
[global] mon host = 192.168.1.1 keyring = /etc/ceph/ceph.client.admin.keyring
1.2 librados for phthonPython rados 模块是 librados 的 Python 的很薄的封装,它在 github 上的源文件在 /src/pybind/rados.py, 安装到 Ubunt 后的源文件在 /usr/lib/python2.7/dist-packages/rados.py。
(1)要使用 rados.py 模块,在你的代码中 import rados
(2)创建一个 cluster handler,你需要提供 ceph.conf 文件和 keystring
import rados, sys #Create Handle Examples. 你有多种方式来指定 ceph.conf (1)cluster = rados.Rados(conffile=‘ceph.conf‘) #默认路径的 ceph.conf (2)cluster = rados.Rados(conffile=sys.argv[1]) #指定路径的 ceph.conf (3)cluster = rados.Rados(conffile = ‘ceph.conf‘, conf = dict (keyring = ‘/path/to/keyring‘)) #默认路径的 ceph.conf 和指定的 keystring
(3)连接到 ceph cluster
cluster.connect()
(4)获取 ceph cluster 的信息,以及操作 pool
cluster_stats = cluster.get_cluster_stats()
pools = cluster.list_pools()
cluster.create_pool(‘test‘)
cluster.delete_pool(‘test‘)
(5)向 ceph 集群读写数据,需要有一个 I/O Context (ioctx)
ioctx = cluster.open_ioctx(‘data‘)
(6)然后就可以读写数据了
ioctx.write_full("hw", "Hello World!") #向 “hw” object 写入 "Hello World!" print ioctx.read("hw") #读取 ”hw“ object 的数据 ioctx.remove_object("hw") #删除 “hw” object
更多的信息,可以参考 LIBRADOS (PYTHON)。
2. librbd:Go 语言实现的访问 Ceph RBD 的接口温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67036.html