Gentoo で Ceph れ!
きっかけ
皆さんは Piston OpenStack をご存知ですか?先日 Piston OpenStack の話を耳にし、ストレージまわりは Ceph で冗長構成とすることで、ノードが1つ死んでもデータはもとよりコンポーネントも冗長化されているらしいです。 で、やはりそんなことを聴くと自分でも同じようなことできないかとても興味が湧いてくるんですが、Piston Cloud Computing 社とは違ってこちとら一介の「クラウド作業者」ですので、おいそれとそんな夢のような構成は作れ ません。 なので、できることからコツコツと…ということで Gentoo で Ceph を使ってみたメモです。
参考情報
以下のサイトの情報を参考にしました。
- @jedipunkz さんのブログ 1
- 本家のドキュメント「マニュアルインストールの方法」
- @nminoru_jp さんの「Ceph の覚え書きのインデックス」
- 外道父さんの「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 を使ってみました。