LINSTOR - linstor

LINSTORはオープンソースのソフトウェアデファインドストレージのソリューションで、DRBDでレプリケートされたストレージボリュームを管理するのによく使われます。シンプルな運用にフォーカスしながらも高可用性でかつ高性能なボリュームを提供します。

LINSTORはそれ自身では配下のストレージは管理せず、代わりにZFSやLVMなどの他のコンポーネントを使ってブロックデバイスをプロビジョニングします。これらのブロックデバイスは次にDRBDでレプリケーションされて、フォールトトレランスとノードのストレージの能力にかかわらず任意のクラスターノードでボリュームをマウントできるようにします。ボリュームはDRBDカーネルモジュールを使ってレプリケートされるので、レプリケーションのデータパスは完全にカーネル空間内にとどまり、ユーザー空間で実装されるソリューションと比べてオーバーヘッドを低減できます。

用語

LINSTORクラスターは2つのメインコンポーネントから構成されます:コントローラーサテライトです。LINSTORコントローラーはデータベースを管理しクラスターの状態と設定を追跡し続けます。一方、サテライトはストレージを提供しクラスター間でボリュームをマウントできるようにします。クライアントはコントローラーとのみ対話し、コントローラーはユーザーのリクエストを満たすために複数のサテライトにまたがる操作を調整する責任を持ちます。

LINSTORは内部の概念にいくぶんオブジェクト指向なアプローチをとっています。これは概念が階層的な性質を持ち、下位レベルのオブジェクトが上位レベルのオブジェクトからプロパティを継承することにも見て取れます。

LINSTORはストレージプールという概念を持ちます。これはLINSTORで使用できる物理ストレージを使ってボリュームを作成します。ストレージプールは(LVMやZFSなどの)バックエンドドライバー、ストレージプールをもつクラスターノードとストレージプール自身あるいはバックエンドストレージに適用できるプロパティを定義します。

LINSTORではリソースはインスタンスで使用できるストレージユニットの表現です。リソースはほとんどの場合DRBDでレプリケートされたブロックデバイスです。その場合そのデバイスの1つのレプリカを表しています。リソースはリソース定義にグルーピングでき、これはこれのすべての子のリソースで継承される共通のプロパティを定義します。同様にリソースグループはそれらの子の定義に適用される共通のプロパティを定義します。またリソースグループは指定のリソース定義にいくつのレプリカを作成し、度のストレージプールを使い、レプリカを異なるアベイラビリティゾーンに分散させるか、などの配置ルールも定義します。LINSTORとやりとりする通常の方法は希望のプロパティを持つリソースグループを定義し、次にそこからリソースをスポーニングさせます。

Incusのlinstorドライバー

注釈

LINSTORはサテライトノード間でボリュームを移動することとマウントすることしかできません。このため、Incusのすべてのクラスタメンバーがボリュームに確実にアクセスできるようにするため、すべてのIncusノードはLINSTORサテライトノードでもあるようにしなければなりません。言い換えると、incusサービスが稼働する各ノードではlinstor-satelliteサービスも動かすべきです。

しかし、これはIncusノードが必ずストレージも提供しなければならないというわけではないことに注意してください。Incusノードに「ディスクレス」なサテライトをデプロイすることでストレージ用のノードと計算用のノードを分離してLINSTORを使うこともできます。ディスクレスなノードはストレージは提供しませんが、DRBDデバイスをマウントしネットワーク越しにIOを実行できます。

他のストレージドライバーとは異なり、このドライバーはストレージシステムをセットアップせず、あなたがLINSTORクラスターを既にインストール済みであることを前提としています。ドライバーはstorage.linstor.controller_connectionオプションがIncusで使われるLINSTORコントローラーのエンドポイントに設定されることを要求します。

このトライバーはリモートとローカル両方のストレージを提供できるという点でも他のドライバーと挙動が異なります。ボリュームのディスクありのレプリカがノード上で利用可能な場合、遅延を減らすため読み書きはローカルで実行されます(ですが書き込みはレプリカに同期的にレプリケーションされる必要があるため、ネットワーク遅延の影響はあります)。同時に、ディスクレスレプリカはすべてのIOをネットワーク越しに行い、物理ストレージのあるなしにかかわらず任意のノード上でボリュームをマウントし使えるようにします。これらのハイブリッドな能力によりLINSTORは必要な際はボリュームをクラスターノード間で移動する柔軟性を持ちながらも低遅延なストレージを提供できます。

Incusのlinstorドライバーはリソースグループを使ってリソースを管理とスポーンします。次の表はIncusとLINSTORの概念のマッピングを表しています:

Incusの概念

LINSTORの概念

ストレージプール

リソースグループ

ボリューム

リソース定義

スナップショット

スナップショット

IncusはLINSTORリソースグループの完全な制御を持っていることを前提とします。 このため、IncusのLINSTORリソースグループ内にIncusで所有されてないエンティティは決して作ってはいけません。作るとIncusが削除してしまうかもしれないからです。

リソースを管理する際、IncusはLINSTORサテライトノードがどのIncusノードに対応するかを決定できる必要があります。デフォルトではIncusはノード名がLINSTORのノード名に一致する(例えばincus cluster listlinstor node listが同じノード名を表示する)ことを想定しています。Incusがスタンドアロンのサーバーとして動いている(クラスターではない)場合、ホスト名がノード名として使われます。IncusとLINSTORでノード名が一致しない場合、各Incusノードでstorage.linstor.satellite.nameを適切なLINSTORサテライトノード名に設定できます。

制限

linstorドライバーは以下の制限があります:

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

content type filesystemがあるカスタムストレージボリュームは通常異なるクラスタメンバー上の複数のインスタンスで共有できます。 しかし、LINSTORドライバーはcontent type filesystemを持つボリュームをDRBDでレプリケートされたデバイス上にファイルシステムを持つことで「シミュレート」しているため、カスタムボリュームは一度に1つのインスタンスにしか割り当てられません。

Incusインストール環境間でのリソースグループの共有

複数のIncusインストール環境間で同じLINSTORリソースグループを共有するのはサポートされていません。

より古いスナップショットの復元

LINSTORは最新のスナップショット以外の復元はサポートしていません。 しかし、古いスナップショットから新しいインスタンスを作ることはできます。 この方法により特定のスナップショットがあなたの必要とするものを含んでいるかを確認することができます。 正しいスナップショットを特定したら、新しいスナップショットを削除してあなたが欲しいスナップショットが最新のスナップショットにしてから復元できます。

別の方法として、復元の際にIncusがより新しいスナップショットを自動で破棄するように設定することもできます。 そうするには、linstor.remove_snapshots設定オプションをボリューム(あるいは対応するvolume.linstor.remove_snapshots設定をプール内のすべてのボリュームのストレージプールに)設定します。

設定オプション

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

ストレージプール設定

キー

デフォルト値

設定

linstor.resource_group.name

string

incus

ストレージプールで使用されるLINSTORリソースグループ名

linstor.resource_group.place_count

int

2

リソースグループ内のリソースのために作成されるべきディスクフルレプリカの数。すでにボリュームがあるプールでこのオプションの値を増やすと、LINSTORはすべての既存のリソースが新しい値に合致するように新しくディスクフルレプリカを作成することになります

linstor.resource_group.storage_pool

string

-

サテライトノード上にリソースが配置されるストレージプール名

linstor.volume.prefix

string

incus-volume-

LINSTORが管理するボリュームの内部名に使われる接頭辞。ストレージプール作成後は変更不可

drbd.on_no_quorum

string

-

クオラムが失われた際に使用されるDRBDポリシー(リソースグループに適用される)

drbd.auto_diskful

string

-

ノード上のストレージが利用可能な場合にプライマリのディスクレスリソースがディスクフルに変換されるまでの期間を表す文字列(リソースグループに適用される)

drbd.auto_add_quorum_tiebreaker

bool

true

LINSTORが必要に応じて自動的にディスクレスリソースを作ってクオラムのタイブレーカーとして振る舞わせることを許可するかどうか(リソースグループに適用される)

Tip

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

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

キー

条件

デフォルト値

説明

block.filesystem

string

content type filesystemをもつブロックベースボリューム

volume.block.filesystemと同じ

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

block.mount_options

string

content type filesystemをもつブロックベースボリューム

volume.block.mount_optionsと同じ

ブロックベースのファイルシステムボリュームのマウントオプション

initial.gid

int

content type filesystemをもつカスタムボリューム

volume.initial.uidと同じか0

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

initial.mode

int

content type filesystemをもつカスタムボリューム

volume.initial.modeと同じか711

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

initial.uid

int

content type filesystemをもつカスタムボリューム

volume.initial.gidと同じか0

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

security.shared

bool

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

volume.security.sharedと同じかfalse

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

security.shifted

bool

カスタムボリューム

volume.security.shiftedと同じかfalse

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

security.unmapped

bool

カスタムボリューム

volume.security.unmappedと同じかfalse

ボリュームにIPマッピングを無効化するか

size

string

volume.sizeと同じ

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

snapshots.expiry

string

カスタムボリューム

volume.snapshots.expiry

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

snapshots.pattern

string

カスタムボリューム

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

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

snapshots.schedule

string

カスタムボリューム

volume.snapshots.scheduleと同じ

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

drbd.on_no_quorum

string

-

クオラムが失われた際に使用されるDRBDポリシー(リソースグループに適用される)

drbd.auto_diskful

string

-

ノード上のストレージが利用可能な場合にプライマリのディスクレスリソースがディスクフルに変換されるまでの期間を表す文字列(リソースグループに適用される)

drbd.auto_add_quorum_tiebreaker

bool

true

LINSTORが必要に応じて自動的にディスクレスリソースを作ってクオラムのタイブレーカーとして振る舞わせることを許可するかどうか(リソースグループに適用される)

linstor.remove_snapshots

bool

volume.linstor.remove_snapshotsと同じかfalse

必要に応じてスナップショットを削除するか