Gentoo で Ceph れ!

きっかけ

皆さんは Piston OpenStack をご存知ですか?先日 Piston OpenStack の話を耳にし、ストレージまわりは Ceph で冗長構成とすることで、ノードが1つ死んでもデータはもとよりコンポーネントも冗長化されているらしいです。 で、やはりそんなことを聴くと自分でも同じようなことできないかとても興味が湧いてくるんですが、Piston Cloud Computing 社とは違ってこちとら一介の「クラウド作業者」ですので、おいそれとそんな夢のような構成は作れ ません。 なので、できることからコツコツと…ということで Gentoo で Ceph を使ってみたメモです。

参考情報

以下のサイトの情報を参考にしました。

ちなみに参考にした上記のサイトには Ceph + OpenStack な話がたくさん出てきますが、私のこの日記では OpenStack には一切觝れませんので、ごめんなさい。

構成

今回は以下の構成に構築します。

+–––––––––––––––––––––+      +–––––––––––––––––––––+      +–––––––––––––––––––––+      +–––––––––––––––––––––+
|                     |      |                     |      |                     |      |                     |
| host: aug           |      | host: berlin        |      | host: calvary-r     |      | host: devoncha      |
| IP: 192.1 8.136.105 |      | IP: 192.168.136.106 |      | IP: 192.168.136.107 |      | IP: 192.168.136.108 |
|                     |      |                     |      |                     |      |                     |
| +––––––+   +––––––+ |      | +––––––+   +––––––+ |      | +––––––+   +––––––+ |      | +––––––+   +––––––+ |
| |      |   |      | +––––––+ |      |   |      | +––––––+ |      |   |      | +––––––+ |      |   |      | |
| | sda4 |   | sdb1 | |      | | sda4 |   | sdb1 | |      | | sda4 |   | sdb1 | |      | | sda4 |   | sdb1 | |
| |      |   |      | |      | |      |   |      | |      | |      |   |      | |      | |      |   |      | |
| +––––––+   +––––––+ |      | +––––––+   +––––––+ |      | +––––––+   +––––––+ |      | +––––––+   +––––––+ |
|                     |      |                     |      |                     |      |                     |
+–––––––––––––––––––––+      +–––––––––––––––––––––+      +–––––––––––––––––––––+      +–––––––––––––––––––––+

それぞれのホストで osd, mds, mon を動かす構成にします

ちなみにこんな構成で問題ないのかどうかは Ceph の素人なので、さっぱりわかりません σ^^;

他の人のドキュメントや公式のドキュメントだと上記以外に Ceph コマンドを叩くホストを別途用意している構成 が多いんですが、面倒^H^H今回は1台目のホスト auge で叩くことにします。

インストール

環境によって USE フラグを適宜設定する必要があるとは思いますが、私は各ホストで以下のように実行して関連パッケージおよび Ceph のインストールを行ないました。

# USE="gpm" emerge autoconf-wrapper hdparm boost-build libunwind keyutils \
> google-perftools dev-libs/fcgi app-arch/snappy boost leveldb libedit \
> autoconf nspr nss chardet simplejson markupsafe requests jinja werkzeug \
> btrfs-progs

# ACCEPT_KEYWORDS=~amd64 emerge -k ceph

構築時、Gentoo での Ceph パッケージのステーブル版はバージョン 0.56 だったのですが、折角なのでもうちょっと上のバージョンがいいなぁと漠然2と思い、バージョン 0.72 をインストールしました。

以上でインストールは完了です。Gentoo だから簡単♪

環境の設定

以下を実施します。(手順は手抜き^H^H^H割愛します)

  • 各ホストの時刻を ntp とかで同期させます。
  • /etc/hosts に記述するか DNS に登録するかして名前解決できるようにします。
  • パスワード入力するの面倒なので各ホストにパスフレーズなしで ssh ログインできるようします。

Ceph の設定

ceph.conf の作成

まず最初に以下の内容で /etc/ceph/ceph.conf を作成します。

[global]
        auth cluster required = cephx
        auth service required = cephx
        auth client required = cephx

[osd]
        osd journal size = 1000

[mon.a]
        host = auge
        mon addr = 192.168.136.105:6789

[mon.b]
        host = berlin
        mon addr = 192.168.136.106:6789

[mon.c]
        host = calvary-r
        mon addr = 192.168.136.107:6789

[mon.d]
        host = devoncha
        mon addr = 192.168.136.108:6789

[osd.0]
        host = auge
        btrfs devs = /dev/sda4

[osd.1]
        host = auge
        btrfs devs = /dev/sdb1

[osd.2]
        host = berlin
        btrfs devs = /dev/sda4

[osd.3]
        host = berlin
        btrfs devs = /dev/sdb1

[osd.4]
        host = calvary-r
        btrfs devs = /dev/sda4

[osd.5]
        host = calvary-r
        btrfs devs = /dev/sdb1

[osd.6]
        host = devoncha
        btrfs devs = /dev/sda4

[osd.7]
        host = devoncha
        btrfs devs = /dev/sdb1

[mds.a]
        host = auge

[mds.b]
        host = berlin

[mds.c]
        host = calvary-r

[mds.d]
        host = devoncha

ちなみに Ceph のドキュメントを見ると推奨は XFS だそうです。今回はノリで btrfs にしました。

管理データ3の格納ディレクトリの作成

次に各ホストで Ceph の管理データを格納するためのディレクトリを掘ります。もしかするとバージョンによって は勝手に掘ってくれるのかも。

auge ~ # mkdir -p /var/lib/ceph/osd/ceph-{0,1}
auge ~ # mkdir -p /var/lib/ceph/{mds,mon}/ceph-a

berlin ~ # mkdir -p /var/lib/ceph/osd/ceph-{2,3}
berlin ~ # mkdir -p /var/lib/ceph/{mds,mon}/ceph-b

calvary-r ~ # mkdir -p /var/lib/ceph/osd/ceph-{4,5}
calvary-r ~ # mkdir -p /var/lib/ceph/{mds,mon}/ceph-c

devoncha ~ # mkdir -p /var/lib/ceph/osd/ceph-{6,7}
devoncha ~ # mkdir -p /var/lib/ceph/{mds,mon}/ceph-d

Ceph ファイルシステムの作成

ホスト auge で以下を実行します。

auge ~ # cd /etc/ceph/
auge ~ # mkcephfs -a -c /etc/ceph/ceph.conf -k ceph.keyring --mkbtrfs

Ceph の起動

各ホストにて以下を実行して Ceph を起動します。

# /etc/init.d/ceph start

が、あれ?以下のようになってしまい、何故なのか原因は追ってませんが、mon と mds は起動しますが、osd が起動しません。さて困った。

calvary-r ~ # /etc/init.d/ceph start
 * Initializing local Ceph node ...
=== mon.c ===
Starting Ceph mon.c on calvary-r...
Starting ceph-create-keys on calvary-r...
=== mds.c ===
Starting Ceph mds.c on calvary-r...
starting mds.c at :/0
=== osd.4 ===
Mounting Btrfs on calvary-r:/var/lib/ceph/osd/ceph-4
Scanning for Btrfs filesystems
Error ENOENT: osd.4 does not exist.  create it before updating the crush map
failed: 'timeout 10 /usr/bin/ceph                       --name=osd.4                    --keyring=/var/lib/ceph/osd/ceph-4/keyring                      osd crush create-or-move                       --                      4                       0.12                    root=default                    host=calvary-r
                        '                                                                                                                                [ ok ]

calvary-r ~ # ps x | grep [c]eph
25610 pts/0    Sl     0:00 /usr/bin/ceph-mon -i c --pid-file /var/run/ceph/mon.c.pid -c /etc/ceph/ceph.conf
25737 ?        Ssl    0:00 /usr/bin/ceph-mds -i c --pid-file /var/run/ceph/mds.c.pid -c /etc/ceph/ceph.conf

ということで、正しい対処方法は不明ですが、今回は以下を実行して乗り切ります。

まず手動で osd を起動します。

# ceph-osd -i 4 -c /etc/ceph/ceph.conf
# ceph-osd -i 5 -c /etc/ceph/ceph.conf

-i の後ろの数字、4とか5とかはそのホストで動かす予定だった osd.N の N の部分の数字です。

そして、osd が起動したかどうかを確認します。

calvary-r ~ # ps x | grep [o]sd
25977 ?        Ssl    0:04 ceph-osd -i 4 -c /etc/ceph/ceph.conf
25985 ?        Ssl    0:05 ceph-osd -i 5 -c /etc/ceph/ceph.conf

起動したのを確認したら、以下を実行します。-9 の後ろの数字は↑で表示させた各 osd のプロセス ID です。

calvary-r ~ # kill -9 25977 25985

そうしたら、Ceph の各サービスを再起動させます。

calvary-r ~ # /etc/init.d/ceph restart
 * Stopping local Ceph node ...
=== osd.5 ===
Stopping Ceph osd.5 on calvary-r...done
=== osd.4 ===
Stopping Ceph osd.4 on calvary-r...done
=== mds.c ===
Stopping Ceph mds.c on calvary-r...kill 25737...done
=== mon.c ===
Stopping Ceph mon.c on calvary-r...kill 25610...done                                                                                                     [ ok ]
 * Initializing local Ceph node ...
=== mon.c ===
Starting Ceph mon.c on calvary-r...
Starting ceph-create-keys on calvary-r...
=== mds.c ===
Starting Ceph mds.c on calvary-r...
starting mds.c at :/0
=== osd.4 ===
Mounting Btrfs on calvary-r:/var/lib/ceph/osd/ceph-4
Scanning for Btrfs filesystems
create-or-move updated item name 'osd.4' weight 0.12 at location {host=calvary-r,root=default} to crush map
Starting Ceph osd.4 on calvary-r...
starting osd.4 at :/0 osd_data /var/lib/ceph/osd/ceph-4 /var/lib/ceph/osd/ceph-4/journal
=== osd.5 ===
Mounting Btrfs on calvary-r:/var/lib/ceph/osd/ceph-5
Scanning for Btrfs filesystems
create-or-move updated item name 'osd.5' weight 0.45 at location {host=calvary-r,root=default} to crush map
Starting Ceph osd.5 on calvary-r...
starting osd.5 at :/0 osd_data /var/lib/ceph/osd/ceph-5 /var/lib/ceph/osd/ceph-5/journal                                                                 [ ok ]

Ceph が mon, mfs, ceph それぞれちゃんと起動しているかを確認します。

calvary-r ~ # ps x | grep [c]eph
26729 pts/0    Sl     0:00 /usr/bin/ceph-mon -i c --pid-file /var/run/ceph/mon.c.pid -c /etc/ceph/ceph.conf
26857 ?        Ssl    0:00 /usr/bin/ceph-mds -i c --pid-file /var/run/ceph/mds.c.pid -c /etc/ceph/ceph.conf
27107 ?        Ssl    0:03 /usr/bin/ceph-osd -i 4 --pid-file /var/run/ceph/osd.4.pid -c /etc/ceph/ceph.conf
27265 ?        Ssl    0:11 /usr/bin/ceph-osd -i 5 --pid-file /var/run/ceph/osd.5.pid -c /etc/ceph/ceph.conf

はい、問題ないですね。構築は以上で完了です。簡単でしたね、さすが Gentoo です。

ちょっぴり使ってみる

無事に構築が完了したので、試しに使ってみます。

まず最初に ブロックデバイスとして領域を 500GB ほど切り出します。

auge ~ # rbd create walrus --size $(( 500 * 1024 ))

切り出したブロックデバイスを利用するために、rbd のモジュールがロードされているかを確認し、されていなけ ればロードします。

auge ~ # lsmod |grep rbd
auge ~ # modprobe rbd
auge ~ # lsmod |grep rbd
rbd                    36500  0
libceph                98325  1 rbd

次にカーネルモジュールを利用してブロックデバイスとして認識させて{{fn ‘っていう表現でいいのかな?’}}、ファイルシステムを作成します。

auge ~ # rbd map walrus --pool rbd --name client.admin
auge ~ # mkfs.reiserfs /dev/rbd/rbd/walrus

あとはおもむろにマウントすればすぐに利用可能です。

auge ~ # mount /dev/rbd/rbd/walrus /var/lib/eucalyptus/bukkits/
auge ~ # df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs           20G   17G  3.8G  82% /
udev             10M  4.0K   10M   1% /dev
/dev/sda2        20G   17G  3.8G  82% /
tmpfs           377M  4.3M  373M   2% /run
shm             1.9G     0  1.9G   0% /dev/shm
cgroup_root      10M     0   10M   0% /sys/fs/cgroup
/dev/sda4       121G  3.7G  115G   4% /var/lib/ceph/osd/ceph-0
/dev/sdb1       466G  3.3G  461G   1% /var/lib/ceph/osd/ceph-1
/dev/rbd1       500G   33M  500G   1% /var/lib/eucalyptus/bukkits

ということで、@jedipunkz さんに色々教えてもらいながら、何とか Gentoo で Ceph を使ってみました。


  1. 最終的には @jedipunkz さんに手取り足取り教えてもらいました σ^^; @jedipunkz さんありがとうございます [return]
  2. 根拠は何もないです [return]
  3. 「管理データ」っていう表現でいいのかな? [return]