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のユーザ名とパスワードを入力すると以下のような管理画面を開くことができます。

Cephを使う

ObjectStorage

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

あとはダッシュボードなどでユーザとバケット作成して使うだけです。以下の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の容量に合わせているから。

ただこの状態だと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