1. 程式人生 > >python通過librados庫通過底層的rados操作ceph的物件儲存和塊儲存

python通過librados庫通過底層的rados操作ceph的物件儲存和塊儲存

使用python語言呼叫原生介面(呼叫librados庫來操作rados)
也就是下圖中幾種方式中的一種,就是圖中的紅色部分:

首先來說明一下:這個就相當於在客戶端上操作ceph叢集的底層物件儲存rados,我的程式碼是在mon節點上執行的,也就是暫時把mon當作客戶端來使用。
當然我們也可以另外使用一臺主機來作為客戶端,這個客戶端只要能夠連通ceph叢集就可以,比如我也可以使用另外一臺centos7的主機,只需要 yum -y install ceph即可,然後在/etc/ceph/資料夾下把mon節點/etc/ceph/下的ceph.conf檔案和ceph.client.admin.keyring檔案複製過去即可完成ceph客戶端的配置。

下面是簡單python程式碼示例:

#!/usr/bin/python
#encoding=utf-8
import rados, sys

cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
#用當前的這個ceph的配置檔案去建立一個rados,這裡主要是解析ceph.conf中的   叢集配置引數。然後將這些引數的值儲存在rados中。
cluster.connect()
#這裡將會建立一個radosclient的結構,這裡會把這個結構主要包含了幾個功能模組:    訊息管理模組Messager,資料處理模組Objector,finisher執行緒模組。
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') #為一個名字叫做data的儲存池建立一個ioctx ,ioctx中會指明radosclient與Objector 模組,同時也會記錄data的資訊,包括pool的引數等。
print "\nWriting object 'school' with contents 'hello , I are from chd university!' to pool 'data'." ioctx.write("school", "hello , I are from chd university!") ioctx.set_xattr("school", "lang", "en_US") print "\nWriting object 'name' with contents 'my name is lxl!' to pool 'data'." ioctx.write("name", "my name is lxl!") print "Writing XATTR 'lang' with value 'fr_FR' to object 'name'" ioctx.set_xattr("name", "lang", "fr_FR") print "\nContents of object 'school'\n------------------------" print ioctx.read("school") print ioctx.get_xattr("name", "lang") print "\nContents of object 'name'\n------------------------" print ioctx.read("name") print "\nClosing the connection." ioctx.close()

執行結果:

Python 示例程式碼2:
通過建立rbd塊裝置來操作rados,也就是下圖中的紅色部分:

rbd 是個操縱 rados 塊裝置( RBD )映像的工具, QEMU/KVM 通過 Linux rbd 核心驅動和 rbd 儲存驅動來使用。 RBD 映像是簡單的塊裝置,它被條帶化成小塊物件後儲存於 RADOS 物件儲存叢集。條帶化後的物件尺寸必須是 2 的冪。

#!/usr/bin/env python
import sys,rados,rbd
def connectceph():
      cluster = rados.Rados(conffile = '/etc/ceph/ceph.conf')
      cluster.connect()
      ioctx = cluster.open_ioctx('rbd_test')
#使用 rbd 之前,連線到 RADOS,並開啟一個 IO context (和特定 pool 相關)
#使用 rbd 之前,連線到 RADOS,並開啟一個 IO context (和特定 pool 相關)

      rbd_inst = rbd.RBD()
      size = 40*1024**3
      rbd_inst.create(ioctx,'test_image',size)
      image = rbd.Image(ioctx,'test_image')
      data = 'hello'* 300000
      image.write(data,0)
      image.close()
      ioctx.close()
      cluster.shutdown()

if __name__ == "__main__":
        connectceph()






解析:使用 rbd 之前,連線到 RADOS,並開啟一個 IO context (和特定 pool 相關)
cluster = rados.Rados(conffile= ‘/etc/ceph/ceph.conf’)
cluster.connect()
ioctx = cluster.open_ioctx(‘rbd_test’)

#初始化一個 RBD 物件
rbd_inst = rbd.RBD()
size = 4 * 1024**3 # 4 GiB
#建立 image
rbd_inst.create(ioctx, ‘testimage’, size)

#初始化 image 物件
image = rbd.Image(ioctx, ‘testimage’)
#準備 約14M字元的資料
data = ‘hello world !!’* 1024**2
#寫入資料
image.write(data, 0)

#關閉 image 物件
image.close()
#關閉 IO Context
ioctx.close()
#關閉連線
cluster.shutdown()

可以看看執行結果:

Python示例程式碼3:
窗體頂端
在給定的叢集上發出ceph命令並提供返回的json

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import json

from rados import Rados
from rados import Error as RadosError

class CephClusterCommand(dict):
    """
    Issue a ceph command on the given cluster and provide the returned json
    """

    def __init__(self, cluster, **kwargs):
        dict.__init__(self)
        ret, buf, err = cluster.mon_command(json.dumps(kwargs), '', timeout=5)
        if ret != 0:
            self['err'] = err
        else:
            self.update(json.loads(buf))

config={'conffile': '/etc/ceph/ceph.conf', 'conf': {}}
with Rados(**config) as cluster:
    cluster_status = CephClusterCommand(cluster, prefix='status', format='json')
    print cluster_status

執行結果:
{u’election_epoch’: 4, u’quorum’: [0], u’monmap’: {u’epoch’: 1, u’mons’: [{u’name’: u’node1’, u’rank’: 0, u’addr’: u’192.168.1.220:6789/0’}], u’modified’: u’2017-11-27 10:57:00.018670’, u’fsid’: u’f2891898-aa3b-4bce-8bf1-668b8cf5b45a’, u’created’: u’2017-11-27 10:57:00.018670’}, u’health’: {u’detail’: [], u’timechecks’: {u’round_status’: u’finished’, u’epoch’: 4, u’round’: 0}, u’health’: {u’health_services’: [{u’mons’: [{u’last_updated’: u’2018-03-02 09:41:42.153833’, u’name’: u’node1’, u’avail_percent’: 89, u’kb_total’: 28797196, u’kb_avail’: 25738680, u’health’: u’HEALTH_OK’, u’kb_used’: 3058516, u’store_stats’: {u’bytes_total’: 15344382, u’bytes_log’: 2031616, u’last_updated’: u’0.000000’, u’bytes_misc’: 2031632, u’bytes_sst’: 11281134}}]}]}, u’overall_status’: u’HEALTH_WARN’, u’summary’: [{u’severity’: u’HEALTH_WARN’, u’summary’: u’too many PGs per OSD (428 > max 300)’}]}, u’fsid’: u’f2891898-aa3b-4bce-8bf1-668b8cf5b45a’, u’quorum_names’: [u’node1’], u’fsmap’: {u’up:standby’: 1, u’by_rank’: [{u’status’: u’up:active’, u’filesystem_id’: 1, u’name’: u’node2’, u’rank’: 0}], u’max’: 1, u’up’: 1, u’epoch’: 6, u’in’: 1, u’id’: 1}, u’osdmap’: {u’osdmap’: {u’full’: False, u’nearfull’: False, u’num_osds’: 2, u’num_up_osds’: 2, u’epoch’: 36, u’num_in_osds’: 2, u’num_remapped_pgs’: 0}}, u’pgmap’: {u’bytes_total’: 58976657408, u’num_pgs’: 428, u’data_bytes’: 143101344, u’bytes_used’: 17297178624, u’version’: 165507, u’pgs_by_state’: [{u’count’: 428, u’state_name’: u’active+clean’}], u’bytes_avail’: 41679478784}}