Ceph RBD - ceph

Ceph はオープンソースのストレージプラットフォームで、データを RADOS に基づいたストレージクラスタ内に保管します。 非常にスケーラブルで、単一障害点がない分散システムであり非常に信頼性が高いです。

Ceph はブロックストレージ用とファイルシステム用に異なるコンポーネントを提供します。

Ceph RBD はデータとワークロードを Ceph クラスタに分散する Ceph のブロックストレージコンポーネントです。 これは Thin provisioning を使用し、リソースをオーバーコミットできることを意味します。

用語

Ceph は保管するデータに オブジェクト という用語を使用します。 データを保存と管理する責任を持つデーモンは Ceph OSD です。 Ceph のストレージは プール に分割されます。これはオブジェクトを保管する論理的なパーティションです。 これらは データプール, ストレージプール, OSD プール とも呼ばれます。

Ceph ブロックデバイスは RBD イメージ とも呼ばれ、これらの RBD イメージの スナップショットクローン を作成できます。

Incus の ceph ドライバー

注釈

Ceph RBD ドライバを使用するには ceph と指定する必要があります。 これは少し誤解を招く恐れがあります。 Ceph の全ての機能ではなく Ceph RBD(ブロックストレージ)の機能しか使わないからです。 コンテントタイプ filesystem(イメージ、コンテナとカスタムファイルシステムボリューム)のストレージボリュームには ceph ドライバは Ceph RDB イメージをその上にファイルシステムがある状態で使用します(block.filesystem 参照)。

別の方法として、コンテントタイプ filesystem でストレージボリュームを作成するのに CephFS を使用することもできます。

他のストレージドライバーとは異なり、このドライバーはストレージシステムをセットアップはせず、既に Ceph クラスタをインストール済みであると想定します。

このドライバーはリモートのストレージを提供するという意味でも他のドライバーとは異なる振る舞いをします。 結果として、内部ネットワークに依存し、ストレージへのアクセスはローカルのストレージより少し遅くなるかもしれません。 一方で、リモートのストレージを使うことはクラスタ構成では大きな利点があります。これはストレージプールを同期する必要なしに、すべてのクラスタメンバーが同じ内容を持つ同じストレージプールにアクセスできるからです。

Incus 内の ceph ドライバーはイメージ、スナップショットに RBD イメージを使用し、インスタンスとスナップショットを作成するのにクローンを使用します。

Incus は OSD ストレージプールに対して完全制御できることを想定します。 このため、 Incus OSD ストレージプール内に Incus が所有しないファイルシステムエンティティは Incus が消してしまうかもしれないので決して置くべきではありません。

Ceph RBD 内で copy-on-write が動作する方法のため、親の RBD イメージはすべての子がいなくなるまで削除できません。 結果として Incus は削除されたがまだ参照されているオブジェクトを自動的にリネームします。 そのようなオブジェクトはすべての参照がいなくなりオブジェクトが安全に削除できるようになるまで zombie_ 接頭辞をつけて維持されます。

制限

ceph ドライバーには以下の制限があります。

インスタンス間でのカスタムボリュームの共有

コンテントタイプ filesystem のカスタムストレージボリュームは異なるクラスタメンバーの複数のインスタンス間で通常は共有できます。 しかし、 Ceph RBD ドライバーは RBD イメージ上にファイルシステムを置くことでコンテントタイプ filesystem のボリュームを「シミュレート」しているため、カスタムストレージボリュームは一度に 1 つのインスタンスにしか割り当てできません。 コンテントタイプ filesystem のカスタムボリュームを共有する必要がある場合は代わりに CephFS - cephfs ドライバーを使用してください。

複数インストールされた Incus 間で OSD ストレージプールの共有

複数インストールされた Incus 間で同じ OSD ストレージプールを共有することはサポートされていません。

タイプ "erasure" の OSD プールの使用

タイプ "erasure" の OSD プールを使用するには事前に OSD プールを作成する必要があります。 さらにタイプ "replicated" の別の OSD プールを作成する必要もあります。これはメタデータを保管するのに使用されます。 これは Ceph RBD が omap をサポートしないために必要となります。 どのプールが "erasure coded" であるかを指定するために ceph.osd.data_pool_name 設定オプションをイレージャーコーディングされたプールの名前に設定し source 設定オプションをリプリケートされたプールの名前に設定します。

設定オプション

ceph ドライバーを使うストレージプールとこれらのプール内のストレージボリュームには以下の設定オプションが利用できます。

ストレージプール設定

ceph.cluster_name

新しいストレージプールを作成するCephクラスタの名前

Key: ceph.cluster_name
Type:

string

Default:

ceph

Scope:

global

ceph.osd.data_pool_name

OSDデータプールの名前

Key: ceph.osd.data_pool_name
Type:

string

Default:
Scope:

global

ceph.osd.force_reuse

非推奨。使わないでください。

Key: ceph.osd.force_reuse
Type:

bool

Default:
Scope:

global

ceph.osd.pg_name

OSDストレージプール用のplacementグループの数

Key: ceph.osd.pg_name
Type:

string

Default:

32

Scope:

global

ceph.osd.pool_name

OSDストレージプールの名前

Key: ceph.osd.pool_name
Type:

string

Default:

name of the pool

Scope:

global

ceph.rbd.clone_copy

フルのデータセットコピーではなくRBDのライトウェイトクローンを使うかどうか

Key: ceph.rbd.clone_copy
Type:

bool

Default:

true

Scope:

global

ceph.rbd.du

停止したインスタンスのディスク使用データを取得するのにRBD duを使用するかどうか

Key: ceph.rbd.du
Type:

bool

Default:

true

Scope:

global

ceph.rbd.features

ボリュームで有効にするRBDの機能のカンマ区切りリスト

Key: ceph.rbd.features
Type:

string

Default:

layering

Scope:

global

ceph.user.name

ストレージプールとボリュームの作成に使用するCephユーザー

Key: ceph.user.name
Type:

string

Default:

admin

Scope:

global

source

使用する既存のOSDストレージプール

Key: source
Type:

string

Default:
Scope:

local

volatile.pool.pristine

プールが作成時に空だったかどうか

Key: volatile.pool.pristine
Type:

string

Default:

true

Scope:

global

Tip

これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。

ストレージボリューム設定

block.create_options

ボリュームをフォーマットする際にファイルシステム作成ツールに渡す追加のオプション

Key: block.create_options
Type:

string

Default:

volume.block.create_optionsと同じ

Condition:

コンテントタイプfilesystemのブロックベースのボリューム

block.filesystem

ストレージボリュームのファイルシステム: btrfs, ext4 または xfs (未指定の場合 ext4)

Key: block.filesystem
Type:

string

Default:

volume.block.filesystemと同じ

Condition:

コンテントタイプfilesystemのブロックベースのボリューム

block.mount_options

block-backedなファイルシステムボリュームのマウントオプション

Key: block.mount_options
Type:

string

Default:

volume.block.mount_optionsと同じ

Condition:

コンテントタイプfilesystemのブロックベースのボリューム

initial.gid

インスタンス内のボリュームの所有者のGID

Key: initial.gid
Type:

int

Default:

volume.initial.gidと同じか0

Condition:

コンテントタイプfilesystemのカスタムボリューム

initial.mode

インスタンス内のボリュームのモード

Key: initial.mode
Type:

int

Default:

volume.initial.modeと同じか711

Condition:

コンテントタイプfilesystemのカスタムボリューム

initial.uid

インスタンス内のボリュームの所有者のUID

Key: initial.uid
Type:

int

Default:

volume.initial.uidと同じか0

Condition:

コンテントタイプfilesystemのカスタムボリューム

security.shared

複数のインスタンスでのボリュームの共有を有効にする

Key: security.shared
Type:

bool

Default:

volume.security.sharedと同じかfalse

Condition:

カスタムブロックボリューム

security.shifted

ID シフトオーバーレイを有効にする (複数の分離されたインスタンスによるアタッチを許可する)

Key: security.shifted
Type:

bool

Default:

volume.security.shiftedと同じかfalse

Condition:

カスタムボリューム

security.unmapped

ボリュームへのIDマッピングを無効にする

Key: security.unmapped
Type:

bool

Default:

volume.security.unmappedと同じかfalse

Condition:

カスタムボリューム

size

ストレージボリュームのサイズ/クォータ

Key: size
Type:

string

Default:

volume.sizeと同じ

Condition:
snapshots.expiry

新しく作ったスナップショットをいつ削除するかを制御(1M 2H 3d 4w 5m 6y のような式を期待)

Key: snapshots.expiry
Type:

string

Default:

volume.snapshots.expiryと同じ

Condition:

カスタムボリューム

この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。

サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。 Mが分を意味し、mが月であることに注意してください。 それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。

snapshots.expiry.manual

新しく作ったスナップショットをいつ削除するかを制御(1M 2H 3d 4w 5m 6y のような式を期待)

Key: snapshots.expiry.manual
Type:

string

Default:

volume.snapshots.expiry.manualと同じ

Condition:

カスタムボリューム

この値は新しく作ったスナップショットの有効期限を算出するのに使います。 スナップショットが作られた日時にこの値が加算され、結果のタイムスタンプがスナップショットの個別の有効期限として保管されます。 この値を変更しても、変更後に作られたスナップショットのみに影響します。既存のスナップショットの有効期限は変更されません。

サポートされる単位はS(秒)、M(分)、H(時)、d(日)、w(週)、m(月) and y(年)です。 Mが分を意味し、mが月であることに注意してください。 それぞれの単位は1度だけ指定でき、月と年は固定の日数ではなくカレンダーの月として計算されます。

snapshots.pattern

スナップショットの名前を表す Pongo2 テンプレート文字列 (スケジュールされたスナップショットと名前無しのスナップショットで使用) [1]

Key: snapshots.pattern
Type:

string

Default:

volume.snapshots.patternと同じかsnap%d

Condition:

カスタムボリューム

snapshots.schedule

Cron 表記 (<minute> <hour> <dom> <month> <dow>)、またはスケジュールエイリアスのカンマ区切りリスト(@hourly, @daily, @midnight, @weekly, @monthly, @annually, @yearly)、または自動スナップショットを無効にする場合は空文字(デフォルト)

Key: snapshots.schedule
Type:

string

Default:

volume.snapshots.scheduleと同じ

Condition:

カスタムボリューム