このページでは Ceph のストレージをブロックデバイスとして切り出す Rados Block Device(RBD) の使い方を説明する。
以下は関連ページ。
更新履歴
(2012.03.20) 作成。
目次
- 1. Rados Block Device (RBD) とは
- 2. セットアップ
- 3. 基本的な操作
- 4. クライアントへの RBD のマップ
- 5. スナップショット操作
- 6. 別プールを使う
- コメント
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.dump を yourimage という名前の 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 イメージは個別に複数のスナップショットを作成することができる。 スナップショット機能を使うと以下のように便利な機能が使える。
- ロールバック機能(rollback)で、過去にスナップショットを撮った位置まで巻き戻すことができる。
- スナップショット名を指定して rbd イメージを read-only でマップできる。
ただし以下のような注意事項が存在する。
- スナップショット操作を安全に行うには、対象となる rbd イメージがクライアントからマップされていない状態で行うこと。クライアントにマップされている rbd イメージに無理やりスナップショットを撮った場合、クライアント側のブロックデバイスに異常が発生する。
- いったんスナップショットを撮った rbd イメージは、スナップショットを削除するまで 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 イメージのスナップショット機能が利用できない点に注意が必要である。