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 list
とlinstor node list
が同じノード名を表示する)ことを想定しています。Incusがスタンドアロンのサーバーとして動いている(クラスターではない)場合、ホスト名がノード名として使われます。IncusとLINSTORでノード名が一致しない場合、各Incusノードでstorage.linstor.satellite.name
を適切なLINSTORサテライトノード名に設定できます。
制限¶
linstor
ドライバーは以下の制限があります:
- インスタンス間でのカスタムボリュームの共有
content type
filesystem
があるカスタムストレージボリュームは通常異なるクラスタメンバー上の複数のインスタンスで共有できます。 しかし、LINSTORドライバーはcontent typefilesystem
を持つボリュームをDRBDでレプリケートされたデバイス上にファイルシステムを持つことで「シミュレート」しているため、カスタムボリュームは一度に1つのインスタンスにしか割り当てられません。- Incusインストール環境間でのリソースグループの共有
複数のIncusインストール環境間で同じLINSTORリソースグループを共有するのはサポートされていません。
- より古いスナップショットの復元
LINSTORは最新のスナップショット以外の復元はサポートしていません。 しかし、古いスナップショットから新しいインスタンスを作ることはできます。 この方法により特定のスナップショットがあなたの必要とするものを含んでいるかを確認することができます。 正しいスナップショットを特定したら、新しいスナップショットを削除してあなたが欲しいスナップショットが最新のスナップショットにしてから復元できます。
別の方法として、復元の際にIncusがより新しいスナップショットを自動で破棄するように設定することもできます。 そうするには、
linstor.remove_snapshots
設定オプションをボリューム(あるいは対応するvolume.linstor.remove_snapshots
設定をプール内のすべてのボリュームのストレージプールに)設定します。
設定オプション¶
以下の設定オプションがlinstor
ドライバーを使うストレージプールとそれらのプール内のストレージボリュームで利用できます。
ストレージプール設定¶
キー |
型 |
デフォルト値 |
設定 |
---|---|---|---|
|
string |
|
ストレージプールで使用されるLINSTORリソースグループ名 |
|
int |
2 |
リソースグループ内のリソースのために作成されるべきディスクフルレプリカの数。すでにボリュームがあるプールでこのオプションの値を増やすと、LINSTORはすべての既存のリソースが新しい値に合致するように新しくディスクフルレプリカを作成することになります |
|
string |
- |
サテライトノード上にリソースが配置されるストレージプール名 |
|
string |
|
LINSTORが管理するボリュームの内部名に使われる接頭辞。ストレージプール作成後は変更不可 |
|
string |
- |
クオラムが失われた際に使用されるDRBDポリシー(リソースグループに適用される) |
|
string |
- |
ノード上のストレージが利用可能な場合にプライマリのディスクレスリソースがディスクフルに変換されるまでの期間を表す文字列(リソースグループに適用される) |
|
bool |
|
LINSTORが必要に応じて自動的にディスクレスリソースを作ってクオラムのタイブレーカーとして振る舞わせることを許可するかどうか(リソースグループに適用される) |
Tip
これらの設定に加えて、ストレージボリューム設定のデフォルト値を設定できます。 ストレージボリュームのデフォルト値を変更する を参照してください。
ストレージボリューム設定¶
キー |
型 |
条件 |
デフォルト値 |
説明 |
---|---|---|---|---|
|
string |
content type |
|
ストレージボリュームのファイルシステム: |
|
string |
content type |
|
ブロックベースのファイルシステムボリュームのマウントオプション |
|
int |
content type |
|
インスタンス内のボリューム所有者のGID |
|
int |
content type |
|
インスタンス内のボリュームのモード |
|
int |
content type |
|
インスタンス内のボリューム所有者のUID |
|
bool |
カスタムブロックボリューム |
|
複数のインスタンス間でのボリュームの共有を有効にするか |
|
bool |
カスタムボリューム |
|
ID シフトオーバーレイを有効にする (複数の分離されたインスタンスによるアタッチを許可する) |
|
bool |
カスタムボリューム |
|
ボリュームにIPマッピングを無効化するか |
|
string |
|
ストレージボリュームのサイズ/クォータ |
|
|
string |
カスタムボリューム |
|
スナップショットをいつ削除するかを制御 ( |
|
string |
カスタムボリューム |
|
スナップショットの名前を表す Pongo2 テンプレート文字列 (スケジュールされたスナップショットと名前無しのスナップショットで使用) [1] |
|
string |
カスタムボリューム |
|
Cron 表記 ( |
|
string |
- |
クオラムが失われた際に使用されるDRBDポリシー(リソースグループに適用される) |
|
|
string |
- |
ノード上のストレージが利用可能な場合にプライマリのディスクレスリソースがディスクフルに変換されるまでの期間を表す文字列(リソースグループに適用される) |
|
|
bool |
|
LINSTORが必要に応じて自動的にディスクレスリソースを作ってクオラムのタイブレーカーとして振る舞わせることを許可するかどうか(リソースグループに適用される) |
|
|
bool |
|
必要に応じてスナップショットを削除するか |