第6章 Ceph ブロックデバイスの Python モジュールの使用

rbd python モジュールは、Ceph ブロックデバイスイメージへのファイルのようなアクセスを提供します。この組み込みツールを使用するには、rbd および rados Python モジュールをインポートします

前提条件

  • Red Hat Ceph Storage クラスターが実行中である。
  • ノードへのルートレベルのアクセス。

Procedure

  1. RADOS に接続し、IO コンテキストを開きます。

    cluster = rados.Rados(conffile='my_ceph.conf')
    cluster.connect()
    ioctx = cluster.open_ioctx('mypool')
  2. イメージを作成するのに使用する :class:rbd.RBD オブジェクトをインスタンス化します。

    rbd_inst = rbd.RBD()
    size = 4 * 1024**3  # 4 GiB
    rbd_inst.create(ioctx, 'myimage', size)
  3. イメージで I/O を実行するには、:class:rbd.Image オブジェクトをインスタンス化します

    image = rbd.Image(ioctx, 'myimage')
    data = 'foo' * 200
    image.write(data, 0)

    これにより、「foo」がイメージの最初の 600 バイトに書き込まれます。データは :type:unicode - librbd で、:c:type:char よりも多くの文字を処理する方法が分かない点に注意してください。

  4. イメージ、IO コンテキスト、および RADOS への接続を閉じます。

    image.close()
    ioctx.close()
    cluster.shutdown()

    安全性を確保するには、これらの各呼び出しは個別の :finally ブロックである必要があります。

    import rados
    import rbd
    
    cluster = rados.Rados(conffile='my_ceph_conf')
    try:
        ioctx = cluster.open_ioctx('my_pool')
        try:
            rbd_inst = rbd.RBD()
            size = 4 * 1024**3  # 4 GiB
            rbd_inst.create(ioctx, 'myimage', size)
            image = rbd.Image(ioctx, 'myimage')
            try:
                data = 'foo' * 200
                image.write(data, 0)
            finally:
                image.close()
        finally:
            ioctx.close()
    finally:
        cluster.shutdown()

    これは面倒化できるため、Rados、Ioctx、および Image クラスは、自動的に終了またはシャットダウンするコンテキストマネージャーとして使用できます。それをコンテキストマネージャーとして使用すると、上記の例は次のとおりです。

    with rados.Rados(conffile='my_ceph.conf') as cluster:
        with cluster.open_ioctx('mypool') as ioctx:
            rbd_inst = rbd.RBD()
            size = 4 * 1024**3  # 4 GiB
            rbd_inst.create(ioctx, 'myimage', size)
            with rbd.Image(ioctx, 'myimage') as image:
                data = 'foo' * 200
                image.write(data, 0)