Edited at

Ceph(Mimic)を構築してSambaとかで使ってみる

この記事は高知工科大 Advent Calendar 2018の7日目の記事です。


概要

Ceph(v13.2.2 Mimic)を構築して試してみる。


Cephとは?

OSSな分散ストレージです。SPOFを無くすよう作られています。CpehはRADOSGW, RADOSBlockDevice (RBD), CephFSの3つの使い方があります。簡単に書くとRADOSGWSはObjectStorageで、「Amazon S3」「OpenStackのSwift」と互換性があります。RBDはVMなどにブロック単位でのアクセスを提供します。CephFSはPOSIX互換の分散ファイルシステムを提供します。

Cephクラスタは主にMonitor, Managers, MDS, OSDで構成されます。

MonitorはCRUSHマップなどのクラスターの状態の維持、クライアントの認証などを行います。

Managerはストレージの利用率やシステム負荷などを監視し、Webブラウザで開けるダッシュボードを提供します。

MDSはメタデータサーバで、CephFSを使うために必要です。

OSDはDiskのことです。Disk1台ごとに1つのOSDプロセスが必要です。

詳しくは公式を読むことをお勧めします。


環境

家で余っていた以下の機材で検証します。OSはUbuntu18.04LTSです。

推奨環境は公式に記載されています。

今回は2つのNW用意します。外部からCephを利用する場合はPublicNetwork。Ceph内でのレプリケートなどの内部トラフィック用のClusterNetworkです。分けなくてもクラスタは組めますが分けることが推奨です。

Hostname
PublicIP
ClusterIP
CPU
Memory
HDD

ubuntu-ceph01
192.0.2.1
198.51.100.1
XeonE3-1240v3
24GB
2TB 2TB

ubuntu-ceph02
192.0.2.2
198.51.100.2
XeonE3-1230v5
16GB
2TB 2TB

ubuntu-ceph03
192.0.2.3
198.51.100.3
XeonE3-1220v3
24GB
300GB 300GB


構築

ceph-deployを用いた方法で構築します。ceph-deployはパスなしsudoをSSH経由で行い、各ノードを設定していきます。ですので、各ノードに以下の設定をします。


デプロイ用ユーザの作成

Cephを各ノードにデプロイするためのユーザを作ります。ここで「ceph」という名前を使わないでください。

今回は「cephadmin」という名前にします。また各ノードにssh-copy-idなどで同じ公開鍵を入れ、/etc/hostnameと同じ名前でSSH出来るようにしておきます。

sudo useradd -d /home/cephadmin -m cephadmin

sudo passwd cephadmin

パスなしSudoが通るようにします。

echo "cephadmin ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephadmin

sudo chmod 0440 /etc/sudoers.d/cephadmin


ceph-deployのインストール

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -

echo deb https://download.ceph.com/debian-mimic/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt update
sudo apt install ceph-deploy


作業ディレクトリの作成

mkdir ceph-test

cd ceph-test


最初のMonitorノード投入

ceph-deploy --username cephadmin

ceph-deploy --username cephadmin new ubuntu-ceph01


ceph.confに設定を追記

今のディレクトリにceph.confというファイルが出来るのでNWの設定を追記します


ceph.conf

public network = 192.0.2.0/24

cluster network = 192.51.100.0/24


各ノードへCephのインストール

python-minimalをインストールしていないと失敗したので、入れておきます。

sudo apt install python-minimal

ceph-deploy --username cephadmin install ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03


Monitorを初期化し、設定ファイルとKeyを各ノードに分配します。

ceph-deploy --username cephadmin mon create-initial

ceph-deploy --username cephadmin admin ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03


最初のManager投入

最初のManagerノードを投入します。

ceph-deploy --username cephadmin mgr create ubuntu-ceph01


OSDの投入

Cephで使うDiskをOSDとして投入していきます。zapコマンドはDiskをOSDとして使えるように初期化します。意図しないDiskを選択しないように注意。

ceph-deploy --username cephadmin disk zap ubuntu-ceph01 /dev/sdb

ceph-deploy --username cephadmin osd create --data /dev/sdb ubuntu-ceph01
ceph-deploy --username cephadmin disk zap ubuntu-ceph01 /dev/sdc
ceph-deploy --username cephadmin osd create --data /dev/sdc ubuntu-ceph01

ceph-deploy --username cephadmin disk zap ubuntu-ceph02 /dev/sdb
ceph-deploy --username cephadmin osd create --data /dev/sdb ubuntu-ceph02
ceph-deploy --username cephadmin disk zap ubuntu-ceph02 /dev/sdc
ceph-deploy --username cephadmin osd create --data /dev/sdc ubuntu-ceph02

ceph-deploy --username cephadmin disk zap ubuntu-ceph03 /dev/sdb
ceph-deploy --username cephadmin osd create --data /dev/sdb ubuntu-ceph03
ceph-deploy --username cephadmin disk zap ubuntu-ceph03 /dev/sdc
ceph-deploy --username cephadmin osd create --data /dev/sdc ubuntu-ceph03


構築確認

これで最低限のクラスタができたので確認します。

sudo ceph health

HEALTH_OKが出れば構築できています。


次にノードに追加機能やダッシュボードを導入します


Monitorノードの追加

今回はノード数が3なので、全部Monitorにします。

ceph-deploy --username cephadmin mon add ubuntu-ceph02

ceph-deploy --username cephadmin mon add ubuntu-ceph03


Managerノードの追加

ManagerノードはActiveStanby方式で動作します。Activeなノードが停止した場合に他のノードが引き継ぎます。

Monitor同様、今回は全ノード投入します。

ceph-deploy --username cephadmin mgr create ubuntu-ceph02 ubuntu-ceph03


MDS投入

CephFSが使うMetaDataServerを構築します。CephFSを使わない場合は不要です。

ceph-deploy --username cephadmin mds create ubuntu-ceph01


ObjectGatewayを投入

今回はubuntu-ceph02に投入します。

ceph-deploy --username cephadmin rgw create ubuntu-ceph02


Cephダッシュボードの導入

sudo apt install python-routes

sudo ceph mgr module enable dashboard
sudo ceph dashboard create-self-signed-cert

sudo ceph mgr module disable dashboard
sudo ceph mgr module enable dashboard

sudo ceph dashboard set-login-credentials <username> <password>


ダッシュボードがCephへのアクセスで使うアカウントを作成

sudo radosgw-admin user create --uid=<username> --display-name=<displayname> --system

実行すると作成したUserの認証情報がでるので、"access_key""secret_key"を次の設定で入れます。


Cephダッシュボードが使うアカウントを登録

sudo ceph dashboard set-rgw-api-access-key <access_key>

sudo ceph dashboard set-rgw-api-secret-key <secret_key>

ここまで終了するとCephダッシュボードが使えるようになり、https://192.0.2.1:8443 にブラウザでアクセスして先ほど設定したset-login-credentialsのユーザ名とパスワードを入力すると以下のような管理画面を開くことができます。

cephd.JPG


Cephを使う


ObjectStorage

今回はubuntu-ceph02にObjectGatewayを構築したのでhttp://192.0.2.2:7480 を開くと以下のような画面が出ると思います。出ていれば構築は出来ていると思います。

cephob.JPG

あとはダッシュボードなどでユーザとバケット作成して使うだけです。以下のPythonコードでUploadと一覧を取得する簡単なテストを行いました。バケット名はtest-bucketです。


upload.py

import boto3

access_key = 'access_key'
secret_key = 'secret_key'

client = boto3.client(
service_name = 's3',
aws_access_key_id = access_key,
aws_secret_access_key = secret_key,
use_ssl = False,
endpoint_url = 'http://192.0.2.2:7480',
)

filename = 'test.txt'
bucket_name = 'test-bucket'
object_key = 'test.txt'

client.upload_file(filename, bucket_name, object_key)



get.py

import boto3

access_key = 'access_key'
secret_key = 'secret_key'

client = boto3.resource(
service_name = 's3',
aws_access_key_id = access_key,
aws_secret_access_key = secret_key,
use_ssl = False,
endpoint_url = 'http://192.0.2.2:7480',
)

bucket_name = 'test-bucket'
Bucket_data = client.Bucket(bucket_name)

keys = [obj.key for obj in Bucket_data.objects.all()]
print(keys)



実行結果例

['test.txt', 'test2.txt']



Samba4で共有フォルダを作成

Samba4にはvfs_cephというモジュールを用いてNASのような形でCephにアクセスできます。

今回はubuntu-ceph01経由で公開します。

まず共有フォルダ用のプールを作成します。

sudo ceph osd pool create cephfs_data 64

sudo ceph osd pool create cephfs_metadata 64

今回はcephfs01という名前として、先ほど作ったプールを割り当てます。

sudo ceph fs new cephfs01 cephfs_metadata cephfs_data

Sambaの設定。Sambaのユーザ認証や共有フォルダの設定は出来ているものとして、以下のようにsmb.confを編集します。

/etc/samba/smb.conf に以下を追記


smb.conf

[sharename]

path = /
vfs objects = ceph
ceph:config_file = /etc/ceph/ceph.conf
read only = no
oplocks = no
kernel share modes = no


Sambaを再起動。これでCephベースの共有フォルダが使用できます。

sudo systemctl restart smbd

Windowsでマウントすればこんな感じ。容量が600GB弱なのはubuntu-ceph03の容量に合わせているから。

cephs.JPG

ただこの状態だとubuntu-ceph01がSPOFなので、CTDBなどでSambaもクラスタ化すると良さそうです。(まだ試してないです)


その他

Cephを消す方法とCRUSHマップの編集方法


失敗したとき

何か失敗してリセットしたいときは、以下のコマンドを投入してCephを削除できます。

また私の環境では、OSDとして使ったDiskにLVM?の構成が残っていたので、もう一度使うにはそれを手動で削除する必要がありました。

ceph-deploy --username cephadmin purge ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03

ceph-deploy --username cephadmin purgedata ubuntu-ceph01 ubuntu-ceph02 ubuntu-ceph03
ceph-deploy --username cephadmin forgetkeys
rm ceph.*


CRUSHマップの編集

今回は各ノードの容量が4TB, 4TB, 600GBと偏ってるのでデフォルトのレプリケート数3を満たせません。(初期のCRUSHマップは各OSDの容量から重みが決定されているため)

今回は検証用と割り切って、重みを全部同じにするため、CRUSHマップを編集しました。

sudo ceph osd getcrushmap -o <出力ファイル名>

crushtool -d <出力ファイル名> -o <デコード済み出力ファイル名>
vi <デコード済み出力ファイル名>
CRUSHマップを編集する
crushtool -c <デコード済み出力ファイル名> -o <コンパイル済み新CRUSHマップ>
sudo ceph osd setcrushmap -i <コンパイル済み新CRUSHマップ>


参考文献

Ceph 公式 https://ceph.com/

Ceph Documentation http://docs.ceph.com/docs/mimic/

Ceph (Mimic) を Ubuntu 18.04 に入れた時の構築メモ https://qiita.com/yakumo/items/a558e2266ee65b6d5aff

vfs_ceph http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/vfs_ceph.8.html