やっぱり改めて動かしたい分散ストレージ:Ceph
以前、当ブログではこんな記事を書きました。2018年にCeph Luminousをコンテナ基盤と連携させて「分散ストレージってなんだろう?」と言うのを学んでいたわけですが、当時は空き容量管理がままならなくなり全てを撤廃したという苦い思い出がありました。
その後、色々勉強していく過程でもう少し細かいところを掘り下げたいなーというか、分からないままになっていたところを少しだけでも解決できないか?と言うところを見たくて、再度Cephクラスタを組んでみることにしました。
バージョンは13.2.8ということで、Luminousの後継になるMimicを選ぶことにしました。 Nautilus と言うのが実は最新なのですが、バージョン制御が意外と難しいので成り行きでMimicにする事になりました。
Ceph構築の手順
では、備忘録としてCeph構築の手順を書いていきます。構築後にあとからコンソールログとHistoryデータをベースに組んでいますので、内容に不正確なところがあると思います。何卒ご容赦を。
構築の前提
今回構成するのは以下のような非常にベーシックな構成です。

今回紹介する手順としては、この中のRBDを構成してLibraと言うサーバにそのデバイスを見せるところまでを対象としています。
下準備
まずは以下の手順をCephコンポーネントを導入する対象のサーバ全てに対して実施します。rootユーザで基本的に実行した方が良いでしょう。
■ceph-deploy用ユーザの作成
useradd ceph
passwd ceph
■sudo実行時のノーパスワード昇格を許可
sudo su -
echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
sed -i s'/Defaults requiretty/#Defaults requiretty'/g /etc/sudoers
chmod 0440 /etc/sudoers.d/ceph
続いて、今度はbootstrap的な役割を持つサーバ上でSSHキーの作成とコピーを行います。今回は1号機(eins)で行っています。これはCephユーザで実施します。
■SSHキーの作成と登録
ssh-keygen
ssh-copy-id ceph@eins
ssh-copy-id ceph@zwei
ssh-copy-id ceph@drei
ssh-copy-id ceph@vier
続いて、1号機側で必要となる従属パッケージを導入していきます。不思議なことに、1号機以外の導入に関しては、Ceph-Deployの手によって必要となるものが全てインストールされるようになっています。
■必要となるものの追加
yum install yum-plugin-priorities
yum -y install epel-release
yum install ceph-deploy
■Python2.xを使用する
sudo yum -y install python2-pip
sudo yum install python-setuptools
sudo pip install apipkg
sudo pip install --upgrade pip
コンポーネントのインストール・初期化
クラスタ構成用ディレクトリを作成し、基本的にはその中で全ての作業を実施します。その後、ceph-deployコマンドで1号機を起点に作業するためのコマンドを実行します。
すると、必要となるceph.confやその他アクセス時に必要とするkeyringが準備されます。ceph.confを設定し、必要最低限の機能を実装します。当方が導入した設定としては、
- 初期段階のmonノードを指定する
- パブリックネットワークの明示的な指定
- クラスタネットワークの明示的な指定
■クラスタ構成用ディレクトリの作成
mkdir deploy-cluster
cd deploy-cluster
■ceph-deployの準備
ceph-deploy new eins
vi ceph.conf
-----
[global]
fsid = 817a315d-ffe2-4856-b5eb-e5d0904df2b7
mon_initial_members = eins, zwei
mon_host = 192.168.100.111,192.168.100.112
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.100.0/24
cluster network = 192.168.110.0/24
-----
この設定を実施後に順次Cephのインストールを実施していきます。
■Cephコンポーネントのインストール(1号機-4号機)
ceph-deploy install eins zwei drei vier
■各種コンポーネントのイニシャライズ(管理系)
ceph-deploy mon create-initial
ceph-deploy admin eins zwei drei
ceph-deploy mgr create eins
■初期OSDの追加
ceph-deploy osd create --data /dev/sdb eins
ceph-deploy osd create --data /dev/sdb zwei
ceph-deploy osd create --data /dev/sdb drei
ceph-deploy osd create --data /dev/sdb vier
プールの作成
これでストレージの原型としてはできあがった状態になりますので、次はプールと呼ばれるストレージの大枠を構成します。
■プールの作成
sudo ceph osd pool create Dev-Ceph-Pool1 64 64
■対象プールに対するアプリケーション用途を指定する
sudo ceph osd pool application enable Dev-Ceph-Pool1 rbd
プールで指定するのは、名称・総PG数・ActiveなPG数(だったと思う)ですが、PG数の数字はイコールとする必要があるので、基本は名前とPG数の2つが設定要素になります。
PG=Placement Groupを指しますが、これは
- 多い=領域がきめ細かく管理される=CPU/メモリ負荷が高い
- 少ない=領域が大雑把に管理される=CPU/メモリ負荷が低い
ということで、適切な値を設定する必要があります。とは言え、よほど大規模でもない限りは200を超えない程度がちょうど良さそうです。当方では原則PG数64もしくは128で管理していることが多いです。
RBD(RADOS Block Device)の作成
ブロックデバイスを作成します。
■RBDデバイスの作成
sudo rbd create --size 100G Dev-Ceph-Pool1/rbd-dev-1 --image-feature layering
上記コマンドにて、指定のプールに「rbd-dev-1」というイメージファイルを作成します。本来は –image-feature と言うオプションは不要らしいのですが、これを入力してfeatureを明示的に宣言しないとエラーになるようです。このあたりはLuminous時代と余り変わってません。
作成されたイメージの詳細を rados コマンドにて確認してみます。
sudo rados info rbd-dev-1
-----
rbd image 'rbd-dev-1':
size 100 GiB in 25600 objects
order 22 (4 MiB objects)
id: 5e766b8b4567
block_name_prefix: rbd_data.5e766b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Feb 5 12:14:29 2020
-----
クライアントからの接続
それでは、クライアントとなってもらう Libra サーバから接続できるようにします。このとき、クライアントとしてCephコンポーネントのインストールが結局必要になります。(もちろんSSHキーのコピーなりSudoersの設定はお忘れ無く~)
ceph-deploy install libra.bluecore.net
その上で、以下のようにファイルを修正します。
■RBDMAPの作成
vi /etc/ceph/rbdmap
-----
Dev-Ceph-Pool1/rbd-dev-1 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
-----
これでサーバを再起動させると、/dev/rbd0と言うデバイスが接続されます。ここにmke2fsなりを実行するとファイルシステムフォーマットがなされ、ディスク領域として使用することが可能になります。
そして、 /etc/fstab 上には以下の通り設定します。
vi /etc/fstab
-----
/dev/rbd/Dev-Ceph-Pool1/rbd-dev-1 /ceph-data ext4 noauto 0 0
-----
これでmountさせると無事Cephのデータ領域をRBDとしてマウントすることが出来るようになります。
df -h
/dev/rbd0 99G 54G 45G 55% /ceph-data
領域の拡張
領域の拡張は
- ディスクを足す
- ノードを足す
の2種類で広げることが可能です。大前提として、ノードを増やす場合は全くの同一構成で増やす必要があると考えてください。これは、構成に不均衡が生じると、その際を埋めるためにCRUSHマップの比率変更が行われますが、Luminousの時もそうでしたが、かなーり性能上の負担がかかり、やがてうまく動作できなくなります。
ディスクを足す場合も、既存ノード間の容量不均衡を発生させないように気をつける必要があります。今回は200GBのVHDを /etc/sdc として追加する作業をしています。その上で、以下のコマンドによりceph-deploy コマンドを利用してOSDを追加します。
■OSDの追加
ceph-deploy osd create --data /dev/sdc eins
ceph-deploy osd create --data /dev/sdc zwei
ceph-deploy osd create --data /dev/sdc drei
ceph-deploy osd create --data /dev/sdc vier
そして、RBDを拡張します。
■RBDデバイスの拡張
sudo rbd resize --size 250G Dev-Ceph-Pool1/rbd-dev-1
最後に、クライアントアクセスしているサーバで file system の拡張を行います。
resize2fs /dev/rbd0
諸々確認
ヘルスステータスのチェックは以下のような感じで。
sudo ceph -s
-----
cluster:
id: 817a315d-ffe2-4856-b5eb-e5d0904df2b7
health: HEALTH_OK
services:
mon: 2 daemons, quorum eins,zwei
mgr: eins(active)
mds: dev-cephfs-1-1/1/1 up {0=vier=up:active}, 1 up:standby
osd: 8 osds: 8 up, 8 in
rgw: 1 daemon active
data:
pools: 8 pools, 288 pgs
objects: 14.18 k objects, 54 GiB
usage: 168 GiB used, 1024 GiB / 1.2 TiB avail
pgs: 288 active+clean
io:
client: 4.6 MiB/s wr, 0 op/s rd, 10 op/s wr
そんで、容量管理は以下のような感じに。
sudo ceph df
-----
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
1.2 TiB 1023 GiB 169 GiB 14.16
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
Dev-Ceph-Pool1 1 54 GiB 14.87 308 GiB 13950
Dev-Ceph-Pool2 2 0 B 0 308 GiB 0
.rgw.root 3 1.1 KiB 0 308 GiB 4
default.rgw.control 4 0 B 0 308 GiB 8
default.rgw.meta 5 379 B 0 308 GiB 2
default.rgw.log 6 0 B 0 308 GiB 207
Dev-Ceph-Pool3 7 19 KiB 0 308 GiB 22
Dev-Ceph-Pool4 8 0 B 0 308 GiB 1
-----
Comments are closed