最近、仕事でS3互換のインターフェイスやブロックデバイスとして使える分散オブジェクトストレージ『Ceph』を使っているのだが、ある程度触れる環境が欲しいと思ったので家に構築することにした。
そもそも、Cephってどういうものなのか?という部分については、以下の資料が詳しいのでリンクを掲載しておく。

簡単に、自分の中でまとめてみると以下のような特徴がある。

  • ファイルを複数に分割しオブジェクトとして保持する
  • 最終的なファイルの置き場所はOSDという単位で管理されている(基本的には1ディスク(1ノード)で管理)
  • 分割されたファイル(以降、オブジェクト)は、Pool→Placement Groupの順に流れていく
  • 分割したオブジェクトは、PoolからPlacement Groupに送る
  • Placement Groupは、送信元のPoolに設定されているレプリケーション数(同期数。デフォルトでは3)に応じ、他のOSDにあるPlacement Groupへファイルを同期する
  • 複数のインターフェイスを持っている(S3互換のRadosGateway、ブロックデバイスとして利用可能なrbd、ファイル・システムであるCephFSなど)

…正直、この時点でだいぶお腹いっぱいな感じがある。
とりあえず、今回はこのCephをCentOS 7上にインストール、構築する事にする。

なお、Cephではクラスタとは別に管理用ノードを構築して、そこから一元管理するためのツール(ceph-deploy)が配布されているので、今回はこれを用いてインストールを進めていく。
※つまり、この手順ではCeph管理ノードとCephデータノード(クラスタを構成するノード)の2種類が登場する。

今回は、Cephデータノードをデフォルトの最小構成である3台、管理ノード1台の計4台を構築する。
なお、各ホストにはIPアドレスやホスト名などを適切に設定済であるとする。

なお、今回導入したバージョンはCeph 9.2.1となっている。

1.事前準備

Cephのインストール前に、事前にNTPの設定等を行っておく。
この項目の内容は、Ceph管理ノード

NTPの設定

Cephでは、クラスタの構成ノード間で0.05秒以上時刻に差異があるとヘルスチェックで警告が出るようになっているため、chronyをインストールしておく。

yum install -y chrony
systemctl enable chronyd
systemctl start chronyd

SELinux/Firewalldの無効化

SELinuxおよびFirewalldを無効化しておく。

setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld

ユーザ追加

Ceph管理ノードから接続するためのユーザを作成し、sudoersに設定をする。
なお、接続時は鍵認証で行うため、パスワードは後で削除する。

useradd ceph
passwd ceph
echo 'ceph ALL = (root) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/ceph
echo 'Defaults env_keep+="http_proxy"' | sudo tee -a /etc/sudoers.d/ceph
echo 'Defaults env_keep+="https_proxy"' | sudo tee -a /etc/sudoers.d/ceph
chmod 0440 /etc/sudoers.d/ceph
sed -i 's/Defaults.*requiretty/Defaults !requiretty/g' /etc/sudoers

hostsへの登録

各ノードのhostsに対し、それぞれのホスト名とIPアドレスを紐付けておく。

これで事前準備は完了となる。

2.Ceph管理ノードを構築する

さて、それではCeph管理ノードを構築していこう。
まず、Ceph管理ノードからcephユーザで各データノードにパスワード無しでssh接続できるよう、鍵認証設定を行う。
※念のため、作業後はcephユーザのパスワードを空にしておくと良いだろう。

su - ceph
ssh-keygen
ssh-copy-id ceph@Cephデータノード(IPアドレス)

sshの鍵認証設定ができたら、Ceph管理ノードから各データノードを管理するためのコマンドである「ceph-deploy」コマンドをインストールする。

sudo rpm -ivh https://ceph.com/rpm-hammer/el7/noarch/ceph-release-1-1.el7.noarch.rpm
sudo yum install -y ceph-deploy
sudo rpm -e ceph-release-1-1.el7.noarch

3.Cephクラスタの構築

さて、それではデータノードにCephをインストールして、Cephクラスタを構築していこう。
まずは、Ceph管理ノードで以下のコマンドを実行し各Cephで用いる設定ファイルを作成する。

ceph-deploy new データノード1...データノードN
[ceph@BS-PUB-CEPHADM ~]$ ceph-deploy new BS-PUB-CEPHNODE-01 BS-PUB-CEPHNODE-02 BS-PUB-CEPHNODE-03
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.31): /bin/ceph-deploy new BS-PUB-CEPHNODE-01 BS-PUB-CEPHNODE-02 BS-PUB-CEPHNODE-03
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  func                          : 
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : 
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  ssh_copykey                   : True
[ceph_deploy.cli][INFO  ]  mon                           : ['BS-PUB-CEPHNODE-01', 'BS-PUB-CEPHNODE-02', 'BS-PUB-CEPHNODE-03']
...略

コマンド実行後、カレントディレクトリ配下に設定ファイルが作成されている。
このファイルに対し、「[global]」配下へCephクラスタのネットワーク情報について追記をする。

echo "public_network = 172.2X.XXX.XXX/24" >> ./ceph.conf
echo "cluster_network = 172.2X.YYY.YYY/24" >> ./ceph.conf

設定ファイル追記後、以下のコマンドを実行し各ノードへCephのインストール、クラスタの構築をする。
※インストールでエラーが発生する場合、エラーが発生したノードだけを指定して再実行するか、手動で「yum install -y ceph ceph-radosgw」を実行する事。(yumでのインストールの際、リポジトリの問題なのか結構エラーが出るので注意…)

ceph-deploy install 管理ノード1 データノード1...データノードN
ceph-deploy mon create-initial
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.31): /bin/ceph-deploy install BS-PUB-CEPHADM BS-PUB-CEPHDATA-01 BS-PUB-CEPHDATA-02 BS-PUB-CEPHDATA-03
...以下略

これで、クラスタは構成された。
次に、実際にデータを補完するOSD(ceph-osd)を構築する。

OSDでは、journalというキャッシュディスクとデータを書き出すディスクの2種類存在する(なお、データを書き出すディスクはxfsなどを用いる)。
ジャーナルとデータを書き出すディスクは、パフォーマンスを考えると別々に構成した方が良いようだ。
今回はデータ保存先として、各データノードへ「/ceph」というディレクトリを作成し、そこに「/dev/sdb1(xfs)」を、ジャーナルに「/dev/vda」を使用する。

まず、各Cephデータノードで以下のコマンドを実行する。

sudo /mkdir -p /ceph
fdisk /dev/sdb
mkfs.xfs /dev/sdb1
mount /dev/sdb1 /ceph
sudo chown ceph:ceph /ceph
echo "/dev/sdb1 /ceph                    xfs    defaults        0 0" >> /etc/fstab

次に、Ceph管理ノードで以下のコマンドを実行し、OSDを構成する。
※各ノードごとに実行していく

ceph-deploy osd prepare データノード名:データの書き出しディレクトリ:ジャーナル用デバイス
ceph-deploy osd activate データノード名:データの書き出しディレクトリ:ジャーナル用デバイス

次に、Ceph管理ノードからモニタリングが行えるよう、各ノードへ認証鍵を配布する。
以下のコマンドをCeph管理ノードで実行する。

ceph-deploy admin 管理ノード1 データノード1...データノードN
[ceph@BS-PUB-CEPHADM ~]$ ceph-deploy admin BS-PUB-CEPHADM BS-PUB-CEPHNODE-01 BS-PUB-CEPHNODE-02 BS-PUB-CEPHNODE-03
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.31): /bin/ceph-deploy admin BS-PUB-CEPHADM BS-PUB-CEPHNODE-01 BS-PUB-CEPHNODE-02 BS-PUB-CEPHNODE-03
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : 
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  client                        : ['BS-PUB-CEPHADM', 'BS-PUB-CEPHNODE-01', 'BS-PUB-CEPHNODE-02', 'BS-PUB-CEPHNODE-03']
[ceph_deploy.cli][INFO  ]  func                          : 
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to BS-PUB-CEPHADM
[BS-PUB-CEPHADM][DEBUG ] connection detected need for sudo
[BS-PUB-CEPHADM][DEBUG ] connected to host: BS-PUB-CEPHADM
[BS-PUB-CEPHADM][DEBUG ] detect platform information from remote host
[BS-PUB-CEPHADM][DEBUG ] detect machine type
[BS-PUB-CEPHADM][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to BS-PUB-CEPHNODE-01
[BS-PUB-CEPHNODE-01][DEBUG ] connection detected need for sudo
[BS-PUB-CEPHNODE-01][DEBUG ] connected to host: BS-PUB-CEPHNODE-01
[BS-PUB-CEPHNODE-01][DEBUG ] detect platform information from remote host
[BS-PUB-CEPHNODE-01][DEBUG ] detect machine type
[BS-PUB-CEPHNODE-01][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to BS-PUB-CEPHNODE-02
[BS-PUB-CEPHNODE-02][DEBUG ] connection detected need for sudo
[BS-PUB-CEPHNODE-02][DEBUG ] connected to host: BS-PUB-CEPHNODE-02
[BS-PUB-CEPHNODE-02][DEBUG ] detect platform information from remote host
[BS-PUB-CEPHNODE-02][DEBUG ] detect machine type
[BS-PUB-CEPHNODE-02][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to BS-PUB-CEPHNODE-03
[BS-PUB-CEPHNODE-03][DEBUG ] connection detected need for sudo
[BS-PUB-CEPHNODE-03][DEBUG ] connected to host: BS-PUB-CEPHNODE-03
[BS-PUB-CEPHNODE-03][DEBUG ] detect platform information from remote host
[BS-PUB-CEPHNODE-03][DEBUG ] detect machine type
[BS-PUB-CEPHNODE-03][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf

次に、以下のコマンドを各ノードで実行し、認証鍵をcephユーザが読み込めるようにする。

sudo chmod +r /etc/ceph/ceph.client.admin.keyring

この状態で、Ceph管理ノードから「ceph health」コマンドを実行すると、Cephのステータスを取得することが出来る。

ceph health
ceph health detail # エラーが発生している場合、より詳細に確認出来る
[ceph@BS-PUB-CEPHADM ~]$ ceph health
HEALTH_OK
[ceph@BS-PUB-CEPHADM ~]$ ceph health detail
HEALTH_OK

これで、無事にCephのクラスタ構築が出来上がった。
次回は、S3互換で動作させられるCeph用のオブジェクトゲートウェイ、Rados Gatewayを導入する。