Rados Block Device(RBD) を使ってみる

作成日:2012.03.20

このページでは Ceph のストレージをブロックデバイスとして切り出す Rados Block Device(RBD) の使い方を説明する。

以下は関連ページ。


更新履歴
(2012.03.20) 作成。


目次

1. Rados Block Device (RBD) とは

Ceph は複数のノードを束ねて一つの大規模なオブジェクトストレージ、RADOS、を構成する。 この RADOS のディスクを NFS のように分散ファイルシステムとして公開する cephfs が使える。

さらに ceph には RADOS の持つオブジェクトをブロックデバイスとして公開する Rados Block Device 機能を持っている。 RBD のブロックデバイスは rbd イメージと呼ばれる。 あらかじめ名前とサイズを指定して RADOS から rbd イメージを切り出しておく。 クライアントとなる Linux システムは rbd カーネルモジュールを使うことでネットワーク的に離れた位置にある rbd イメージをクライアントの /dev/rbdN にマップできる。 いったんマップされた rbd イメージは、ext4 形式や btrfs 形式にフォーマットしてクライアントのローカルファイルシステムとして使用可能となる。

また KVM を使う場合 QEMU-RBD を使うことで、RADOS から切り出した rbd イメージを KVM のゲスト VM のディスクとして使うことができる。 ただし、この資料では QEMU-RBD の使い方は TBD とする。

2. セットアップ

RBD を使うための ceph のセットアップは、cephfs を使う場合と同じである。 「Ceph を使ってみる」 の「2. インストール」から「3.3 起動」までのセットアップを行う。 最後の「3.4 マウント」は不要。

3. 基本的な操作

まず RBD を操作するには ceph をインストールしたシステム上で rbd コマンドを使用する。 Ceph がインストールされていればクラスタ内のマシンでもクラスタ外のマシンで操作しても構わない。

3.1 mon デーモンの位置の指定

rbd コマンドを使う場合 mon デーモンが起動している位置を知らせる必要がある。 Ceph を構成する場合に使った ceph.conf を -c オプションで渡すか、mon デーモンの IP アドレスとポート番号を -m オプションで渡す。 ただし ceph.conf が /etc/ceph/ceph.conf にある場合には、-c-m の指定は省略できる。

# rbd -c ceph.conf [command ...]
# rbd -m monaddress:port [command ...] 

以下では省略可能として説明する。

3.2 RBD イメージの作成

まず RBD イメージを作成してみる。 これには rbd create を実行する。 myimage が rbd イメージの名前となる。 --size オプションは作成する rbd イメージのサイズをメガバイト単位で指定する。 create コマンドに --size オプションは必須である。

create コマンドによる rbd イメージの作成はイメージの実体を作成しないため作成サイズによらず一瞬で作成される。 いわゆる thin-provisioning される。

Rbd イメージは rados の容量が許す限り幾つでも作成できるが、thin-provisioning のため稼働中にディスクが消費される点に注意が必要である。

つまり rbd イメージを作成時に --size で与えたイメージサイズの合計よりも rados の実ディスクサイズの方が大きくなることあり、この場合異常動作を起こすことになる(Ceph ファイルシステムは ENOSPACE のエラーとなったが、RBD はブロックデバイスなので容量不足を示す適切な方法がない)。

悲しいことに ceph には rbd イメージが消費しているディスク容量を返す方法がない。

下の例は 10240MB の myimage を作成したことになる。

# rbd create --size 10240 myimage

またイメージの基となるデータファイルがある場合、それを新しい rbd イメージとして取り込むこともできる。 これには import コマンドを使う。 下の例は /tmp/data.dumpyourimage という名前の rbd イメージとして取り込む場合である。

# rbd import /tmp/data.dump yourimage

3.3 RBD イメージの確認

Rados の中にどのような rbd イメージがあるかは ls コマンドで確認できる。

# rbd ls
myimage
yourimage

rbd イメージの詳細を表示するには info コマンドを用いる。

# rbd info myimage
rbd info myimage
rbd image 'myimage':
        size 10240 MB in 2560 objects
        order 22 (4096 KB objects)
        block_name_prefix: rb.0.0
        parent:  (pool -1)

3.4 RBD イメージの出力

import コマンドとは反対に、既存の rbd イメージをファイルとして書き出すこともできる。 これには export コマンドを用いる。

# rbd export myimage /tmp/output.dump

3.5 RBD イメージの削除・コピー・移動

rbd イメージを削除するには rm コマンドを用いる。 削除にはやや時間がかかる。

# rbd rm myimage

cp コマンドは、既存の rbd イメージの内容をコピーした別名の rbd イメージを作成できる。 この cp コマンドはコピー元の内容を完全にコピーするので時間がかかる。

このコマンドはいわゆる copy-on-write ではないので注意すること。 コピーをするとコピー元 rbd イメージと同じディスク消費が起きる。

# rbd cp src-image dest-image

mv コマンドは、既存の rbd イメージの名前を別の rbd イメージとする。

# rbd mv src-image dest-image

4. クライアントへの RBD のマップ

4.1 秘密キーファイルの作成

RBD をクライアントにマウントする場合に、mon デーモンとの認証が必要になる。 この際に必要となる秘密キーの入ったファイルを作成する。

mon デーモンが動いているファイルで以下を実行し、作成できた /tmp/secretfile をクライアントマシンにコピーしておく。

# ceph-authtool --name=client.admin --print-key /etc/ceph/keyring.bin > /tmp/secretfile

/tmp/secretfile の中身は AQBhOCFPqOvhKhAAJzgEku+csT9fpUkmlBnWGw== のような感じのパスワードが入っている。

4.2 クライアントへのマップ

RBD イメージをマウントするクライアントマシンは rbd カーネルモジュールがインストールされている必要がある。 まず modprobe を使って rbd カーネルモジュールをロードする。

# modprobe rbd

最後に -c または -m で mon デーモンの位置を指定した上で、rbd イメージをマップする。4.1 で指定した秘密キーファイルも指定する。

以下は myimage という名前の rbd イメージをマップしたところ。

# rbd -c /etc/ceph/ceph.conf map myimage --user admin --secret /tmp/secretfile
# rbd -m 10.0.0.1 map myimage --user admin --secret /tmp/secretfile

map コマンドが成功するとローカルマシンの /dev/rbdN に rbd イメージがデバイスとしてマップされている。 複数の rbd イメージをマップすると /dev/rbd0/dev/rbd1 のように番号が増えてゆく。 対応関係を確認したい場合には showmapped コマンドを使用する。

# rbd showmapped
id      pool    image   snap    device
0       rbd     myimage -       /dev/rbd0

これでマップ成功である。

# mkfs.ext4 /dev/rbd0
# mkdir /mnt/rbd0
# mount -t ext4 /dev/rbd0 /mnt/rbd0

4.3 クライアントからのアンマップ

unmap コマンドを使用することで、rbd イメージのマップを解除できる。

# rbd unmap /dev/rbd0

5. スナップショット操作

Rbd イメージは個別に複数のスナップショットを作成することができる。 スナップショット機能を使うと以下のように便利な機能が使える。

ただし以下のような注意事項が存在する。

スナップショットを作成するには以下の snap create コマンドを実行する。 --snap オプションの後にスナップショット名を指定すること。

# rbd snap create --snap snap-name image-name

snap ls コマンドを使うと、rbd イメージに現在作成済みのスナップショットの一覧が得られる。

# rbd snap ls image-name

snap rollback コマンドでスナップショットを巻き戻すことができる。

# rbd snap rollback --snap snap-name image-name

snap rm コマンドで、rbd イメージについている特定のスナップショットを削除できる。

# rbd snap rm --snap snap-name image-name

snap purge コマンドを使うと、rbd イメージについている全てのスナップショットをまとめて削除できる。

# rbd snap purge image-name

6. 別プールを使う

RAODS の概略で説明したように ceph は pool というオブジェクトの集合を定義している。 デフォルトで 0(data)、1(metadata)、2(rbd) の 3 つの pool が定義されており、RBD は 2(rbd) の pool を暗黙のうちに使っていた。

「RADOS を使ってみる」で説明したように Rados はユーザ定義の pool を作成できる。 この独自 pool から RBD を切り出すことが可能だ。

独自の pool は CRUSH マップを独自に持つことができるので、pool 毎に使用する OSD のグループやレプリカ数を変更することができるというメリットがある。

新しい pool を作成するには rados コマンドの mkpool コマンドを用いる。

# rados mkpool mypool

RBD 操作を行う時に rbd コマンドに -p オプションを与えて操作対象の pool を指定する。

# rbd create -p mypool --size 10240 myimage

ただし rbd イメージをマップする場合には、プール名とイメージ名を / でつなげた名前で指定する。

# rbd -c /etc/ceph/ceph.conf map mypool/myimage --user admin --secret /tmp/secretfile

別プールで RBD を使うデメリットとして 5章 で述べた rbd イメージのスナップショット機能が利用できない点に注意が必要である。

コメント

トラックバック   [Trackback URL: http://www.nminoru.jp/cgi-bin/tb.cgi/unix__ceph__how-to-use-rbd]
コメントを書き込む

TOP    掲示板    戻る
Written by NAKAMURA Minoru, Email: nminoru atmark nminoru dot jp, Twitter:@nminoru_jp