CephFS MDSs
https://ceph.readthedocs.io/en/latest/start/intro/から
MDSs: A Ceph Metadata Server (MDS, ceph-mds) stores metadata on behalf of the Ceph File System (i.e., Ceph Block Devices and Ceph Object Storage do not use MDS).
Ceph Metadata Servers allow POSIX file system users to execute basic commands (like ls, find, etc.) without placing an enormous burden on the Ceph Storage Cluster.
(deepL先生訳)
データシート: Cephメタデータサーバ(MDS、ceph-mds)は、Cephファイルシステムに代わってメタデータを格納します(つまり、CephブロックデバイスとCephオブジェクトストレージはMDSを使用しません)。
Cephメタデータサーバにより、POSIXファイルシステムのユーザは、Cephストレージクラスタに大きな負担をかけることなく、基本的なコマンド(ls、findなど)を実行できます。
CephをPOSIXファイルシステムとして利用するなら必要な機能を提供します
っでそのMDSを構築します
参照先 https://docs.ceph.com/docs/master/install/manual-deployment/#adding-mds,https://docs.ceph.com/en/latest/cephfs/add-remove-mds/
まずCeph/OSDと同じようにCephFS Monitorノードから「ceph.conf」と管理者権限の「管理者キーリング」をmdsに持ってくる. 既にmonitorとして運用なら不要. 同じものをコピーするので
[root@ceph-mgr ~]# scp /etc/ceph/ceph.conf root@ceph-mds:/etc/ceph/ceph.conf
[root@ceph-mgr ~]# scp /etc/ceph/ceph.client.admin.keyring root@ceph-mds:/etc/ceph/ceph.client.admin.keyring
その後にmdsで下記のようにします.
[root@ceph-mds ~]# mkdir -p /var/lib/ceph/mds/ceph-ceph-mds
[root@ceph-mds ~]# ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-ceph-mds/keyring --gen-key -n mds.ceph-mds
[root@ceph-mds ~]# cat /var/lib/ceph/mds/ceph-ceph-mds/keyring
[mds.ceph-mds]
key = AQDCdJllGKBnCRAAbDjPeiHH3iJYpeLoqqkeSg==
[root@ceph-mds ~]# ceph auth add mds.ceph-mds osd "allow rwx" mds "allow *" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-ceph-mds/keyring
(確認)
[root@ceph-mds ~]# ceph auth get mds.ceph-mds
[mds.ceph-mds]
key = AQDCdJllGKBnCRAAbDjPeiHH3iJYpeLoqqkeSg==
caps mds = "allow *"
caps mon = "allow profile mds"
caps osd = "allow rwx"
[root@ceph-mds ~]# chown -R ceph:ceph /etc/ceph/ /var/lib/ceph/
これで事前設定は完了で、次にデーモンを起動させます.
「/usr/lib/systemd/system/ceph-mds@.service」の中身を見ると
:
ExecStart=/usr/bin/ceph-mds -f --cluster ${CLUSTER} --id %i --setuser ceph --setgroup ceph
:
とあるので、ここでも下記のようにして起動させます
[root@ceph-mds ~]# systemctl enable ceph-mds@ceph-mds.service
[root@ceph-mds ~]# systemctl start ceph-mds@ceph-mds.service
これでデーモンが稼働します.
Monitor側から確認してみると
[root@ceph-mgr ~]# ceph -s
cluster:
id: c2d06c20-9197-40b4-a8c4-1a0604936ce8
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph-mgr,ceph-mds,ceph-osd1 (age 4m)
mgr: ceph-mgr(active, since 22m)
osd: 3 osds: 3 up (since 81s), 3 in (since 92s)
data:
pools: 1 pools, 1 pgs
objects: 2 objects, 449 KiB
usage: 81 MiB used, 48 GiB / 48 GiB avail
pgs: 1 active+clean
[root@ceph-mgr ~]#
となる、一見するとmdsが動いていないように見えます. 以前のバージョンなら「mds: 1 up:standby」と表記されていたが、今のバージョンではないみたい
ファイルシステムを作成するとmdsの項目が表示されるようです
次にMDSができたのでファイルシステムを作る
ファイルシステムを作るには2種類のプール(metadata向けとdata向け)が必要になります. プールというのは「オブジェクトを保存するために使用される論理パーティション」
そのプールにはデータをいくつ持たせるのか(レプリケーション)、とRAID的な要素で組み上げるかの選択肢が現れます.
デフォルトでは同じデータを3つのODSに分散させるレプリケーションで作られます.
3ODSあるなら、それぞれにデータが分散され、6OSDなら半分の3つのどれかにデータが置かれるって感じ
もう一つは「erasure-code(消去符号化)」というモードです.
(原文から,deepL先生訳 https://docs.ceph.com/en/latest/rados/operations/erasure-code/)
対照的に、消去符号化 プールでは、レプリケーションとは異なるデータ保護方法が使用されます。
イレイジャーコーディングでは、データはデータ ブロックとパリティ ブロックの 2 種類のフラグメントに分割されます。
ドライブに障害が発生したり破損した場合、パリティ ブロックを使用してデータが再構築されます。大規模な場合、イレイジャーコーディングはレプリケーションに比べてスペースを節約します。
このドキュメントでは、データ ブロックを「データ チャンク」と呼び、パリティ ブロックを「コーディング チャンク」と呼びます。
消失符号は「前方誤り訂正符号」とも呼ばれます。最初の前方誤り訂正符号は、1950 年にベル研究所のリチャード・ハミングによって開発されました。
https://docs.ceph.com/en/latest/rados/operations/erasure-code/
ここが分かりやすかった https://access.redhat.com/documentation/ja-jp/red_hat_ceph_storage/4/html-single/storage_strategies_guide/index
実際のプールの作成においてレプリケーションなら複製数を指定します. 「erasure-code(消去符号化)」で作る場合は事前にそのプロファイルを用意する必要があります
既定の「erasure-code」の設定内容は下記にて確認できる
[root@mds ~]# ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure * jerasureプラグインの場合の「crush-failure-domain」は「host」がデフォルト値
technique=reed_sol_van
[root@mds ~]# ceph osd erasure-code-profile set test k=4 m=2 plugin=jerasure crush-device-class=hdd
[root@mds ~]# ceph osd erasure-code-profile ls
default
test
[root@mds ~]#
[root@mds ~]#
(プロファイルの作成)
[root@mds ~]# ceph osd erasure-code-profile set {name} \
[{directory=directory}] \
[{plugin=plugin}] \
[{stripe_unit=stripe_unit}] \
[{key=value} ...] \
[--force]
(プロファイルの確認)
[root@mds ~]# ceph osd erasure-code-profile get {name}
(プロファイルの削除)
[root@mds ~]# ceph osd erasure-code-profile rm {name}
参照 https://ceph.readthedocs.io/en/latest/cephfs/
ファイルシステムを作るには2種類のpoolが必要で、ここではデータ向けのpoolには「erasure-code」に対応させ、
メタデータ向けのpoolは従来の「レプリケーション」で作ります. そもそもメタデータは「erasure-code」が現状使えないです
(データ向けのpool)
[root@mds ~]# ceph osd pool create cephfs_data erasure test # erasure-code-profileの「test」を適用します
(メタデータ向けのpool)
[root@mds ~]# ceph osd pool create cephfs_metadata 64
プールのサイズについてメタデータプールは小さくて良いので「64 PG から 512 PG」で良いみたい
参照先: https://access.redhat.com/documentation/ja-jp/red_hat_ceph_storage/4/html/file_system_guide/creating-the-ceph-file-systems
次に作ったpoolの関連付けを行う. 今回は2つのpool共「cephfs」アプリケーションに適用させる
[root@mds ~]# ceph osd pool application enable cephfs_data cephfs
[root@mds ~]# ceph osd pool application enable cephfs_metadata cephfs
作ったpoolのリストは「ceph osd lspools」で確認できます
[root@mds ~]# ceph osd lspools
1 device_health_metrics
4 cephfs_data
[root@mds ~]#
反対にpoolの削除は「ceph osd pool delete」で行えます
[root@ceph-mgr ~]# ceph osd lspools
1 .mgr
2 cephfs_data
3 cephfs_metadata
[root@ceph-mgr ~]# ceph config set mon mon_allow_pool_delete true <--事前におまじないが必要
[root@ceph-mgr ~]# ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it
pool 'cephfs_data' removed
[root@ceph-mgr ~]# ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
pool 'cephfs_metadata' removed
[root@ceph-mgr ~]# ceph osd lspools
1 .mgr
[root@ceph-mgr ~]#
と達成できる
https://docs.ceph.com/en/latest/rados/operations/placement-groups/
[root@mds ~]# ceph osd pool autoscale-status
POOL SIZE TARGET SIZE RATE RAW CAPACITY RATIO TARGET RATIO EFFECTIVE RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE
device_health_metrics 0 3.0 499.9G 0.0000 1.0 1 on
cephfs_data 0 2.0 499.9G 0.0000 1.0 32 on
cephfs_metadata 0 3.0 499.9G 0.0000 1.0 64 on
[root@mds ~]#
作ったpoolを使ってファイルシステムを作ります
まず始めにここでは「erasure-code」なpoolをデータpoolとしているので、そのpoolの「allow_ec_overwrites」を有効にする必要がある
っで一度 有効にすると元に戻せないみたい
[root@mds ~]# ceph osd pool get cephfs_data allow_ec_overwrites
allow_ec_overwrites: false
[root@mds ~]#
[root@mgr ~]# ceph osd pool set cephfs_data allow_ec_overwrites true
「allow_ec_overwrites=true」はBlueStoreバックエンドではないと出来ないみたい
っでファイルシステム emfs を作成
[root@mgr ~]# ceph fs new emfs cephfs_metadata cephfs_data --force
[root@mds ~]# ceph fs ls
name: emfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@mds ~]# ceph fs status
emfs - 0 clients
====
RANK STATE MDS ACTIVITY DNS INOS
0 active mds Reqs: 0 /s 10 13
POOL TYPE USED AVAIL
cephfs_metadata metadata 1536k 219G
cephfs_data data 0 328G
MDS version: ceph version 15.2.9 (357616cbf726abb779ca75a551e8d02568e15b17) octopus (stable)
[root@mds ~]#
これでcephfs「emfs」は利用可能になります
実際の利用方法はCephFS/ClientとかCephFS/sambaを参照してください
[root@ceph-mgr ~]# ceph fs set emfs down true
emfs marked down.
[root@mds ~]# ceph fs set emfs down false
emfs marked up, max_mds = 1
[root@mds ~]#
[root@ceph-mgr ~]# ceph fs set emfs down true
[root@ceph-mgr ~]# ceph fs rm emfs --yes-i-really-mean-it
階層化ストレージにも出来るみたい. っが必ず速くなるものでもないようで、要取り扱い注意な様子.
https://docs.ceph.com/en/latest/rados/operations/cache-tiering/
下記の場合はHDDのみで構成されているが、SSDのみで「ceph-volume lvm create」すると、「CLASS」欄に「SSD」なosdが表示される。
[root@mgr ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.68381 root default
-3 0.19537 host osd1
0 hdd 0.09769 osd.0 up 1.00000 1.00000
3 hdd 0.09769 osd.3 up 1.00000 1.00000
-5 0.19537 host osd2
1 hdd 0.09769 osd.1 up 1.00000 1.00000
4 hdd 0.09769 osd.4 up 1.00000 1.00000
-7 0.19537 host osd3
2 hdd 0.09769 osd.2 up 1.00000 1.00000
5 hdd 0.09769 osd.5 up 1.00000 1.00000
-9 0.09769 host osd4
6 hdd 0.09769 osd.6 up 1.00000 1.00000
[root@mgr ~]#
SSDだけで作ったpool、HDDだけで作ったpoolを作るには
[root@mgr ~]# ceph osd crush rule create-replicated highcapacitypool default host hdd
[root@mgr ~]# ceph osd crush rule create-replicated highspeedpool default host ssd
(確認)
[root@mgr ~]# ceph osd crush rule ls
replicated_rule
erasure-code
cephfs_data
highcapacitypool
[root@mgr ~]# ceph osd crush rule dump highcapacitypool
{
"rule_id": 3,
"rule_name": "highcapacitypool",
"ruleset": 3,
"type": 1,
"min_size": 1,
"max_size": 10,
"steps": [
{
"op": "take",
"item": -2,
"item_name": "default~hdd"
},
{
"op": "chooseleaf_firstn",
"num": 0,
"type": "host"
},
{
"op": "emit"
}
]
}
[root@mgr ~]#
とする。
作った「crush-rule-name」を使ってpoolを作成する
(メタデータ向けのpoolでssh由来のみにするなら)
[root@mds ~]# ceph osd pool create cephfs_metadata 64 highspeedpool
「erasure-code」の場合は「erasure-code」のプロファイルで「crush-device-class」(「ceph osd crush class ls」の値)で定義できる
参照先https://access.redhat.com/documentation/ja-jp/red_hat_ceph_storage/4/html/storage_strategies_guide/device_classes
[root@mds ~]# ceph osd erasure-code-profile set {name} \
plugin=jerasure \
k={data-chunks} \
m={coding-chunks} \
technique={reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion} \
[crush-root={root}] \
[crush-failure-domain={bucket-type}] \
[crush-device-class={device-class}] \
[directory={directory}] \
[--force]
色んなタイプのpoolが作れます. 前段ではssdから構成されるpool、圧縮機能をもったpoolなどなど.
これらpoolをファイルシステムに組み込ませ、subvolumeで特定のpoolをあてがう事ができる
まずは圧縮機能が働くpoolを作ってみる
[root@mds ~]# ceph osd pool create cephfs_data_compress erasure test
pool 'cephfs_data_compress' created
[root@mds ~]# ceph osd pool set cephfs_data_compress allow_ec_overwrites true <-- 「erasure-code」なpoolなので「allow_ec_overwrites」を有効にする
[root@mds ~]# ceph osd pool application enable cephfs_data_compress cephfs <-- poolの関連付け
[root@mds ~]# ceph osd pool set cephfs_data_compress compression_algorithm snappy
[root@mds ~]# ceph osd pool set cephfs_data_compress compression_mode aggressive
参照先https://documentation.suse.com/ja-jp/ses/5.5/html/ses-all/ceph-pools.html#sec-ceph-pool-compression
っで作ったpool「cephfs_data_compress」を既設のファイルシステム「emfs」に加える
(確認)
[root@mds ~]# ceph fs ls
name: emfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
(poolの追加)
[root@mds ~]# ceph fs add_data_pool emfs cephfs_data_compress
(確認)
[root@mds ~]# ceph fs ls
name: emfs, metadata pool: cephfs_metadata, data pools: [cephfs_data cephfs_data_compress ] <-- data poolとして追加された
[root@mds ~]#
ここから次第にややこしくなるのだが,,,ファイルシステム「emfs」を作った段階で「Ceph File System ボリューム」は決まっている
[root@mds ~]# ceph fs volume ls
[
{
"name": "emfs"
}
]
[root@mds ~]#
ファイルシステム名と同じ.
次に「ファイルシステムサブボリュームグループ」を用意します.
ここで「em」グループを作ってここにはpool「cephfs_data」
もう一つ「Movies」グループを作ってここにはpool「cephfs_data_compress」を割り当ててみる
[root@mds ~]# ceph fs subvolumegroup create emfs em --pool_layout cephfs_data_compress
[root@mds ~]# ceph fs subvolumegroup create emfs movies --pool_layout cephfs_data
するとclientでマウントしている場所にフォルダ「volumes/{em,movies}」フォルダが追加されます
[root@client ~]# ls -l /em/volumes/
total 0
drwxr-xr-x 1 root root 0 Mar 10 20:40 em
drwxr-xr-x 1 root root 0 Mar 10 20:41 movies
[root@client ~]#
「ceph fs subvolumegroup create」と連動してフォルダが作られます.
ぅーん. brtfsやzfsの香り
参照先https://docs.ceph.com/en/latest/cephfs/file-layouts/#adding-a-data-pool-to-the-file-system
ceph fs add_data_pool cephfs cephfs_data_ssd
mkdir /mnt/cephfs/myssddir
setfattr -n ceph.dir.layout.pool -v cephfs_data_ssd /mnt/cephfs/myssddir
[root@client volumes]# getfattr -n ceph.dir.layout.pool em
# file: em
ceph.dir.layout.pool="cephfs_data_compress"
[root@client volumes]#