LINSTOR ユーザーズガイド

2025-01-13 13:12:56 UTC

はじめにお読みください

このガイドは、software-defined storage (SDS) ソリューションである LINSTOR® のリファレンスガイドおよびハンドブックとして使用することを目的としています。

このガイドは全体を通して、あなたがLINSTORと関連ツールの最新版を使っていると仮定します。

このガイドは次のように構成されています。

  • LINSTORの紹介 は、LINSTORの基本的な概要であり、LINSTORの概念や用語の説明を提供しています。

  • 基本管理タスクとシステム設定 ではLINSTORの基本的な機能を扱い、一般的な管理作業を使用するための方法を提供します。この章ではそれ以外に、LINSTORの基本設定を配備するためのステップバイステップのガイドとして使用できます。

  • LINSTOR 応用タスク では、さまざまな高度で重要な LINSTOR タスクや構成を示しており、より複雑な方法で LINSTOR を使用できます。

  • GUIを使用したLINSTORの管理 は、LINBIT®の顧客に提供されているLINSTORクラスターを管理するためのグラフィカルクライアントアプローチに関する情報です。

  • LINSTOR Integrations には、 KubernetesProxmox VEOpenNebulaDockerOpenStack などのさまざまなプラットフォームやテクノロジーと組み合わせて、LINSTORベースのストレージソリューションを実装する方法について取り扱った章があります。これらは LINSTROR API を使用しています。

LINSTORについて

1. LINSTORの紹介

LINSTOR®を効果的に使用するためには、この「LINSTORの概要」章がソフトウェアの概要を提供し、その動作方法やストレージの展開方法を説明し、重要な概念や用語を紹介して説明することで、理解を助けます。

1.1. LINSTORの概要

LINBIT社が開発したオープンソースの構成管理システム、LINSTORは、Linuxシステム上のストレージを管理します。このシステムは、ノードのクラスター上でLVM論理ボリュームやZFS ZVOLを管理し、異なるノード間での複製にDRBDを使用してユーザーやアプリケーションにブロックストレージデバイスを提供します。スナップショット、暗号化、HDDバックアップデータのSSDへのキャッシングなど、いくつかの機能があります。

1.1.1. LINSTOR はどこで使用されているのか

LINSTORはもともとDRBDリソースを管理するために開発されました。まだLINSTORを使用してDRBDを管理することができますが、LINSTORは進化し、より便利になったり、それらのスタック内で可能な範囲を超えてより簡単に永続ストレージを提供するために、しばしば上位のソフトウェアスタックと統合されています。

LINSTORは単体で使用することもできますし、Kubernetes、OpenShift、OpenNebula、OpenStack、Proxmox VEなどの他のプラットフォームと統合することも可能です。LINSTORは、オンプレミスのベアメタル環境で実行することもできますし、仮想マシン(VM)、コンテナ、クラウド、ハイブリッド環境でも利用することができます。

1.1.2. LINSTORがサポートするストレージと関連技術

LINSTORは、次のストレージプロバイダーおよび関連技術と連携して動作することができます:

  • LVM and LVM thin volumes

  • ZFS and ZFS thin volumes

  • File and FileThin (loop devices)

  • Diskless

  • Exos [DEPRECATED]

  • SPDK (remote)

  • Microsoft Windows Storage Spacesおよびthin Storage Spaces

  • EBS (target and initiator)

  • Device mapper cache (dm-cache) とwritecache (dm-writecache)

  • bcache

  • LUKS

  • DRBD

LINSTORを使用することで、これらのテクノロジーを単独で扱うか、またはさまざまな有益な組み合わせで使用することができます。

1.2. LINSTORの動作原理

機能するLINSTORセットアップには、linstor-controller.service というsystemdサービスとして実行されるアクティブなコントローラーノードが1つ必要です。これはLINSTORコントロールプレーンであり、LINSTORコントローラーノードがLINSTORサテライトノードと通信する場所です。

セットアップには、LINSTORサテライトソフトウェアをsystemdサービスとして実行する1つ以上のサテライトノードが必要です。LINSTORサテライトサービスは、ノード上でストレージや関連アクションを容易にします。たとえば、ユーザーやアプリケーションにデータストレージを提供するためにストレージボリュームを作成することができます。ただし、サテライトノードはクラスタに物理ストレージを提供する必要はありません。例えば、DRBDクォーラムの目的でLINSTORクラスタに参加する「ディスクレス」サテライトノードを持つことができます。

ノードがLINSTORコントローラーとサテライトサービスの両方を実行し、”Combined”の役割を果たすことも可能です。

ストレージ技術は、例えばDRBDレプリケーションなどとして実装されたLINSTORサテライトノード上で考えることができます。LINSTORでは、コントロールとデータ面が分離されており、独立して機能することができます。つまり、例えばLINSTORコントローラーノードやLINSTORコントローラーソフトウェアを更新する際も、LINSTORサテライトノードはユーザーやアプリケーションに中断することなくストレージを提供し(およびDRBDを使用してレプリケートする場合は)、機能を維持することができます。

このガイドでは、便宜上、LINSTORセットアップはしばしば「LINSTORクラスター」と呼ばれますが、有効なLINSTORセットアップは、Kubernetesなどの他のプラットフォーム内で統合として存在することがあります。

ユーザーは、CLIベースのクライアントやグラフィカルユーザーインタフェース(GUI)を使用してLINSTORとやり取りすることができます。これらのインタフェースは、LINSTOR REST APIを利用しています。また、LINSTORは、このAPIを使用するプラグインやドライバを利用して、他のプラットフォームやアプリケーションと統合することができます。

LINSTORコントローラーとREST API間の通信はTCP/IPを介して行われ、SSL/TLSを使用してセキュリティを確保することができます。

LINSTORが物理ストレージとやり取りするために使用する南行きのドライバーは、LVM、thinLVM、およびZFSです。

LINSTORの動作のダイアグラム
Figure 1. LINSTORの動作原理

1.3. インストール可能なコンポーネント

LINSTORのセットアップには、インストール可能なコンポーネントが3つあります:

  • LINSTOR controller

  • LINSTOR satellite

  • LINSTOR user interfaces (LINSTOR client and LINBIT SDS GUI)

これらのインストール可能なコンポーネントは、コンパイルできるソースコードであるか、または事前にビルドされたパッケージであり、ソフトウェアをインストールして実行するために使用できます。

1.3.1. LINSTOR コントローラー

linstor-controller サービスは、クラスタ全体の構成情報を保持するデータベースに依存しています。LINSTORコントローラーソフトウェアを実行しているノードやコンテナは、リソース配置、リソース構成、およびクラスタ全体の状態を必要とするすべての運用プロセスのオーケストレーションを担当しています。

LINSTORでは複数のコントローラを使用することができます。たとえば、 高可用性のLINSTORクラスタを設定する ときには、複数のコントローラを利用することができます。ただし、アクティブなコントローラは1つだけです。

前述のように、LINSTORコントローラーは、管理するデータプレーンとは別のプレーンで動作します。コントローラーサービスを停止し、コントローラーノードを更新または再起動しても、LINSTORサテライトノードにホストされているデータにアクセスできます。LINSTORサテライトノード上のデータには引き続きアクセスし、提供することができますが、実行中のコントローラーノードがないと、サテライトノードでのLINSTORの状態や管理タスクを実行することはできません。

1.3.2. LINSTOR サテライト

linstor-satellite サービスは、LINSTORがローカルストレージを利用するか、サービスにストレージを提供する各ノードで実行されます。このサービスはステートレスであり、LINSTORコントローラーサービスを実行しているノードまたはコンテナから必要なすべての情報を受け取ります。 LINSTORサテライトサービスは、lvcreate や`drbdadm` などのプログラムを実行します。それは、LINSTORコントローラーノードまたはコンテナから受け取った命令を実行するノード上またはコンテナ内のエージェントのように機能します。

1.3.3. LINSTOR User Interfaces

LINSTORとのインターフェースを行う必要がある場合、そのアクティブなLINSTORコントローラーに指示を送信するには、LINSTORクライアント、またはLINBIT SDS GUIのどちらかのユーザーインターフェース(UI)を使用できます。

これらのUIは、両方ともLINSTORの REST API に依存しています。

LINSTOR Client

「linstor」というLINSTORクライアントは、アクティブなLINSTORコントローラーノードにコマンドを送信するためのコマンドラインユーティリティです。これらのコマンドは、クラスタ内のストレージリソースを作成または変更するようなアクション指向のコマンドである場合もありますし、LINSTORクラスタの現在の状態に関する情報を収集するためのステータスコマンドである場合もあります。

LINSTORクライアントは、有効なコマンドと引数を続けて入力することで使用することもできますし、クライアントの対話モードでは、単に linstor と入力することで使用することができます。

LINSTORクライアントの使用方法に関する詳細情報は、このユーザーガイドのLINSTORクライアントの使用 セクションで見つけることができます。

Listing 1. 対話モードで動作するLINSTORクライアント
# linstor
Use "help <command>" to get help for a specific command.

Available commands:
- advise (adv)
- backup (b)
- controller (c)
- drbd-proxy (proxy)
- encryption (e)
- error-reports (err)
- exos
- file (f)
- help
- interactive
- key-value-store (kv)
- list-commands (commands, list)
- node (n)
- node-connection (nc)
- physical-storage (ps)
- remote
- resource (r)
- resource-connection (rc)
- resource-definition (rd)
- resource-group (rg)
- schedule (sched)
- snapshot (s)
- sos-report (sos)
- space-reporting (spr)
- storage-pool (sp)
- volume (v)
- volume-definition (vd)
- volume-group (vg)
LINSTOR ==>
LINBIT SDS Graphical User Interface

LINBIT SDSのグラフィカルユーザーインターフェース(GUI)は、LINSTORと連携して使用できるWebベースのGUIです。これは、LINSTORクラスターに関する概要情報を取得したり、クラスター内のLINSTORオブジェクトを追加、変更、削除したりする便利な方法となります。例えば、ノードを追加したり、リソースを追加・削除したり、その他のタスクを実行したりすることができます。

このユーザーガイドでは、GUIインターフェースの使用方法については、 LINBIT SDS GUIチャプター で詳細をご覧いただけます。

ウェブブラウザ内でのLINBIT SDS GUIダッシュボードの画像
Figure 2. LINBIT SDSのGUIダッシュボード

1.4. 内部コンポーネント

LINSTORの内部コンポーネントは、LINSTORがどのように機能し、どのように使用するかを表現するために使用されるソフトウェアコードの抽象化です。内部コンポーネントの例として、LINSTORオブジェクトであるリソースやストレージプールが挙げられます。これらは抽象化されていますが、LINSTORクライアントまたはGUIを使用してストレージを展開し管理する際に、非常に現実的な方法でそれらとやり取りします。

このセクションでは、LINSTORの動作原理や使用方法を理解するために必要な基本概念や用語を紹介し、説明しています。

1.4.1. LINSTOR オブジェクト

LINSTORは、ソフトウェア定義ストレージ(SDS)に対してオブジェクト指向のアプローチを取っています。LINSTORオブジェクトは、ユーザーやアプリケーションが利用するか、または拡張するためにLINSTORが提供する最終成果物です。

以下に、最も一般的に使用されるLINSTORのオブジェクトが説明されており、その後に全リストが続きます。

リソース

リソースとは、アプリケーションやエンドユーザーに提示される消費可能なストレージを表すLINSTORオブジェクトのことです。LINSTORが工場であるならば、リソースはそれが生産する製品です。多くの場合、リソースはDRBD複製ブロックデバイスですが、必ずしもそうである必要はありません。例えば、DRBDのクォーラム要件を満たすためにディスクレスなリソースであったり、NVMe-oFやEBSイニシエータである場合もあります。

リソースは以下の属性を持っています:

  • リソースが存在するノードの名前

  • そのリソースが属するリソース定義

  • リソースの構成プロパティ

ボリューム

ボリュームは、物理ストレージに最も近いLINSTORの内部コンポーネントであり、リソースのサブセットです。1つのリソースに複数のボリュームを持つことができます。例えば、MySQLクラスターの中で、データベースをトランザクションログよりも遅いストレージに保存したい場合があります。LINSTORを使用してこれを実現するためには、より高速なトランザクションログストレージメディア用の1つのボリュームと、より遅いデータベースストレージメディア用の別のボリュームを持ち、どちらも単一の「MySQL」リソースの下に配置します。1つのリソースの下に複数のボリュームを保持することで、実質的にコンシステンシーグループを作成しています。

ボリュームに指定した属性は、LINSTORオブジェクト階層の上位で同じ属性が指定されている場合よりも優先されます。これは、再度述べるように、ボリュームが物理ストレージに最も近い内部的なLINSTORオブジェクトであるためです。

ノード

Nodeとは、LINSTORクラスタに参加するサーバーまたはコンテナのことです。Nodeオブジェクトには、以下の属性があります。

  • 名前

  • IP アドレス

  • TCP ポーと

  • ノードタイプ (controller, satellite, combined, auxiliary)

  • コミュニケーション型 (plain or SSL/TLS)

  • ネットワークインターフェース型

  • ネットワークインターフェース名

ストレージプール

ストレージプールは、他のLINSTORオブジェクト(LINSTORリソース、リソース定義、またはリソースグループ)に割り当てることができるストレージを識別し、LINSTORボリュームによって利用されることができます。

ストレージプール定義

  • クラスターノード上のストレージプールに使用するストレージバックエンドドライバーは、例えば、LVM、スリムプロビジョニングされたLVM、ZFS、その他です。

  • ストレージプールが存在するノード

  • ストレージプール名

  • ストレージプールの構成プロパティ

  • ストレージプールのバックエンドドライバー(LVM、ZFS、その他)に渡す追加パラメータ

LINSTORオブジェクトのリスト

LINSTORには次のコアオブジェクトがあります:

EbsRemote

ResourceConnection

SnapshotVolumeDefinition

ExternalFile

ResourceDefinition

StorPool

KeyValueStore

ResourceGroup

StorPoolDefinition

LinstorRemote

S3Remote

Volume

NetInterface

Schedule

VolumeConnection

Node

Snapshot

VolumeDefinition

NodeConnection

SnapshotDefinition

VolumeGroup

Resource

SnapshotVolume

1.4.2. 定義とグループオブジェクト

定義とグループもLINSTORオブジェクトですが、特別な種類です。定義とグループのオブジェクトは、プロファイルやテンプレートと考えることができます。これらのテンプレートオブジェクトは、親オブジェクトの属性を継承する子オブジェクトを作成するために使用されます。また、子オブジェクトに影響を与える可能性のある属性を持つこともありますが、それは子オブジェクト自体の属性ではありません。これらの属性には、たとえば、DRBDレプリケーションに使用するTCPポートや、DRBDリソースが使用するボリューム番号などが含まれる可能性があります。

Definitions

Definitions はオブジェクトの属性を定義します。定義から作成されたオブジェクトは、定義された構成属性を継承します。子オブジェクトを作成する前に、その関連する定義を作成する必要があります。例えば、対応するリソースを作成する前に、リソースの定義を作成する必要があります。

LINSTORクライアントを使用して直接作成できる2つのLINSTOR定義オブジェクトがあります。リソースの定義とボリュームの定義です。

リソースの定義

リソースの定義では、リソースの以下の属性を定義できます。

  • リソース定義が所属するリソースグループ

  • リソースの名前(暗黙的に、リソース定義の名前によって)

  • リソースの接続に使用するTCPポートは、たとえば、DRBDがデータをレプリケートしている場合に使用されます。

  • リソースの保存層、ピアスロット、外部名などの他の属性。

ボリューム定義

ボリューム定義は次のように定義することができます:

  • ストレージ容量のサイズ

  • 保存ボリュームのボリューム番号(リソースに複数のボリュームがある場合があるため)

  • ボリュームのメタデータのプロパティ

  • DRBDレプリケーションストレージに関連付けられたボリュームに使用するマイナーナンバー

これらの定義に加えて、LINSTORには間接的な定義もいくつかあります:[the storage pool definition], [the snapshot definition], そして [the snapshot volume definition]。LINSTORは、それぞれのオブジェクトを作成する際にこれらを自動的に作成します。

グループ

グループは、プロファイルやテンプレートのような役割を持つため、定義と似ています。定義はLINSTORオブジェクトのインスタンスに適用されるのに対して、グループはオブジェクトの定義に適用されます。名前が示す通り、1つのグループは複数のオブジェクト定義に適用でき、1つの定義が複数のオブジェクトインスタンスに適用できるという点で類似しています。たとえば、頻繁に必要なストレージユースケースのためのリソース属性を定義するリソースグループを持つことができます。その後、そのリソースグループを使用して、その属性を持つ複数のリソースを簡単に生成(作成)できます。リソースを作成するたびに属性を指定する必要がなくなります。

リソースグループ

リソースグループは、リソース定義の親オブジェクトであり、リソースグループ上で行われたすべてのプロパティ変更は、そのリソース定義の子供たちに引き継がれます。リソースグループ上で行われたプロパティの変更は、対応する .res リソースファイルに反映されることになります。ただし、親で行われたプロパティ変更は子オブジェクト(リソース定義またはリソースLINSTORオブジェクト)にコピーされないため、子オブジェクト自体はそのプロパティを持ちません。変更はオブジェクトの子供に影響しますが、プロパティ自体は親に残ります。リソースグループには、自動配置ルールの設定も保存され、保存されたルールに基づいてリソース定義を生成することもできます。

リソースグループは、そのリソース定義の子オブジェクトの特性を定義します。リソースグループから生成されるリソース、またはリソースグループに属するリソース定義から作成されるリソースは、リソースグループの「孫」オブジェクトであり、リソース定義の「子」オブジェクトとなります。リソース定義を作成するたびに、指定しない限り、デフォルトのLINSTORリソースグループである DfltRscGrp のメンバーとなります。

リソースグループへの変更は、リソースグループから作成されたすべてのリソースやリソース定義に遡及して適用されます。ただし、同じ特性が子オブジェクト(例: リソース定義やリソース)に設定されている場合は、その特性は適用されません。

これにより、リソースグループを使用することは、多数のストレージリソースを効率的に管理するための強力なツールとなります。個々のリソースを作成または修正する代わりに、リソースグループの親を構成するだけで、すべての子リソースオブジェクトに構成が適用されます。

ボリュームグループ

同様に、ボリュームグループはボリュームの定義のためのプロファイルやテンプレートのようなものです。ボリュームグループは常に特定のリソースグループを参照しなければなりません。さらに、ボリュームグループはボリューム番号と「総」ボリュームサイズを定義することができます。

1.5. LINSTORのオブジェクト階層

この章の前のサブセクションでほのめかされた通り、LINSTORオブジェクトには階層概念が存在します。文脈によっては、これを親子関係として説明することもできますし、上位と下位の関係として説明することもできます。ここで下位とは、物理ストレージレイヤーに近いことを意味します[注: 物理ストレージは、例えば「ディスクレス」ノードのように、特定のノードに存在しない場合があります。ここでの「物理ストレージ」レイヤーは、LINSTORにおけるオブジェクトの階層構造を概念化するための架空のものです。]。

子要素は、親要素に定義された属性を継承しますが、子要素で既に定義されている場合を除きます。同様に、下位要素は、上位要素に設定された属性を受け取りますが、下位要素で既に定義されている場合を除きます。

1.5.1. LINSTORにおけるオブジェクト階層の一般的なルール

次に、LINSTORにおけるオブジェクト階層の一般的なルールがいくつかあります:

  • LINSTORオブジェクトは、そのオブジェクトに設定できる属性のみを受け取るか継承できます。

  • 上位のオブジェクトに設定された属性は、下位のオブジェクトにも引き継がれます。

  • 下位オブジェクトに設定された属性は、上位オブジェクトに設定された同じ属性より優先されます。

  • 子オブジェクトは、親オブジェクトに設定されている属性を継承します。

  • 子オブジェクトに設定された属性は、親オブジェクトに設定された同じ属性よりも優先されます。

1.5.2. LINSTORオブジェクト間の関係を示すための図を使用する

このセクションでは、最も頻繁に使用されるLINSTORオブジェクト間の階層関係を表す図を使用しています。LINSTORオブジェクトの数とそれらの相互関係のため、概念化を簡素化するために、1つの図ではなく複数の図を最初に表示しています。

コントローラー間のオブジェクトの階層化
Figure 3. 一般的なLINSTORオブジェクト間の階層関係

次の図は、単一のサテライトノード上でのLINSTORグループオブジェクト間の関係を示しています。

コントローラー間のオブジェクトの階層化
Figure 4. コントローラーノード上の一般的なLINSTORグループオブジェクト間の階層関係

前の2つの図は、一般的なLINSTORオブジェクト間の上位下位の関係を示していますが、LINSTORオブジェクトの中には親子関係を持つものも考えられます。次の図では、ストレージプールの定義(親オブジェクト)とストレージプール(子オブジェクト)を例に、この種の関係が紹介されています。親オブジェクトは複数の子オブジェクトを持つことができます。そのような関係を示す図が以下に示されています。

図 3
Figure 5. LINSTORオブジェクト間の上位下位および親子関係

概念図で親子関係の概念を導入した後、次の図は、グループや定義に一部の関係を追加した第2図の修正版です。この修正図には、最初の図で示された上位-下位の関係も一部取り入れられています。

図 4
Figure 6. LINSTORグループと定義オブジェクト間の階層関係

次のダイアグラムは、以前のダイアグラムの関係性の概念を統合しつつ、スナップショットや接続に関連する新しいLINSTORオブジェクトを紹介しています。さまざまなオブジェクトと交差する線があるため、このダイアグラムへの構築の理由は明らかになるはずです。

LINSTORの階層と継承関係の図解
Figure 7. 一般的なLINSTORオブジェクトの階層と継承関係

前述の図は複雑なように見えますが、それでも簡略化されたものであり、LINSTORオブジェクト間の可能な関係のすべてを網羅しているわけではありません。前述したように、図に示されている以上に多くのLINSTORオブジェクトが存在します。[LINSTORは進化するソフトウェアであるため、特定のユースケースやコンテキストにおいては、オブジェクトのプロパティ階層が一般的なルールと異なることがある可能性があります。これらの場合には、文書で一般ルールへの例外に言及されます。]。

良いニュースは、LINSTORを扱う際に先行する図を暗記する必要がないということです。ただし、LINSTORオブジェクトに設定した属性、およびその他のLINSTORオブジェクトに対する継承と効果をトラブルシューティングしようとしている場合には参照すると役立つかもしれません。

1.6. LINSTORを使う

LINSTORを紹介し、基本的な概念と機能を説明した後、このガイドの次の章は、具体的な手順に焦点を当てたものです。LINSTORおよびその様々なコンポーネントを使用して意味のある現実世界のデータストレージ問題を解決するための手順を提供します。

LINSTORの管理

2. 基本管理タスクとシステム設定

これは、基本的なLINSTOR®管理タスクについて説明する「ハウツー」スタイルの章で、LINSTORのインストール方法やLINSTORの使用を始める方法がカバーされています。

2.1. LINSTORをインストールする前に

LINSTORをインストールする前に、LINSTORのインストール方法に影響を与える可能性があるいくつかのことを認識しておく必要があります。

2.1.1. パッケージ

LINSTOR は RPM と DEB 形式でパッケージングされています。

  1. linstor-client にはコマンドラインクライアントプログラムが含まれています。通常、これはすでにインストールされているPythonに依存しています。RHEL 8システムでは、python へのシンボリックリンクが必要になります。

  2. linstor-controllerlinstor-satellite は、サービスのためのsystemdユニットファイルを含んでいます。これらは、Java実行環境(JRE)バージョン1.8(headless)以上に依存しています。

これらのパッケージについての詳細は インストール可能なコンポーネント を参照ください。

LINBIT(R)サポート契約をお持ちであれば、LINBIT顧客専用リポジトリを通じて認定されたバイナリにアクセスできます。

2.1.2. FIPSコンプライアンス

この標準は、暗号モジュールの設計および実装に使用されます。 — NIST’s FIPS 140-3 publication

LINSTORを設定して、このユーザーガイドの Encrypted Volumes セクションに詳細が記載されているように、LUKS (dm-crypt) を使用してストレージボリュームを暗号化することができます。 FIPS 規格に準拠しているかどうかについては、LUKSと dm-crypt プロジェクトを参照してください。

LINSTORを構成して、LINSTORサテライトとLINSTORコントローラー間の通信トラフィックをSSL/TLSを使用して暗号化することもできます。このユーザーガイドの 安全なサテライト接続 セクションで詳細に説明されています。

LINSTORは、Self-Encrypting Drives (SEDs) ともインターフェースでき、SED ドライブを初期化する際に LINSTOR を使用することができます。LINSTOR は、ドライブのパスワードをそのドライブに関連付けられたストレージプールに適用するプロパティとして保存します。LINSTOR は、まず作成しなければならない LINSTOR マスターパスフレーズ を使用して、SED ドライブのパスワードを暗号化します。

デフォルトでは、LINSTOR は以下の暗号アルゴリズムを使用します:

  • HMAC-SHA2-512

  • PBKDF2

  • AES-128

このセクションで述べられているユースケース向けに、FIPS準拠バージョンのLINSTORが利用可能です。もし貴方や貴組織がこのレベルのFIPSコンプライアンスを必要とする場合は、詳細について[email protected]までお問い合わせください。

2.2. インストール

コンテナで LINSTOR を使用する場合は、このセクションをスキップして、以下の Containers セクションを使用してインストールしてください。

2.2.1. ボリュームマネージャーのインストール

LINSTOR を使用してストレージボリュームを作成するには、LVM または ZFS のいずれかのボリュームマネージャーをシステムにインストールする必要があります。

2.2.2. LINBIT クラスターノードを管理するスクリプトの使用

LINBIT®のお客様であれば、LINBITが作成したヘルパースクリプトをダウンロードしてノード上で実行することができます。

  • クラスターノードをLINBITに登録する。

  • ノードを既存の LINBIT クラスターに参加させる。

  • ノードで LINBIT パッケージ リポジトリを有効にする。

LINBIT パッケージリポジトリを有効にすると、LINBIT ソフトウェアパッケージ、DRBD® カーネルモジュール、およびクラスタマネージャや OCF スクリプトなどの関連ソフトウェアにアクセスできるようになります。その後、パッケージマネージャを使用して、パッケージの取得、インストール、および更新済みパッケージの管理を行うことができます。

LINBIT Manage Node スクリプトをダウンロードします。

LINBITにクラスターノードを登録し、LINBITのリポジトリを構成するには、まず全てのクラスターノードで以下のコマンドを入力して、ノード管理ヘルパースクリプトをダウンロードして実行してください。

# curl -O https://my.linbit.com/linbit-manage-node.py
# chmod +x ./linbit-manage-node.py
# ./linbit-manage-node.py
root ユーザーとしてスクリプトを実行する必要があります。

このスクリプトは、 LINBIT カスタマーポータル のユーザー名とパスワードの入力を求めます。資格情報を入力すると、スクリプトはアカウントに関連付けられたクラスターノードを一覧表示します (最初は何もありません)。

LINBIT パッケージ リポジトリの有効化

ノードを登録するクラスターを指定した後、プロンプトが表示されたら、スクリプトで登録データを JSON ファイルに書き込みます。次に、スクリプトは、有効または無効にできる LINBIT リポジトリのリストを表示します。 LINSTOR およびその他の関連パッケージは、drbd-9 リポジトリにあります。別の DRBD バージョンブランチを使用する必要がない限り、少なくともこのリポジトリを有効にする必要があります。

ノード管理スクリプト内の最終タスク

リポジトリの選択が完了したら、スクリプトのプロンプトに従って構成をファイルに書き込むことができます。次に、LINBIT の公開署名鍵をノードのキーリングにインストールすることに関する質問には必ず yes と答えてください。

スクリプトが終了する前に、異なるユースケースに応じてインストールできるさまざまなパッケージを提案するメッセージが表示されます。

DEBベースのシステムでは、事前にコンパイルされたDRBDカーネルモジュールパッケージである drbd-module-$(uname -r) 、またはカーネルモジュールのソースバージョンである drbd-dkms をインストールすることができます。どちらか一方のパッケージをインストールしてくださいが、両方をインストールしないでください。

2.2.3. パッケージマネージャーを使用して LINSTOR をインストール

ノードを登録し drbd-9 LINBIT パッケージリポジトリを有効にすると、DEB、RPM、または YaST2 ベースのパッケージマネージャーを使用して LINSTOR と関連コンポーネントをインストールできます。

DEB ベースのパッケージマネージャーを使用している場合は、続行する前に apt update と入力してパッケージリポジトリリストを更新します。
LINSTOR ストレージ用の DRBD パッケージのインストール
もし DRBDを使用せずにLINSTORを使用する 予定であるなら、これらのパッケージのインストールをスキップすることができます。

LINSTOR を使用して DRBD 複製ストレージを作成できるようにする場合は、必要な DRBD パッケージをインストールする必要があります。ノードで実行している Linux ディストリビューションに応じて、ヘルパースクリプトが提案する DRBD 関連のパッケージをインストールします。スクリプトの推奨パッケージとインストールコマンドを確認する必要がある場合は、次のように入力できます。

# ./linbit-manage-node.py --hints
LINSTOR パッケージのインストール

LINSTOR をコントローラーノードにインストールするには、パッケージマネージャーを使用して linbit-sds-controller パッケージをインストールします。

LINSTOR をサテライトノードにインストールするには、パッケージマネージャーを使用して linbit-sds-satellite パッケージをインストールします。

ノードがサテライトとコントローラー (Combined ロール) の両方になる場合は、両方のパッケージをインストールします。

2.2.4. ソースコードから LINSTOR をインストール

LINSTOR プロジェクトの GitHub ページは https://github.com/LINBIT/linstor-server です。

LINBIT には、LINSTOR、DRBD などのソースコードのダウンロード可能なアーカイブファイルもあります。 https://linbit.com/linbit-software-download-page-for-linstor-and-drbd-linux-driver/ から利用可能です。

2.3. LINSTOR のアップグレード

LINSTORはローリングアップグレードをサポートしていません。コントローラーとサテライトは同じバージョンである必要があり、さもなければコントローラーは VERSION_MISMATCH でサテライトを破棄します。しかし、これは問題ではありません。なぜなら、サテライトはコントローラーに接続されていない限り、どんなアクションも行いませんし、DRBDも決して妨げられることはありません。

もし組み込みのデフォルト H2 データベースを使用しており、linstor-controller パッケージがアップグレードされると、自動的にデータベースのバックアップファイルがデフォルトの /var/lib/linstor ディレクトリに作成されます。このファイルは、linstor-controller のデータベースの移行が何らかの理由で失敗した場合の良い復元ポイントです。その場合は、LINBIT にエラーを報告し、古いデータベースファイルを復元して前のコントローラーバージョンに戻すことが推奨されています。

外部データベースや etcd を使用する場合は、現在のデータベースのバックアップを手動で取ることをお勧めします。これにより、リストアポイントを持つことができます。

まず、コントローラーホスト上の linstor-controllerlinstor-client パッケージをアップグレードし、その後 linstor-controller を再起動してください。コントローラーは起動し、すべてのクライアントが OFFLINE(VERSION_MISMATCH) を表示するはずです。その後、すべてのサテライトノードで linstor-satellite パッケージをアップグレードし、再起動してください。短い再接続時間の後、すべてのノードが再び ONLINE を表示するはずで、これでアップグレードが完了します。

2.4. コンテナ

LINSTORはコンテナとしても利用可能です。ベースイメージはLINBITのコンテナレジストリ drbd.io にあります。

LINBITのコンテナイメージリポジトリ(http://drbd.io)は、LINBITの顧客またはLINBITの顧客トライアルアカウントを持っている方のみが利用できます。価格情報を入手したりトライアルを開始するには、LINBITにお問い合わせしてください。また、LINBITの顧客でなくても、LINSTOR SDSのアップストリームプロジェクトであるPiraeusを使用することができます。

画像にアクセスするには、まずLINBITカスタマーポータルの認証情報を使ってレジストリにログインする必要があります。

# docker login drbd.io

このリポジトリで利用可能なコンテナは以下です。

  • drbd.io/drbd9-rhel8

  • drbd.io/drbd9-rhel7

  • drbd.io/drbd9-sles15sp1

  • drbd.io/drbd9-bionic

  • drbd.io/drbd9-focal

  • drbd.io/linstor-csi

  • drbd.io/linstor-controller

  • drbd.io/linstor-satellite

  • drbd.io/linstor-client

利用可能なイメージとバージョンの最新リストは、ブラウザで http://drbd.io を開くことで取得できます。イメージリポジトリをHTTPで閲覧してください。ただし、レジストリのイメージ自体は関連する docker pull コマンドを使用してHTTPS経由で取得されます。

カーネルモジュールをロードするには、LINSTORサテライトでのみ必要です。特権モードで drbd9-$dist コンテナを実行する必要があります。カーネルモジュールコンテナは、LINBITの公式パッケージを顧客リポジトリから取得したり、同梱されたパッケージを使用したり、カーネルモジュールをソースからビルドしようとしたりします。ソースからビルドする場合は、ホストに対応するカーネルヘッダ(たとえば kernel-devel )がインストールされている必要があります。このようなモジュールロードコンテナを実行する方法は4つあります:

  • 出荷済みソースからビルドする。

  • 出荷済み/ビルド済みのカーネルモジュールの使用する。

  • LINBITノードのハッシュとディストリビューションを指定する。

  • 既存のリポジトリ設定をバインドマウントする。

ソースからビルドする場合(RHEL ベース):

# docker run -it --rm --privileged -v /lib/modules:/lib/modules \
  -v /usr/src:/usr/src:ro \
  drbd.io/drbd9-rhel7

コンテナに同梱されているモジュールを使用した例、 /usr/srcバインドマウントしません :

# docker run -it --rm --privileged -v /lib/modules:/lib/modules \
  drbd.io/drbd9-rhel8

ハッシュとディストリビューションを指定する場合: (あまり使わない):

# docker run -it --rm --privileged -v /lib/modules:/lib/modules \
  -e LB_DIST=rhel7.7 -e LB_HASH=ThisIsMyNodeHash \
  drbd.io/drbd9-rhel7

既存のリポジトリ設定を使用した例(ほとんど使用されない):

# docker run -it --rm --privileged -v /lib/modules:/lib/modules \
  -v /etc/yum.repos.d/linbit.repo:/etc/yum.repos.d/linbit.repo:ro \
  drbd.io/drbd9-rhel7
両方の場合(ハッシュ+配布、およびリポジトリのバインドマウント)で、ハッシュまたはリポジトリの構成は、特別な属性が設定されたノードからである必要があります。この属性を設定するためには、LINBITのカスタマーサポートに連絡してください。
現時点(つまり、DRBD 9 バージョン “9.0.17” より前)では、ホストシステムにカーネルモジュールをロードするのではなく、コンテナ化されたDRBDカーネルモジュールを使用する必要があります。コンテナを使用する場合は、ホストシステムにDRBDカーネルモジュールをインストールしないでください。DRBDバージョン9.0.17以上の場合は、通常通りホストシステムにカーネルモジュールをインストールできますが、usermode_helper=disabled パラメータでモジュールをロードする必要があります(例: modprobe drbd usermode_helper=disabled)。

次に、デーモンとして特権モードで LINSTOR サテライトコンテナを実行します。

# docker run -d --name=linstor-satellite --net=host -v /dev:/dev \
  --privileged drbd.io/linstor-satellite
コンテナ化された drbd-utils がネットワークを通してホストカーネルと通信できるようにするには net=host が必要です。

LINSTOR コントローラコンテナをデーモンとして実行するには、ホスト上のポート 3370, 3376, 3377 をコンテナにマッピングします。

# docker run -d --name=linstor-controller -p 3370:3370 drbd.io/linstor-controller

コンテナ化された LINSTOR クラスタと対話するには、パッケージを介してシステムにインストールされた LINSTOR クライアント、またはコンテナ化された LINSTOR クライアントを使用することができます。 LINSTOR クライアントコンテナを使用するには

# docker run -it --rm -e LS_CONTROLLERS=<controller-host-IP-address> \
  drbd.io/linstor-client node list

これ以降は、LINSTOR クライアントを使用してクラスタを初期化し、一般的な LINSTOR パターンを使用してリソースの作成を開始します。

デーモン化されたコンテナとイメージを停止して削除します。

# docker stop linstor-controller
# docker rm linstor-controller

2.5. クラスタの初期化

LINSTORクラスタを初期化する前に、 すべて のクラスタノードで以下の前提条件を満たす必要があります。

  1. DRBD9カーネルモジュールがインストールされ、ロードされている。

  2. drbd-utils パッケージがインストールされています。

  3. LVM ツールがインストールされている。

  4. linstor-controller または linstor-satellite パッケージとそれに必要な依存関係が適切なノードにインストールされています。

  5. linstor-clientlinstor-controller ノードにインストールされている。

コントローラがインストールされているホストで linstor-controller サービスを起動して有効にします。

# systemctl enable --now linstor-controller

2.6. LINSTORクライアントの使用

LINSTORコマンドラインクライアントを実行する際には、linstor-controller サービスが実行されているクラスターノードを指定する必要があります。これを指定しない場合、クライアントはIPアドレス 127.0.0.1 、ポート 3370 で待機しているローカルで実行されている linstor-controller サービスにアクセスしようとします。そのため、 linstor-controller と同じホスト上で linstor-client を使用してください。

linstor-satellite.サービスにはTCPポート3366と3367が必要です。linstor-controller.サービスにはTCPポート3370が必要です。ファイアウォールでこれらのポートが許可されていることを確認してください。
# linstor node list

このコマンドの出力は、空のリストが表示されるべきであり、エラーメッセージではありません。

linstor.コマンドを他のマシンでも使用することができますが、その際にはクライアントに LINSTOR コントローラの場所を教える必要があります。これは、コマンドラインオプションとして指定するか、環境変数を使用することで指定できます。

# linstor --controllers=alice node list
# LS_CONTROLLERS=alice linstor node list

もし、 LINSTORコントローラのREST APIへのHTTPSアクセス を設定しており、LIINSTORクライアントがコントローラにHTTPS経由でアクセスする場合は、以下の構文を使用する必要があります:

# linstor --controllers linstor+ssl://<controller-node-name-or-ip-address>
# LS_CONTROLLERS=linstor+ssl://<controller-node-name-or-ip-address> linstor node list

2.6.1. LINSTORの構成ファイルでコントローラを指定する

あるいは、/etc/linstor/linstor-client.conf ファイルを作成し、global セクションに controllers= 行を追加することもできます。

[global]
controllers=alice

複数の LINSTOR コントローラーが構成されている場合は、それらをカンマ区切りのリストで指定するだけです。 LINSTOR クライアントは、リストされた順番でそれらを試します。

2.6.2. LINSTOR クライアントの省略記法を使用する

LINSTORのクライアントコマンドは、コマンドやサブコマンド、パラメータの最初の文字だけを入力することで、より速く便利に使用することができます。例えば、 linstor node list を入力する代わりに、LINSTORの短縮コマンド linstor n l を入力することができます。

linstor commands コマンドを入力すると、それぞれのコマンドの略記法と共に可能な LINSTOR クライアントコマンドのリストが表示されます。これらの LINSTOR クライアントコマンドのいずれかに --help フラグを使用すると、コマンドのサブコマンドの略記法を取得できます。

2.7. ノードをクラスタに追加する

LINSTORクラスターを初期化した後、次のステップはクラスターにノードを追加することです。

# linstor node create bravo 10.43.70.3

IPアドレスを省略した場合、前述の例で bravo と指定されたノード名を LINSTOR クライアントがホスト名として解決しようと試みます。ホスト名が、LINSTOR コントローラーサービスが実行されているシステムからのネットワーク上のホストに解決されない場合、ノードの作成を試みた際に LINSTOR はエラーメッセージを表示します。

Unable to resolve ip address for 'bravo': [Errno -3] Temporary failure in name resolution

2.8. クラスター内のノードをリストアップします。

以下のコマンドを入力して、追加したノードを含むLINSTORクラスターのノードをリストアップできます:

# linstor node list

コマンドの出力には、LINSTORクラスター内のノードが一覧表示され、ノードに割り当てられたノードタイプ、ノードのIPアドレスとLINSTOR通信に使用されるポート、およびノードの状態などの情報が表示されます。

╭────────────────────────────────────────────────────────────╮
┊ Node   ┊ NodeType  ┊ Addresses                   ┊ State   ┊
╞════════════════════════════════════════════════════════════╡
┊ bravo  ┊ SATELLITE ┊ 10.43.70.3:3366 (PLAIN)     ┊ Offline ┊
╰────────────────────────────────────────────────────────────╯

2.8.1. LINSTORノードの命名

LINSTORノードを作成する際にIPアドレスを指定すると、ノードに任意の名前を付けることができます。LINSTORクライアントは、ノードを作成する際にこのことについてINFOメッセージを表示します。

    [...] 'arbitrary-name' and hostname 'node-1' doesn't match.

LINSTORは自動的に作成されたノードの uname --nodename を検出し、後でDRBDリソースの構成に使用します。任意のノード名の代わりに、ほとんどの場合は自分自身や他の人を混乱させないよう、LINSTORノードを作成する際にはノードのホスト名を使用するのが適切です。

2.8.2. LINSTORサテライトノードの起動と有効化

linstor node list コマンドを使用すると、LINSTOR は新しいノードがオフラインとしてマークされていることを表示します。その後、新しいノードで LINSTOR サテライトサービスを開始して有効にし、サービスが再起動時にも起動するようにしてください。

# systemctl enable --now  linstor-satellite

約10秒後には、linstor node list でオンラインの状態が表示されます。もちろん、サテライトプロセスは、コントローラがサテライトノードの存在を把握する前に開始される可能性があります。

コントローラをホストしているノードが LINSTOR クラスタにストレージを提供する必要がある場合、そのノードをノードとして追加し、linstor-satellite サービスも開始する必要があります。

他のサービスが必要なデバイスを作成する機会を待つようにしたい場合(つまり、起動後)、対応する .service ファイルを更新し、Type=simpleType=notify に変更することができます。

これにより、サテライトはコントローラーが接続し、必要なすべてのデータをサテライトに送信し、サテライトがデバイスの起動と実行を少なくとも1回試行するまで、systemd への READY=1 メッセージの送信を遅らせます。

2.8.3. LINSTORノードタイプの指定

LINSTORノードを作成する際に、ノードタイプを指定することもできます。ノードタイプは、あなたのLINSTORクラスタ内でノードが担う役割を示すラベルです。ノードタイプは、controller, auxiliary, combined, satellite のいずれかになります。例えば、LINSTORノードを作成して、それをコントローラーノードとサテライトノードとしてラベルを付ける場合は、次のコマンドを入力してください:

# linstor node create bravo 10.43.70.3 --node-type combined

--node-type 引数はオプションです。ノードを作成する際にノードタイプを指定しない場合、LINSTORは自動的にデフォルトのサテライトタイプを使用します。

ノードを作成した後で、割り当てられた LINSTOR ノードのタイプを変更したい場合は、linstor node modify --node-type コマンドを入力します。

2.8.4. サポートされているストレージプロバイダーとストレージレイヤーの一覧

サテライトノードでサポートされているストレージプロバイダやストレージレイヤをリストアップするには、node info コマンドを使用することができます。クラスタ内でストレージオブジェクトを作成する前やトラブルシューティングの状況にある場合は、LINSTORを使用する前にそれを行ってください。

# linstor node info

コマンドの出力には2つのテーブルが表示されます。最初のテーブルでは利用可能な LINSTOR storage provider バックエンドが表示されます。2番目のテーブルでは利用可能な LINSTOR storage layers が表示されます。両方のテーブルで、特定のノードがストレージプロバイダーまたはストレージレイヤーをサポートしているかどうかが示されます。プラス記号「+」は”サポートされています”を、マイナス記号「-」は”サポートされていません”を表します。

クラスターの例の出力は、以下のようなものに類似しているかもしれません。

`linstor node info` コマンドの出力
Figure 8. linstor node info コマンドの例の出力

2.9. ストレージプール

ストレージプール は、LINSTORのコンテキストでストレージを識別します。複数のノードからストレージプールをグループ化するには、単純に各ノードで同じ名前を使用します。例えば、すべてのSSDには1つの名前を、すべてのHDDには別の名前を指定するのが有効なアプローチです。

2.9.1. ストレージプールの作成

各ストレージを提供するホスト上で、LVMのボリュームグループ(VG)またはZFSのzPoolを作成する必要があります。同じLINSTORストレージプール名で識別されるVGやzPoolは、各ホストで異なるVGやzPool名を持つかもしれませんが、整合性を保つために、すべてのノードで同じVGまたはzPool名を使用することをお勧めします。

LINSTOR を LVM および DRBD と一緒に使用する場合、LVM グローバル設定ファイル (RHEL では /etc/lvm/lvm.conf) の global_filter 値を次のように設定します。

global_filter = [ "r|^/dev/drbd|" ]

この設定は、LVMにDRBDデバイスをスキャンやオープンの試行から拒否するよう指示します。このフィルタを設定しない場合、CPU負荷の増加やLVM操作の停滞が発生する可能性があります。

# vgcreate vg_ssd /dev/nvme0n1 /dev/nvme1n1 [...]

各ノードにボリュームグループを作成した後、次のコマンドを入力することで、各ノードでボリュームグループにバックアップされたストレージプールを作成することができます。

# linstor storage-pool create lvm alpha pool_ssd vg_ssd
# linstor storage-pool create lvm bravo pool_ssd vg_ssd

ストレージプールの一覧を表示するには、次のコマンドを入力してください:

# linstor storage-pool list

または、LINSTORの略記法を使用することもできます。

# linstor sp l

2.9.2. ストレージプールを使用して、障害領域を単一のバックエンドデバイスに制限する

単一種類のストレージのみが存在し、ストレージデバイスのホットスワップが可能なクラスターでは、1つの物理バッキングデバイスごとに1つのストレージプールを作成するモデルを選択することがあります。このモデルの利点は、障害ドメインを1つのストレージデバイスに限定することです。

2.9.3. 複数のノードでストレージプールを共有する

ExosとLVM2のストレージプロバイダーの両方とも、ストレージアレイやドライブに直接接続された複数のサーバーノードのオプションを提供しています。LVM2では、外部ロッキングサービス(lvmlockd)が、vgcreate--shared オプションを使用して作成されたボリュームグループを管理します。--shared-space は、LINSTORプールを構成する際に、2つ以上のノードからアクセス可能な同じLVM2ボリュームグループを使用するために使用できます。以下の例は、ノードアルファとブラボーからアクセス可能なプールの共有スペース識別子としてLVM2ボリュームグループのUUIDを使用する方法を示しています。

# linstor storage-pool create lvm --external-locking \
  --shared-space O1btSy-UO1n-lOAo-4umW-ETZM-sxQD-qT4V87 \
  alpha pool_ssd shared_vg_ssd
# linstor storage-pool create lvm --external-locking \
  --shared-space O1btSy-UO1n-lOAo-4umW-ETZM-sxQD-qT4V87 \
  bravo pool_ssd shared_vg_ssd

Exos プールは、共有スペース識別子にデフォルトで Exos プールのシリアル番号を使用します。

linstor-server v1.26.0のリリース時点では、LINSTORのためのExos統合は非推奨となっています。

2.9.4. 物理ストレージコマンドを使用してストレージプールを作成する

linstor-server 1.5.2および最新の linstor-client から、LINSTORはサテライト上でLVM/ZFSプールを作成することができます。 LINSTORクライアントには、可能なディスクをリストアップしストレージプールを作成するための以下のコマンドがありますが、このようなLVM/ZFSプールはLINSTORによって管理されず、削除コマンドもないため、そのような処理はノード上で手動で行う必要があります。

# linstor physical-storage list

これはサイズと回転方式 (SSD/磁気ディスク) でグループ化された使用可能なディスクのリストを表示します。

次のフィルターを通過するディスクのみが表示されます。

  • デバイスのサイズは1GiBより大きい必要があります。

  • そのデバイスはルートデバイス(子を持たない)、例えば、/dev/vda, /dev/sda です。

  • そのデバイスにはファイルシステムや他の blkid マーカーがありません(wipefs -a が必要かもしれません)。

  • そのデバイスはDRBDデバイスではありません。

create-device-pool コマンドを使用すると、ディスクにLVMプールを作成し、それを直接ストレージプールとしてLINSTORに追加することができます。

# linstor physical-storage create-device-pool --pool-name lv_my_pool \
  LVMTHIN node_alpha /dev/vdc --storage-pool newpool

もし --storage-pool オプションが指定された場合、LINSTOR は指定された名前でストレージプールを作成します。

さらなるオプションや正確なコマンドの使用方法については、LINSTOR クライアントの --help テキストを参照してください。

2.9.5. ストレージプールの混合

いくつかのセットアップと構成を行うことで、異なる ストレージプロバイダ タイプのストレージプールを使用して LINSTOR リソースをバックアップすることができます。これはストレージプールのミキシングと呼ばれます。たとえば、1つのノードで LVM の厚み予約ボリュームを使用するストレージプールを持ち、別のノードで ZFS zpool を使用するスリム予約済みのストレージプールを持つことができます。

ほとんどの LINSTOR デプロイメントでは、リソースをバックアップするために均質なストレージプールが使用されるため、ストレージプールのミキシングはその機能が存在することを知っておくためにだけここで言及されています。 例えば、ストレージリソースを移行する際に便利な機能かもしれません。 異なるストレージプロバイダーのストレージプールを混在させる には、これに関する詳細や前提条件などが記載されていますので、そちらをご覧ください。

2.10. リソースグループを使用した LINSTOR プロビジョニングされたボリュームのデプロイ

LINSTOR によってプロビジョニングされたボリュームを展開する際に、リソースグループを使用してリソースのプロビジョニング方法を定義することは、デファクトスタンダードと考えられるべきです。その後の章では、特別なシナリオでのみ使用すべきである、リソース定義とボリューム定義から各々のリソースを作成する方法について説明しています。

LINSTORクラスターでリソースグループを作成および使用しない場合でも、リソース定義およびボリューム定義から作成されたすべてのリソースは、’DfltRscGrp’リソースグループに存在します。

リソースグループを使用してリソースをデプロイする簡単なパターンは次のようになります。

# linstor resource-group create my_ssd_group --storage-pool pool_ssd --place-count 2
# linstor volume-group create my_ssd_group
# linstor resource-group spawn-resources my_ssd_group my_ssd_res 20G

上記のコマンドを実行すると ‘pool_ssd’ という名前のストレージプールに参加するノードから、2つに複製された 20GB ボリュームを持つ ‘my_ssd_res’ という名前のリソースが自動的にプロビジョニングされます。

より有効なパターンは、ユースケースが最適であると判断した設定でリソースグループを作成することです。もし一貫性のためボリュームの夜間オンライン検証を実行する必要があるというケースの場合、’verify-alg’ がすでに設定されたリソースグループを作成することで、グループから生成されるリソースは ‘verify-alg’ が事前設定されます。

# linstor resource-group create my_verify_group --storage-pool pool_ssd --place-count 2
# linstor resource-group drbd-options --verify-alg crc32c my_verify_group
# linstor volume-group create my_verify_group
# for i in {00..19}; do
    linstor resource-group spawn-resources my_verify_group res$i 10G
  done

上記のコマンドは、各々が crc32cverify-alg が事前に設定された20個の 10GiB リソースが作成される結果となります。

Promoterは、リソースグループから生成された個々のリソースやボリュームの設定を調整することができます。これは、対応するリソース定義やボリューム定義のLINSTORオブジェクトにオプションを設定することで行います。たとえば、前述の例から res11 が、多くの小さなランダムライトを受け取る非常にアクティブなデータベースで使用されている場合、その特定のリソースの al-extents を増やしたい場合があります。

# linstor resource-definition drbd-options --al-extents 6007 res11

リソース定義内で設定を構成すると、その設定が生成元のリソースグループで既に構成されている場合、リソース定義で設定された値が親リソースグループで設定された値を上書きします。たとえば、同じ res11 が、その検証により遅いがより安全な sha256 ハッシュアルゴリズムを使用する必要がある場合、res11 のリソース定義で verify-alg を設定すると、リソースグループで設定された値が上書きされます。

# linstor resource-definition drbd-options --verify-alg sha256 res11
リソースやボリュームに設定が継承される階層における基本ルールは、リソースやボリュームに「近い」値が優先されます。ボリュームの定義設定はボリュームグループの設定より優先され、リソースの定義設定はリソースグループの設定より優先されます。

2.11. クラスターの構成

2.11.1. 利用可能なストレージプラグイン

LINSTORは、執筆時点で以下のサポートされているストレージプラグインを持っています。

  • Thick LVM

  • 単一の thin プールの Thin LVM

  • Thick ZFS

  • Thin ZFS

2.12. リソース、ボリュームの作成と配備

LINSTORの create コマンドを使用すると、リソースの定義、ボリュームの定義、およびリソースなど、さまざまなLINSTORオブジェクトを作成できます。以下にいくつかのこれらのコマンドが示されています。

次の例のシナリオでは、backups という名前のリソースを作成し、そのサイズを500GiBに設定し、3つのクラスタノード間で複製することを目標とします。

まず、新しいリソース定義を作成してください。

# linstor resource-definition create backups

次に、そのリソース定義内に新しいボリューム定義を作成してください。

# linstor volume-definition create backups 500G

もしボリューム定義をリサイズ(拡大または縮小)したい場合は、set-size コマンドで新しいサイズを指定することで行うことができます。

# linstor volume-definition set-size backups 0 100G
Since version 1.8.0, LINSTOR supports shrinking volume definition size, even for deployed resources, if the resource’s storage layers support it. Use caution when shrinking volume definition sizes for resources with data. Data loss can occur if you do not take cautionary measures such as making backups and shrinking the file system on top of the volume first.

パラメータ 0 はリソース backups におけるボリュームの番号です。このパラメータを指定する必要があります。それは、リソースには複数のボリュームが存在し、それらはいわゆる「ボリューム番号」で識別されるからです。この番号は、ボリューム定義の一覧 (linstor vd l) を取得して見つけることができます。一覧テーブルには、リソースのボリュームに対する番号が表示されます。

現時点では、LINSTORのデータベースには定義オブジェクトのみが作成されています。しかし、まだ1つもサテライトノード上に論理ボリューム(LV)が作成されていません。これからは、LINSTORにリソースの展開タスクを委任するか、自分で行うかを選択できます。

2.12.1. リソースを手動で配置する

resource create コマンドを使用すると、リソース定義を名前付きノードに明示的に割り当てることができます。

# linstor resource create alpha backups --storage-pool pool_hdd
# linstor resource create bravo backups --storage-pool pool_hdd
# linstor resource create charlie backups --storage-pool pool_hdd

2.12.2. DRBD リソースの自動化

リソースグループからリソースを作成(生成)する際、LINSTOR が自動的にノードとストレージプールを選択してリソースを展開することが可能です。このセクションで言及されている引数を使用して、リソースグループを作成または変更する際に制約を指定することができます。これらの制約は、リソースグループから展開されるリソースが自動的に配置される方法に影響を与えます。

リソースグループ配置数の自動管理

LINSTORバージョン1.26.0以降、リソースグループに設定された配置数を維持しようとする、定期的なLINSTORタスクが存在します。そのリソースグループに属するすべての展開済みLINSTORリソースに対してです。これには、デフォルトのLINSTORリソースグループとその配置数も含まれます。

もし、この挙動を無効にしたい場合は、LINSTOR コントローラー、リソースが属する LINSTOR リソースグループ、またはリソース定義それ自体にある BalanceResourcesEnabled プロパティを false に設定してください。LINSTOR のオブジェクト階層のため、リソースグループにプロパティを設定した場合は、それが LINSTOR コントローラーのプロパティ値を上書きします。同様に、リソース定義にプロパティを設定した場合は、そのリソース定義が属するリソースグループのプロパティ値を上書きします。

この機能に関連する他の追加プロパティも、LINSTORコントローラで設定できます:

BalanceResourcesInterval

デフォルトでは、バランスリソース配置タスクがトリガーされるLINSTORコントローラーレベルの間隔は、3600秒(1時間)です。

BalanceResourcesGracePeriod

新しいリソース(作成または生成後)がバランス調整から無視される秒数。デフォルトでは、寛容期間は3600秒(1時間)です。

Placement Count

リソースグループを作成または変更する際に --place-count <replica_count> 引数を使用することで、クラスタ内の何ノードに LINSTOR がリソースグループから作成されたディスクリソースを配置するかを指定できます。

不可能な配置制約を持つリソースグループを作成する

リソースグループを作成または変更し、LINSTORが満たすことが不可能な配置数やその他の制約を指定することができます。たとえば、クラスターに3つのノードしかないのに配置数を 7 に指定することができます。LINSTORはそのようなリソースグループを作成しますが、文句を言いません。ただし、リソースグループからリソースを生成しようとすると、LINSTORはエラーメッセージを表示します。例えば:

ERROR:
Description:
    Not enough available nodes
[...]
ストレージプール配置

次の例では、--place-count オプションの後の値は、いくつのレプリカを持ちたいかを LINSTOR に伝えます。--storage-pool オプションは明らかであるべきです。

# linstor resource-group create backups --place-count 3 --storage-pool pool_hdd

明らかでないことは、--storage-pool オプションを省略することができるということです。これを行うと、リソースグループからリソースを作成(生成)する際に、LINSTORは独自にストレージプールを選択することができます。選択は以下のルールに従います:

  • 現在のユーザがアクセスできないすべてのノードとストレージプールは無視する。

  • すべてのディスクレスストレージプールは無視する

  • 十分な空き領域がないストレージプールは無視する

残りのストレージプールは異なる戦略で評価されます。

MaxFreeSpace

この戦略は評価を1:1でストレージプールの残りの空き容量に割り当てます。ただし、この戦略は実際に割り当てられた空間のみを考慮しています(スリムプロビジョニングされたストレージプールの場合、新しいリソースを作成せずに時間と共に増える可能性があります)。

MinReservedSpace

「MaxFreeSpace」とは異なり、この戦略では予約空間が考慮されます。つまり、薄いボリュームが限界に達する前に成長できる空間です。予約空間の合計がストレージプールの容量を超える場合があり、これはオーバープロビジョニングと呼ばれます。

MinRscCount

与えられたストレージプールに既に展開されているリソースの数を単純に数える

MaxThroughput

この戦略では、ストレージプールの Autoplacer/MaxThroughput プロパティがスコアの基準となります。ただし、このプロパティが存在しない場合は、スコアは 0 になります。与えられたストレージプールに展開されたすべてのボリュームは、定義された sys/fs/blkio_throttle_read および sys/fs/blkio_throttle_write プロパティの値を、ストレージプールの最大スループットから引きます。計算されたスコアは負の値になる可能性があります。

各方針のスコアは正規化され、重み付けされ、合計されます。この場合、最小化方針のスコアが最初に変換され、結果として得られるスコアの全体的な最大化が可能になります。

指定したストレージプールを明示しないリソースの作成時に、どのストレージプールを LINSTOR がリソース配置用に選択するかを影響させるために、戦略の重みを設定することができます。これは、LINSTOR コントローラーオブジェクトに以下のプロパティを設定することで行います。重みは任意の10進数値にすることができます。

linstor controller set-property Autoplacer/Weights/MaxFreeSpace <weight>
linstor controller set-property Autoplacer/Weights/MinReservedSpace <weight>
linstor controller set-property Autoplacer/Weights/MinRscCount <weight>
linstor controller set-property Autoplacer/Weights/MaxThroughput <weight>
Autoplacerの動作を以前のLINSTORバージョンと互換性を保つために、重みが 1 の MaxFreeSpace を除いて、すべてのストラテジーのデフォルトの重みは0です。
0点でもマイナス点でも、ストレージプールが選択されるのを妨げることはありません。これらのスコアを持つストレージプールは、後で検討されるだけです。

最後に、LINSTORはすべての要件を満たすストレージプールのベストマッチングを見つけようとします。このステップでは、 --replicas-on-same, --replicas-on-different, --do-not-place-with, --do-not-place-with-regex, --layer-list, --providers などの自動配置に関する制限も考慮されます。

リソースを自動的に配置するときのリソースの併置の回避

--do-not-place-with <resource_name_to_avoid> 引数は、指定された resource_name_to_avoid リソースが展開されているノードにリソースを配置しないように、LINSTOR に指示することを示します。

--do-not-place-with-regex <regular_expression> 引数を使用することで、LINSTORに対して、提供された引数で指定した正規表現に一致する名前のリソースが既にデプロイされているノードにはリソースを配置しないように指定することができます。このようにして、配置を避けるために複数のリソースを指定することができます。

補助ノードプロパティを用いたリソース自動配置の制約付け

リソースの自動配置は、指定した補助ノードプロパティを持つノードにリソースを配置する(または配置しない)ように制約することができます。

この機能は、LINSTORマネージドストレージを使用するKubernetes環境内でリソースの配置を制限しようとしている場合に、特に有用となります。例えば、Kubernetesのラベルに対応する補助ノードのプロパティを設定することができます。このユースケースの詳細については、「LINSTOR Volumes in Kubernetes」LINSTOR User’s Guide の章にある “replicasOnSame” section をご覧ください。

引数の --replicas-on-same--replicas-on-different は、 Aux/ 名前空間内のプロパティの名前を指定します。

次の例は、3つの LINSTOR サテライトノードに補助ノードプロパティ testProperty を設定しています。次に、配置カウントが2であり、testProperty の値が 1 であるノードにリソースを配置する制約を持つリソースグループ testRscGrp を作成します。ボリュームグループを作成した後、リソースグループからリソースを生成することができます。ここでは、次のコマンドの出力は簡潔に示されていません。

# for i in {0,2}; do linstor node set-property --aux node-$i testProperty 1; done
# linstor node set-property --aux node-1 testProperty 0
# linstor resource-group create testRscGrp --place-count 2 --replicas-on-same testProperty=1
# linstor volume-group create testRscGrp
# linstor resource-group spawn-resources testRscGrp testResource 100M

以下のコマンドで、生成されたリソースの配置を確認することができます。

# linstor resource list

コマンドの出力には、リソースの一覧と、LINSTORがリソースを配置したノードが表示されます。

|=====================================================================================|
+-------------------------------------------------------------------------------------+
| ResourceName      | Node   | Port | Usage  | Conns |    State | CreatedOn           |
| testResource      | node-0 | 7000 | Unused | Ok    | UpToDate | 2022-07-27 16:14:16 |
| testResource      | node-2 | 7000 | Unused | Ok    | UpToDate | 2022-07-27 16:14:16 |
+-------------------------------------------------------------------------------------+

--replicas-on-same 制約により、LINSTORは生成されたリソースをサテライトノード node-1 に配置しませんでした。なぜなら、その補助ノードプロパティ testProperty の値が 1 ではなく 0 だったからです。

node-1 のノードのプロパティを、 list-properties コマンドを使用して確認することができます。

# linstor node list-properties node-1 +----------------------------+ | Key | Value |
|============================|
| Aux/testProperty | 0 | | CurStltConnName | default | | NodeUname | node-1 | +----------------------------+
オートプレースメントのプロパティを解除する

リソースグループに設定した自動配置プロパティを解除するには、次のコマンド構文を使用できます。

# linstor resource-group modify <resource-group-name> --<autoplacement-property>

代わりに、 --<autoplacement-property> 引数の後に空の文字列を続けることもできます。次のような例です:

# linstor resource-group modify <resource-group-name> --<autoplacement-property> ''

たとえば、以前の例で設定された testRscGrp--replicas-on-same 自動配置プロパティを解除する場合、次のコマンドを入力できます:

# linstor resource-group modify testRscGrp --replicas-on-same
LINSTORレイヤーまたはストレージプールプロバイダによるリソースの自動配置の制約

[Promoter] は、--layer-list または --providers 引数を指定することができます。その後に、LINSTOR がリソースを配置する際に影響を与える、LINSTOR のレイヤーやストレージプールプロバイダーのコンマで区切られた値(CSV)リストを指定します。CSV リストに指定できる可能なレイヤーやストレージプールプロバイダーは、--auto-place オプションを使用して --help オプションと共に表示することができます。レイヤーの CSV リストは、特定のリソースグループに対して自動的なリソース配置を制約し、あなたのリストに準拠したストレージを持つノードに制限します。次のコマンドを考えてみてください:

# linstor resource-group create my_luks_rg --place-count 3 --layer-list drbd,luks

このリソースグループから後で作成する可能性のあるリソースは、 ストレージプールを持つ3つのノードに展開され、DRBD レイヤーでバックアップされた LUKS レイヤー (および暗黙的に “ストレージ” レイヤーでバックアップされています) です。 CSV リストで指定するレイヤーの順序は、”上から下” であり、リスト内の左側に位置するレイヤーが 右側のレイヤーの上に配置されます。

--providers 引数は、指定されたCSVリストに一致するストレージプールにのみ自動リソース配置を制約するために使用できます。この引数を使用すると、展開されるリソースをバックアップするストレージプールを明示的に制御できます。たとえば、クラスターに ZFSLVMLVM_THIN のストレージプールが混在している場合、--providers LVM,LVM_THIN 引数を使用することで、--place-count オプションを使用してリソースが LVM または LVM_THIN のストレージプールでのみバックアップされるよう指定できます。

注意:--providers 引数のCSVリストには、リスト要素の優先順位が指定されていません。代わりに、LINSTOR は、追加の配置制約、利用可能な空きスペース、および以前に説明した LINSTOR のストレージプール選択戦略などの要因を使用して、リソースを配置します。

リソースを作成する際に、それらを自動的に配置する

リソースを作成する標準的な方法は、リソースグループを使用してテンプレートを作成し、そこからリソースを生成することですが、 resource create コマンドを使用して直接リソースを作成することもできます。このコマンドを使用すると、LINSTOR がストレージクラスター内でリソースを配置する方法に影響を与える引数を指定することも可能です。

resource create コマンドを使用する際に指定できる引数は、resource-group create コマンドに影響を与える引数と同じですが、配置回数引数を除きます。resource create コマンドで --auto-place <replica_count> 引数を指定するのは、resource-group create コマンドで --place-count <replica_count> 引数を指定するのと同じです。

既存のリソースデプロイメントを拡張するためのAuto-placeの使用

プロモーターの名前以外に、リソースグループとリソース 作成 コマンドの配置数引数の間にもう1つ違いがあります。 リソースの作成 コマンドでは、既存のリソース展開を拡張したい場合に --auto-place 引数と一緒に値 +1 も指定できます。

この値を使用することで、LINSTORは、リソースが作成されたリソースグループに設定されている --place-count が何であるかに関係なく、追加のレプリカを作成します。

例えば、前の例で使用されていた testResource リソースの追加レプリカを展開するために --auto-place +1 引数を使用することができます。最初に、node-1 上の補助ノードプロパティである testProperty1 に設定する必要があります。そうでないと、以前に構成された --replicas-on-same 制約のため、LINSTOR はレプリカを展開することができません。簡単のため、以下のコマンドからのすべての出力を示していません。

# linstor node set-property --aux node-1 testProperty 1 # linstor resource
create --auto-place +1 testResource # linstor resource list
+-------------------------------------------------------------------------------------+
| ResourceName | Node | Port | Usage | Conns | State | CreatedOn |
|=====================================================================================|
| testResource | node-0 | 7000 | Unused | Ok | UpToDate | 2022-07-27 16:14:16 | | testResource | node-1 | 7000 | Unused | Ok | UpToDate | 2022-07-28 19:27:30 | | testResource | node-2 | 7000 | Unused | Ok | UpToDate | 2022-07-27 16:14:16 | +-------------------------------------------------------------------------------------+

警告: +1 という値は resource-group create --place-count コマンドでは有効ではありません。 これは、このコマンドはリソースをデプロイせず、後でデプロイするためのテンプレートを作成する だけだからです。

2.13. リソース、リソース定義、およびリソース グループの削除

削除したい LINSTOR オブジェクトの後に delete コマンドを使用して、LINSTOR リソース、リソース定義、およびリソース グループを削除できます。どのオブジェクトを削除するかによって、LINSTOR クラスターおよびその他の関連する LINSTOR オブジェクトに異なる影響があります。

2.13.1. リソース定義の削除

次のコマンドを使用してリソース定義を削除できます:

# linstor resource-definition delete <resource_definition_name>

これにより、指定されたリソース定義が LINSTOR クラスター全体から削除されます。リソースはすべてのノードから削除され、リソース エントリは LINSTOR のデータベース テーブルから削除するようにマークされます。LINSTOR がすべてのノードからリソースを削除した後、リソース エントリは LINSTOR のデータベース テーブルから削除されます。

警告: もしリソース定義に既存のスナップショットがある場合、そのリソース定義を削除することはできません。スナップショットを削除するまでリソース定義は削除できません。このガイドの スナップショットの削除 セクションを参照してください。

2.13.2. リソースの削除

次のコマンドを使用してリソースを削除できます:

# linstor resource delete <node_name> <resource_name>

リソース定義の削除とは異なり、このコマンドは、指定したノード (複数可) から LINSTOR リソースのみを削除します。リソースはノードから削除され、リソースエントリは LINSTOR のデータベーステーブルから削除するようにマークされます。LINSTOR がノードからリソースを削除した後、リソースエントリは LINSTOR のデータベーステーブルから削除されます。

LINSTORリソースを削除すると、リソースそのものを取り除くだけでなく、クラスタに対して影響を及ぼす可能性があります。たとえば、リソースがDRBDレイヤーでバックアップされている場合、3ノードのクラスターの1ノードからリソースを削除すると、リソースに関連する特定のクォーラム関連のDRBDオプションも削除される可能性があります。3ノードクラスターの1ノードからこのようなリソースを削除した後、そのリソースは3ノードクラスターの2ノードにのみ展開されるため、もはやクォーラムを持たなくなります。

「linstor resource delete」コマンドを実行して単一ノードからリソースを削除すると、次のような情報メッセージが表示される場合があります。

INFO:
    Resource-definition property 'DrbdOptions/Resource/quorum' was removed as there are not enough resources for quorum
INFO:
    Resource-definition property 'DrbdOptions/Resource/on-no-quorum' was removed as there are not enough resources for quorum

また、リソース定義の削除とは異なり、リソースのストレージプールの スナップショットが存在している間にリソースを削除できます。 リソースのストレージプールの既存のスナップショットは保持されます。

2.13.3. リソースグループの削除

次のコマンドを使用して、リソースグループを削除できます。

# linstor resource-group delete <resource_group_name>

このコマンドは指定されたリソースグループを削除します。リソース定義が関連付けられていない場合のみ、リソースグループを削除できます。削除しない場合、LINSTOR は次のようなエラー メッセージを表示します。

ERROR:
Description:
    Cannot delete resource group 'my_rg' because it has existing resource definitions.

リソースグループを削除できるようにこのエラーを解決するには、関連するリソース定義を削除するか、リソース定義を別の (既存の) リソースグループに移動します。

# linstor resource-definition modify <resource_definition_name> \ --resource-group <another_resource_group_name>

次のコマンドを入力すると、リソース グループに関連付けられているリソース定義を見つけることができます。

# linstor resource-definition list

2.14. データベースのバックアップと復元

バージョン1.24.0以降、LINSTORにはLINSTORデータベースをエクスポートおよびインポートするためのツールがあります。

このツールには、/usr/share/linstor-server/bin/linstor-database という実行可能ファイルがあります。この実行可能ファイルには、export-dbimport-db という2つのサブコマンドがあります。両方のサブコマンドは、linstor.toml 構成ファイルが含まれているディレクトリを指定するために使用できるオプショナルな --config-directory 引数を受け入れます。

重要: 一貫したデータベースのバックアップを確保するために、LINSTORデータベースのバックアップを作成する前に、以下のコマンドに示すように、コントローラーサービスを停止させることでコントローラーをオフラインにしてください。

2.14.1. データベースのバックアップ

LINSTORデータベースをホームディレクトリに db_export という新しいファイルにバックアップするために、次のコマンドを入力してください:

# systemctl stop linstor-controller # /usr/share/linstor-server/bin/linstor-database export-db ~/db_export # systemctl start linstor-controller

注意: 必要に応じて、linstor-database ユーティリティに --config-directory 引数を使用して LINSTOR 設定ディレクトリを指定できます。この引数を省略すると、デフォルトでユーティリティは /etc/linstor ディレクトリを使用します。

データベースのバックアップが完了したら、バックアップファイルを安全な場所にコピーしてください。

# cp ~/db_export <somewhere safe>

生成されたデータベースのバックアップは、実際のデータだけでなく、バックアップが作成された日時や、どのデータベースからであるかなどのメタデータも含まれた、単なるJSONドキュメントです。

2.14.2. バックアップからデータベースを復元する

以前に作成したバックアップからデータベースを復元する手順は、 前のセクション で説明した export-db と似ています。

たとえば、以前に作成したバックアップを db_export ファイルから復元する場合は、次のコマンドを入力してください。

# systemctl stop linstor-controller # /usr/share/linstor-server/bin/linstor-database import-db ~/db_export # systemctl start linstor-controller

以前のバックアップからデータベースをインポートする際には、現在インストールされているLINSTORのバージョンが、バックアップを作成したバージョンと同じかそれ以上である必要があります。もし現在の LINSTOR バージョンが、データベースバックアップを作成したバージョンよりも新しい場合、バックアップをインポートする際にデータはエクスポート時に使用されたバージョンのデータベーススキーマと同じで復元されます。その後、コントローラが再起動すると、データベースが古いスキーマであることを検知し、自動的にデータを現在のバージョンのスキーマに移行します。

2.14.3. データベースの変換

エクスポートされたデータベースファイルにはいくつかのメタデータが含まれているため、エクスポートされたデータベースファイルは、エクスポート元とは異なるデータベースタイプにインポートすることができます。

これにより、例えば、etcdセットアップからSQLベースのセットアップに簡単に変換することができます。データベース形式を変換する特別なコマンドはありません。単に --config-directory 引数を使用して正しい linstor.toml 構成ファイルを指定するか(あるいは、デフォルトの /etc/linstor/linstor.toml を更新してインポートする前に使用したいデータベースタイプを指定する)だけです。データベースタイプの指定については、 LINSTORユーザーガイド を参照してください。バックアップ元のデータベースのタイプにかかわらず、linstor.toml 構成ファイルで指定されたデータベースタイプでインポートされます。

3. LINSTOR 応用タスク

3.1. 高可用性 LINSTOR クラスターの作成

デフォルトでは、LINSTORクラスタはひとつだけアクティブなLINSTORコントローラノードから構成されます。LINSTORを高可用性にするためには、コントローラデータベースの複製ストレージを提供し、複数のLINSTORコントローラノードを設けて、常にひとつだけがアクティブとなるようにします。さらに、サービスマネージャ(ここではDRBD Reactor)が、高可用性ストレージのマウントやアンマウント、ノード上でのLINSTORコントローラサービスの起動と停止を管理します。

3.1.1. 高可用性を持つLINSTORデータベースストレージの設定

高可用性ストレージを構成するためには、LINSTOR自体を使用することができます。ストレージをLINSTORの管理下に置く利点の1つは、高可用性ストレージを新しいクラスターノードに簡単に拡張できることです。

HA LINSTORデータベースストレージリソースのためのリソースグループを作成する

まず、後でLINSTORデータベースをバックアップするリソースをスポーンするために使用する、linstor-db-grp という名前のリソースグループを作成してください。環境内の既存のストレージプール名に合わせて、ストレージプール名を適応させる必要があります。

# linstor resource-group create \ --storage-pool my-thin-pool \ --place-count 3 \ --diskless-on-remaining true \ linstor-db-grp

次に、リソースグループに必要な DRBD オプションを設定します。リソースグループから起動したリソースは、これらのオプションを継承します。

# linstor resource-group drbd-options \ --auto-promote=no \ --quorum=majority \ --on-suspended-primary-outdated=force-secondary \ --on-no-quorum=io-error \ --on-no-data-accessible=io-error \ --rr-conflict=retry-connect \ linstor-db-grp

重要:クラスタが自動クォーラムを取得し、io-error ポリシーを使用していること(セクション 自動クォーラムポリシー 参照)、および auto-promote が無効になっていることが重要です。

HA LINSTORデータベースストレージリソースのためのボリュームグループを作成する

次に、リソースグループを参照するボリュームグループを作成してください。

# linstor volume-group create linstor-db-grp
HA LINSTORデータベースストレージのリソースの作成

今、作成したリソースグループから新しいLINSTORリソースを生成することができます。このリソースは linstor_db という名前で、サイズは200MiBです。リソースグループを作成する際に指定したパラメータにより、LINSTORはクラスタ内の3つのサテライトノードに my-thin-pool ストレージプールにリソースを配置します。

# linstor resource-group spawn-resources linstor-db-grp linstor_db 200M

3.1.2. LINSTORデータベースをHAストレージに移行する

linstor_db リソースを作成した後は、LINSTOR データベースを新しいストレージに移動し、systemd マウントサービスを作成することができます。まず、現在のコントローラーサービスを停止して無効にし、後で DRBD Reactor によって管理されるためです。

# systemctl disable --now linstor-controller

次に、systemdのマウントサービスを作成してください。

# cat << EOF > /etc/systemd/system/var-lib-linstor.mount
[Unit]
Description=Filesystem for the LINSTOR controller

[Mount]
# you can use the minor like /dev/drbdX or the udev symlink What=/dev/drbd/by-res/linstor_db/0 Where=/var/lib/linstor EOF

# mv /var/lib/linstor{,.orig} # mkdir /var/lib/linstor # chattr +i /var/lib/linstor # only if on LINSTOR >= 1.14.0 # drbdadm primary linstor_db # mkfs.ext4 /dev/drbd/by-res/linstor_db/0 # systemctl start var-lib-linstor.mount # cp -r /var/lib/linstor.orig/* /var/lib/linstor # systemctl start linstor-controller

/etc/systemd/system/var-lib-linstor.mount マウントファイルを、LINSTORコントローラーサービス(スタンバイコントローラーノード)を実行する可能性があるすべてのクラスターノードにコピーしてください。再度強調しますが、これらのサービスのいずれも systemctl enable しないでください。なぜなら、DRBD Reactor がそれらを管理するからです。

3.1.3. 複数のLINSTORコントローラー

次のステップは、linstor_db DRBDリソースにアクセス権があるすべてのノードに LINSTOR コントローラをインストールすることです(DRBDボリュームをマウントする必要があるため、および潜在的な LINSTOR コントローラにしたいため)。 コントローラが drbd-reactor によって管理されていることが重要なので、すべてのノードで linstor-controller.service が無効になっていることを確認してください! 確実であるために、すべてのクラスタノードで systemctl disable linstor-controller を実行し、前のステップから現在実行されているノードを除くすべてのノードで systemctl stop linstor-controller を実行してください。また、LINSTORのバージョンが1.14.0以上である場合、潜在的なコントローラノードすべてにて chattr +i /var/lib/linstor が設定されているかどうかも確認してください。

3.1.4. サービスの管理

マウントサービスや linstor-controller サービスを開始または停止するには、DRBD Reactor を使用してください。このコンポーネントを、LINSTORコントローラになりうるすべてのノードにインストールし、それらの /etc/drbd-reactor.d/linstor_db.toml 構成ファイルを編集します。有効な昇格プラグインのセクションが次のように含まれている必要があります:

[[promoter]]
id = "linstor_db"
[promoter.resources.linstor_db]
start = ["var-lib-linstor.mount", "linstor-controller.service"]

要件に応じて、on-stop-failure アクションを設定し、stop-services-on-exit を設定することも考慮してください。

その後 drbd-reactor を再起動し、構成したすべてのノードで有効にします。

# systemctl restart drbd-reactor # systemctl enable drbd-reactor

drbd-reactor サービスからの警告がログにないことを確認するには、systemctl status drbd-reactor を実行してください。既にアクティブなLINSTORコントローラーがあるため、状況はそのまま維持されます。drbd-reactorctl status linstor_db を実行して、linstor_dbターゲットユニットの健康状態を確認してください。

最後に、重要なのは、LINSTORサテライトサービスを設定して、起動時にLINSTORコントローラーDBのリソースファイルを削除(そして再生成)しないようにすることです。サービスファイルを直接編集せず、systemctl edit を使用してください。LINSTORコントローラーとなる可能性があるすべてのノード、かつLINSTORサテライトでもあるノードでサービスファイルを編集してください。

# systemctl edit linstor-satellite
[Service]
Environment=LS_KEEP_RES=linstor_db

この変更を行った後、全てのサテライトノードで systemctl restart linstor-satellite を実行する必要があります。

注意: LINSTOR クライアントの使用 というセクションで説明されているように、複数のコントローラに使用するように LINSTOR クライアントを構成することを確認し、また、Proxmox プラグインなどの統合プラグインも複数の LINSTOR コントローラに対応するように構成しているか確認してください。

3.2. DRBDクライアント

--storage-pool オプションの代わりに --drbd-diskless オプションを使用することで、ノード上に永続的にディスクレスな DRBD デバイスを持つことができます。つまり、そのリソースはブロックデバイスとして表示され、既存のストレージデバイスがなくてもファイルシステムにマウントすることができます。リソースのデータは、同じリソースを持つ他のノードを介してネットワーク経由でアクセスされます。

# linstor resource create delta backups --drbd-diskless

注意: --diskless オプションは非推奨となりました。代わりに --drbd-diskless または --nvme-initiator コマンドを使用してください。

3.3. LINSTOR – DRBDコンシステンシグループ/マルチボリューム

いわゆる一貫性グループとは、DRBDの機能のひとつです。LINSTORの主な機能のひとつは、DRBDを用いたストレージクラスタを管理することなので、このユーザーガイドで言及されています。1つのリソース内の複数のボリュームが一貫性グループを形成します。

これは、1つのリソースで異なるボリュームに対する変更が他のサテライトでも同じ順番で複製されることを意味します。

したがって、リソース内の異なるボリュームに相互依存データがある場合は、タイミングを気にする必要はありません。

LINSTORリソースに複数のボリュームを配備するには、同じ名前の volume-definitions を2つ作成する必要があります。

# linstor volume-definition create backups 500G # linstor volume-definition create backups 100G

3.4. 1つのリソースのボリュームを異なるストレージプールに配置

リソースをノードに配備する前のボリューム定義で StorPoolName プロパティを使うことで、1つのリソースから異なるストレージプールへのボリュームを作成できます。

# linstor resource-definition create backups # linstor volume-definition create backups 500G # linstor volume-definition create backups 100G # linstor volume-definition set-property backups 0 StorPoolName pool_hdd # linstor volume-definition set-property backups 1 StorPoolName pool_ssd # linstor resource create alpha backups # linstor resource create bravo backups # linstor resource create charlie backups

注意: volume-definition create コマンドが --vlmnr オプションを指定せずに使用されたため、LINSTORは0から始まるボリューム番号を割り当てました。次の2行の0と1は、これらの自動的に割り当てられたボリューム番号を指します。

ここでは、’resource create’ コマンドには --storage-pool オプションが不要です。この場合、LINSTORは ‘fallback’ ストレージプールを使用します。そのストレージプールを見つけるために、LINSTORは以下の順序で以下のオブジェクトのプロパティをクエリします:

  • Volume definition

  • Resource

  • Resource definition

  • Node

もし、それらのオブジェクトのどれもが StorPoolName プロパティを含んでいない場合、コントローラーはストレージプールとしてハードコードされた ‘DfltStorPool’ 文字列にフォールバックします。

これはつまり、リソースを展開する前にストレージプールを定義するのを忘れた場合、’DfltStorPool’ という名前のストレージプールが見つからないというエラーメッセージが LINSTOR から表示されることを意味します。

3.5. DRBDを使わないLINSTOR

LINSTORはDRBDを使わずとも使用できます。 DRBDがなくても、LINSTORはLVMおよびZFS 下位ストレージプールからボリュームをプロビジョニングし、LINSTORクラスタ内の個々のノードにそれらのボリュームを作成できます。

現在LINSTORはLVMとZFSボリュームの作成をサポートしており、LUKS、DRBD、または NVMe-oF/NVMe-TCP の組み合わせをそれらのボリュームの上に重ねることもできます。

例えば、LINSTORクラスターで定義されたThin LVMをバックエンドストレージプールとして持っていると仮定します。このストレージプールの名前は thin-lvm です。

# linstor --no-utf8 storage-pool list +--------------------------------------------------------------+ | StoragePool | Node | Driver | PoolName | ... | |--------------------------------------------------------------| | thin-lvm | linstor-a | LVM_THIN | drbdpool/thinpool | ... | | thin-lvm | linstor-b | LVM_THIN | drbdpool/thinpool | ... | | thin-lvm | linstor-c | LVM_THIN | drbdpool/thinpool | ... | | thin-lvm | linstor-d | LVM_THIN | drbdpool/thinpool | ... | +--------------------------------------------------------------+

次のコマンドを使用して、linstor-d 上に100GiBのThin LVMを作成するには、LINSTORを使用できます:

# linstor resource-definition create rsc-1
# linstor volume-definition create rsc-1 100GiB
# linstor resource create --layer-list storage \
          --storage-pool thin-lvm linstor-d rsc-1

その後、linstor-d に新しい Thin LVM が作成されていることが確認できるはずです。LINSTOR からデバイスパスを抽出するには、--machine-readable フラグを設定して linstor リソースをリストアップしてください。

# linstor --machine-readable resource list | grep device_path
            "device_path": "/dev/drbdpool/rsc-1_00000",

もし、このボリューム上にDRBDをレイヤー化したい場合、ZFSやLVMでバックアップされたボリュームに対してLINSTORでのデフォルト --layer-list オプションはどうなるか疑問に思うことでしょう。その場合、以下のようなリソース作成パターンを使用します:

# linstor resource-definition create rsc-1
# linstor volume-definition create rsc-1 100GiB
# linstor resource create --layer-list drbd,storage \
          --storage-pool thin-lvm linstor-d rsc-1

その後、linstor-d 上の新しい Thin LVM が DRBD ボリュームをバックアップしていることがわかります。

# linstor --machine-readable resource list | grep -e device_path -e backing_disk
            "device_path": "/dev/drbd1000",
            "backing_disk": "/dev/drbdpool/rsc-1_00000",

次の表は、どのレイヤーの後にどの子レイヤーが続くかを示しています。

[cols=”>1,<5″]

Layer

Child layer

DRBD

CACHE, WRITECACHE, NVME, LUKS, STORAGE

CACHE

WRITECACHE, NVME, LUKS, STORAGE

WRITECACHE

CACHE, NVME, LUKS, STORAGE

NVME

CACHE, WRITECACHE, LUKS, STORAGE

LUKS

STORAGE

STORAGE

1つの層は、層リストに1度しか出現できません。
luks レイヤの必要条件についての情報はこのユーザガイドの暗号化ボリュームの節を参照ください。

3.5.1. NVMe-oF/NVMe-TCP LINSTOR レイヤ

NVMe-oF/NVMe-TCPによって、LINSTORはディスクレスリソースを NVMe ファブリックを介してデータが保存されている同じリソースを持つノードに接続することが可能となります。これにより、リソースをローカルストレージを使用せずにマウントすることができ、データにはネットワーク経由でアクセスします。LINSTORはこの場合にDRBDを使用しておらず、そのためLINSTORによってプロビジョニングされたNVMeリソースはレプリケーションされません。データは1つのノードに保存されます。

NVMe-oFはRDMAに対応したネットワークでのみ動作し、NVMe-TCPはIPトラフィックを運ぶことができるネットワークで動作します。ネットワークアダプタの機能を確認するためには、lshwethtool などのツールを使用できます。

LINSTORとNVMe-oF/NVMe-TCPを使用するには、サテライトとして機能し、リソースにNVMe-oF/NVMe-TCPを使用する各ノードに nvme-cli パッケージをインストールする必要があります。例えば、DEBベースのシステムでは、次のコマンドを入力してパッケージをインストール します:

# apt install nvme-cli
DEBベースのシステムでない場合は、お使いのオペレーティングシステムに適したパッケージをインストールするためのコマンドを使用してください。例えば、SLESでは zypper 、RPMベースのシステムでは dnf を使用します。

NVMe-oF/NVMe-TCP を使用するリソースを作成するには、resource-definition を作成するときに追加のパラメータを指定する必要があります。

# linstor resource-definition create nvmedata -l nvme,storage
DRBDが使用されている場合、デフォルトでは -l(layer-stack) パラメータは drbd,storage に設定されています。 NVMeもDRBDも使用せずにLINSTORリソースを作成したい場合は、 -l パラメータを storage だけに設定する必要があります。

デフォルトの NVMe-oF の代わりに NVMe-TCP を使用するには、次のプロパティを設定する必要があります。

# linstor resource-definition set-property nvmedata NVMe/TRType tcp

プロパティ NVMe/TRType は、リソースグループまたはコントローラーレベルで設定することもできます。

次に、リソースのためのボリューム定義を作成してください。

# linstor volume-definition create nvmedata 500G

ノード上にリソースを作成する前に、データがローカルに格納される場所と、どのノードがネットワーク経由でそれにアクセスするかを確認します。

まず、データを保存するノード上にリソースを作成してください。

# linstor resource create alpha nvmedata --storage-pool pool_ssd

ネットワーク上でリソースデータにアクセスするノードでは、リソースをディスクレスとして定義する必要があります。

# linstor resource create beta nvmedata --nvme-initiator

これでリソース nvmedata をノードの1つにマウントできます。

ノードに複数のNICがある場合は、NVMe-of/NVME-TCP に対してそれらの間の経路を強制する必要があります。そうしないと、複数のNICで問題が発生する可能性があります。

3.5.2. 書き込みキャッシュレイヤー

DM-Writecache デバイスは、ストレージデバイスとキャッシュデバイスの2つのデバイスで構成されます。 LINSTORはそのような書き込みキャッシュデバイスをセットアップできますが、ストレージプールやキャッシュデバイスのサイズなどの追加情報が必要です。

# linstor storage-pool create lvm node1 lvmpool drbdpool
# linstor storage-pool create lvm node1 pmempool pmempool

# linstor resource-definition create r1
# linstor volume-definition create r1 100G

# linstor volume-definition set-property r1 0 Writecache/PoolName pmempool
# linstor volume-definition set-property r1 0 Writecache/Size 1%

# linstor resource create node1 r1 --storage-pool lvmpool --layer-list WRITECACHE,STORAGE

例で設定されている2つのプロパティは必須ですが、WRITECACHE を持つすべてのリソースに対してデフォルトとして機能するコントローラーレベルでも設定することができます。ただし、Writecache/PoolName は対応するノードを指します。ノードに pmempool というストレージプールがない場合、エラーメッセージが表示されます。

DM-Writecache による必須の4つのパラメータは、プロパティを介して設定されるか、LINSTORによって解決されます。前述のリンクに記載されているオプションのプロパティは、同様にプロパティを介して設定できます。linstor controller set-property --help を参照して、Writecache/* プロパティキーのリストを確認してください。

外部メタデータを使用するようにDRBDを設定しているときに --layer-list DRBD、WRITECACHE、STORAGE を使用すると、外部メタデータを保持するデバイスではなく、下位デバイスのみが書き込みキャッシュを使用します。

3.5.3. キャッシュレイヤー

LINSTOR は DM-Cache デバイスをセットアップすることもできます。これは前のセクションの DM-Writecache によく似ています。主な違いは、キャッシュデバイスが 3 つのデバイスで構成されていることです。1 つのストレージデバイス、1 つのキャッシュデバイス、1 つのメタデバイスです。LINSTOR プロパティは書き込みキャッシュのプロパティと非常に似ていますが、Cache 名前空間にあります。

# linstor storage-pool create lvm node1 lvmpool drbdpool
# linstor storage-pool create lvm node1 pmempool pmempool

# linstor resource-definition create r1
# linstor volume-definition create r1 100G

# linstor volume-definition set-property r1 0 Cache/CachePool pmempool
# linstor volume-definition set-property r1 0 Cache/Cachesize 1%

# linstor resource create node1 r1 --storage-pool lvmpool --layer-list CACHE,STORAGE
Writecache レイヤーを構成する Writecache/PoolName と異なり、Cache レイヤーの唯一の必須プロパティは Cache/CachePool です。これは、Cache レイヤーの Cache/MetaPool は個別に設定するか、またはデフォルトで Cache/CachePool の値を設定するからです。

linstor controller set-property --help を参照し、Cache/* プロパティのキーと、省略されたプロパティのデフォルト値の一覧を確認してください。

外部メタデータを使用するようにDRBDを設定しているときに --layer-list DRBD,CACHE,STORAGE を使用すると、外部メタデータを保持するデバイスではなく、下位デバイスのみがキャッシュを使用します。

3.5.4. ストレージレイヤー

ストレージレイヤーは、LVM、ZFS などのよく知られたボリュームマネージャーからの新しいデバイスを提供します。リソースがディスクレスである必要がある場合(そのタイプは専用の「ディスクレス」プロバイダータイプ)でも、すべてのレイヤーの組み合わせはストレージレイヤーに基づく必要があります。

プロバイダとその特性のリストについては、 ストレージプロバイダ を参照してください。

一部のストレージプロバイダー用に、LINSTOR には特別なプロパティがあります。

StorDriver/WaitTimeoutAfterCreate

LINSTORは、デバイスが作成された後に登場することを期待しています(たとえば、lvcreatezfs create の呼び出しの後など)。LINSTORは、デフォルトでデバイスが登場するのを500ミリ秒待ちます。これらの500ミリ秒は、このプロパティによって上書きすることができます。

StorDriver/dm_stats

true に設定されている場合、LINSTORはボリュームの作成後に dmstats create $device を呼び出し、削除後には dmstats delete $device --allregions を呼び出します。現在は、LVMおよびLVM_THINストレージプロバイダーのみが有効です。

3.6. ストレージプロバイダー

LINSTOR にはいくつかのストレージプロバイダーがあります。最も使用されているのは LVM と ZFS です。しかし、これら 2 つのプロバイダーについても、シンプロビジョニングされた異なるサブタイプがすでに存在します。

  • Diskless: このプロバイダータイプには、 Managing Network Interface Cards で説明されているように PrefNic などの LINSTOR プロパティで構成できるストレージプールがほとんどの場合必要です。

  • LVM / LVM-Thin: 管理者は、対応するストレージタイプを使用するために LVM ボリュームグループまたは thin-pool (“LV/thinpool” の形式で) を指定することが期待されています。これらのドライバは、以下のプロパティを微調整するためのサポートを提供しています。

    • StorDriver/LvcreateOptions : このプロパティの値は、LINSTOR が実行するすべての lvcreate …​ 呼び出しの LINSTOR 実行に追加されます。

  • ZFS / ZFS-Thin: 管理者は、LINSTORが使用すべきZPoolを指定することが期待されています。これらのドライバは、微調整用に以下のプロパティをサポートしています。

    • StorDriver/ZfscreateOptions: このプロパティの値は、LINSTOR が実行するすべての zfs create …​ 呼び出しの LINSTOR 実行に追加されます。

  • File / FileThin: 主にデモンストレーションや実験に使用されます。LINSTORは指定されたディレクトリにファイルを確保し、そのファイルの上に loopデバイス を構成します。

  • Exos [廃止されました]: この特別なストレージプロバイダは現在「特別なサテライト」上で実行する必要があります。EXOS Integration 章を参照してください。

  • SPDK: 管理者は、LINSTORが使用するべき論理ボリュームストアを指定する必要があります。このストレージプロバイダの使用は、 NVME Layer の使用を意味します。

    • Remote-SPDK: この特別なストレージプロバイダーは現在「特別なサテライト」上で実行する必要があります。詳細については Remote SPDK Provider を参照してください。

3.6.1. 異なるストレージプロバイダーのストレージプールを混在させる

LINSTORリソースは通常、1つの ストレージプロバイダ タイプで構成されるストレージプールによってバックアップされますが、LINSTORリソースをバックアップするために異なるタイプのストレージプールを使用することも可能です。これを混合ストレージプールと呼びます。これはストレージリソースの移行時に便利かもしれませんが、いくつかの影響をもたらす可能性があります。混合ストレージプールの構成前に、このセクションを注意深く読んでください。

ストレージプールを混在させるための前提条件:

ストレージプールを混在させるには、次の前提条件があります。

  • LINSTOR version 1.27.0 or later

  • LINSTOR satellite nodes need to have DRBD version 9.2.7 (or 9.1.18 if on the 9.1 branch) or later

  • LINSTORプロパティ AllowMixingStoragePoolDriver が、LINSTORコントローラ、リソースグループ、またはリソース定義のLINSTORオブジェクトレベルで true に設定されています。

LINSTORのオブジェクト階層のため、LINSTORコントローラオブジェクトに AllowMixingStoragePoolDriver プロパティを設定すると(linstor controller set-property AllowMixingStoragePoolDriver true)、そのプロパティは、 false に設定されているリソースグループやリソース定義を除くすべてのLINSTORリソースに適用されます。
ストレージプールが混在していると見なされる場合:

次のいずれかの基準を満たす場合、LINSTOR はセットアップをストレージプールの混合として考慮します。

  1. ストレージプールには異なる領域サイズがあります。例えば、デフォルトではLVMの領域サイズは4MiBですが、ZFS(バージョン2.2.0以降)の領域サイズは16KiBです。

  2. ストレージプールには、例えば完全な初期同期や日0ベースの部分同期など、異なるDRBD初期同期戦略があります。 zfs および zfsthin ストレージプロバイダーがバックアップされたストレージプールを一緒に使用すると、それぞれが初期日0ベースの部分DRBD同期戦略を使用しているため、この基準を満たさないでしょう。

ストレージプールの混合の結果:

複数のストレージプールを組み合わせてバックアップするLINSTORリソースを作成する際は、LINSTORの機能に影響を及ぼす可能性があります。例えば、lvm と `lvmthin `ストレージプールを混在させると、そのような組み合わせでバックアップされた任意のリソースは、厚いリソースと見なされます。これが、LINSTORがストレージプールの混在を許可する仕組みです。

これには、 zfszfsthin ストレージプールを組み合わせる例が挙げられます。LINSTORは、 zfszfsthin ストレージプールを組み合わせてもストレージプールを混在させたとは考えません。なぜなら、これらの2つのストレージプールは同じ拡張サイズを持ち、両方のストレージプールが同じDRBD初期同期戦略であるday 0ベースの部分同期を使用するためです。

3.6.2. リモート SPDK プロバイダー

リモート SPDK のストレージプールは、特別なサテライトでのみ作成できます。最初に次のコマンドを使用して新しいサテライトを開始する必要があります。

$ linstor node create-remote-spdk-target nodeName 192.168.1.110

これにより、コントローラーと同じマシンで実行されている新しいサテライトインスタンスが開始されます。この特別なサテライトは、リモート SPDK プロキシに対してすべての REST ベースの RPC 通信を実行します。LINSTOR コマンドのヘルプメッセージが示すように、管理者はこの特別なサテライトを作成するときに設定を追加したい場合があります。

$ linstor node create-remote-spdk-target -h
usage: linstor node create-remote-spdk-target [-h] [--api-port API_PORT]
                                              [--api-user API_USER]
                                              [--api-user-env API_USER_ENV]
                                              [--api-pw [API_PW]]
                                              [--api-pw-env API_PW_ENV]
                                              node_name api_host

--api-* とそれに対応する --api-\*-env バージョンの違いは、-env で終わるバージョンは、実際に使用する値が含まれている環境変数を探しますが、--api-\* バージョンは直接、LINSTOR プロパティに保存されている値を取得します。管理者は、--api-pw を平文で保存したくないかもしれません。これは、linstor node list-property <nodeName> のようなコマンドを使用すると明らかに見ることができます。

特別なサテライトが稼働し始めたら、実際のストレージプールを作成できます。

$ linstor storage-pool create remotespdk -h
usage: linstor storage-pool create remotespdk [-h]
                                              [--shared-space SHARED_SPACE]
                                              [--external-locking]
                                              node_name name driver_pool_name

node_name は自明ですが、name は LINSTOR ストレージプールの名前であり、 driver_pool_name は SPDK 論理ボリュームストアを指定します。

remotespdk ストレージプールが作成されたら、残りの手続きはNVMeの使用と非常に似ています。まず、ターゲットを作成するために、単純な「diskful」リソースを作成し、 --nvme-initiator オプションを有効にした2つ目のリソースを作成します。

3.7. ネットワークインターフェイスカードの管理

LINSTORは1台のマシン内で複数のネットワークインターフェイスカード(NICs)を扱うことができます。LINSTORの用語ではこれらは「net interfaces」と呼ばれています。

サテライト ノードが作成されると、最初のネット インターフェイスが「default」という名前で暗黙的に作成されます。サテライトノードを作成するときに、node create コマンドの –interface-name オプションを使用して別の名前を付けることができます。

既存のノードの場合、次のように追加のネットインターフェイスが作成されます。

# linstor node interface create node-0 10G_nic 192.168.43.231

ネットインターフェイスは IP アドレスのみで識別されます。名前は任意であり、Linux で使用される NIC 名とは関係ありません。次に、ネットインターフェイスをノードに割り当てて、ノードの DRBD トラフィックが対応する NIC を介してルーティングされるようにします。

# linstor node set-property node-0 PrefNic 10G_nic
ストレージプールに「PrefNic」プロパティを設定することもできます。ストレージプールを使用するリソースからの DRBD トラフィックは、対応する NIC 経由でルーティングされます。ただし、ここで注意が必要です。ディスクレスストレージを必要とする DRBD リソース (たとえば、DRBD クォーラムの目的でタイブレーカーの役割を果たしているディスクレス ストレージ) は、「default」ネットインターフェイスの「PrefNic」プロパティを設定するまで、デフォルトのサテライトノードのネットインターフェイスを通過します。セットアップが複雑になる可能性があります。ノードレベルで「PrefNic」プロパティを設定する方がはるかに簡単で安全です。これにより、ディスクレスストレージプールを含む、ノード上のすべてのストレージプールが優先 NIC を使用します。

必要なのは、 コントローラー-サテライト通信 のためのインターフェースを追加することです。上記の node interface create コマンドを使用してインターフェースを追加できます。その後、接続を修正して、アクティブなコントローラー-サテライト接続にします。たとえば、すべてのノードに 1G-satconn という名前のインターフェースを追加した場合、インターフェースを追加した後に、次のコマンドを入力してLINSTORにこのインターフェースをコントローラー-サテライト通信に使用するよう指示できます。

# linstor node interface modify node-0 1G-satconn --active

この変更を確認するためには、linstor node interface list node-0 コマンドを使用してください。コマンドの出力には、StltCon ラベルが 1G-satconn インターフェースに適用されていることが表示されるはずです。

この方法では指定されたNICを介してDRBDトラフィックをルーティングしますが、例えば、LINSTORクライアントからコントローラに発行するコマンドなど、LINSTORコントローラークライアント間のトラフィックを特定のNICを介してルーティングすることは、linstor コマンドだけでは不可能です。これを実現するためには、次のいずれかの方法を取ることができます:

  • LINSTORクライアントの使用方法 に記載されている方法を使用して、LINSTORコントローラーを特定し、コントローラーへの唯一のルートを、コントローラーとクライアント間の通信に使用したいNICを通じて指定してください。

  • ip routeiptables などの Linux ツールを使用して、LINSTOR クライアントコントローラートラフィックのポート番号 3370 をフィルタリングし、特定の NIC を介してルーティングする。

3.7.1. LINSTORによる複数のDRBDパスの作成

DRBDのセットアップに 複数のネットワークパスを使用するには、PrefNic プロパティは十分ではありません。代わりに、次のように linstor node interfacelinstor resource-connection path コマンドを使用する必要があります。

# linstor node interface create alpha nic1 192.168.43.221
# linstor node interface create alpha nic2 192.168.44.221
# linstor node interface create bravo nic1 192.168.43.222
# linstor node interface create bravo nic2 192.168.44.222

# linstor resource-connection path create alpha bravo myResource path1 nic1 nic1
# linstor resource-connection path create alpha bravo myResource path2 nic2 nic2

例では、最初の4つのコマンドは、各ノード(alphabravo)にネットワークインターフェース(nic1nic2)を定義し、ネットワークインターフェースのIPアドレスを指定しています。最後の2つのコマンドは、LINSTORが生成するDRBDの .res ファイルにネットワークパスエントリを作成します。これが生成された .res ファイルの該当部分です。

resource myResource {
  ...
  connection {
    path {
      host alpha address 192.168.43.221:7000;
      host bravo address 192.168.43.222:7000;
    }
    path {
      host alpha address 192.168.44.221:7000;
      host bravo address 192.168.44.222:7000;
    }
  }
}
ノードインターフェースを作成する際に、LINSTORサテライトトラフィックに使用するポート番号を指定することは可能ですが、このポート番号はDRBDリソース接続パスを作成する際に無視されます。その代わり、コマンドは動的にポート番号を割り当て、ポート番号7000から増分して割り当てます。LINSTORがポートを動的に割り当てる際に使用するポート番号範囲を変更したい場合は、LINSTORコントローラーオブジェクトの TcpPortAutoRange プロパティを設定することができます。詳細については、linstor controller set-property --help を参照してください。デフォルトの範囲は7000から7999です。
新しい DRBD パスを追加するとデフォルトパスにどのように影響するか.

LINSTORサテライトノード上で最初に順番に配置されたNICは、「default」ネットインターフェースと名前が付けられています。具体的に構成されたリソース接続パスを持たない2つのノード間を移動するDRBDトラフィックは、この「default」ネットインターフェースを使用する暗黙的な経路を取ります。

二つのノード間にDRBDをバックエンドとするリソースの接続パスを追加すると、二つのノード間のDRBDトラフィックはこの新しいパスのみを使用します。ただし、 デフォルト のネットワークインターフェースはそれぞれのノードに依然として存在します。新しいパスが暗黙のデフォルトパスとは異なるNICを使用している場合、これは重要なポイントとなります。

デフォルトのパスを再度使用するには、追加で新しいパスに加えて、明示的にそれを追加する必要があります。例えば、

# linstor resource-connection path create alpha bravo myResource path3 default default

新たに作成された path3 は、両ノードで default という名前のネットワークインターフェースを使用していますが、このパス自体は他のパス、つまり path1path2 が存在するため、デフォルトパスではありません。新しいパス path3 は単に第三の可能なパスとして機能し、DRBDのトラフィックとパス選択の動作は次のセクションで説明されている通りになります。

複数のDRBDパスの動作

複数の DRBD パス構成の動作は、利用する DRBD トランスポートのタイプによって異なります。DRBD ユーザーガイド[1]に詳細が記載されています。

TCPトランスポートは1度に1つのパスを使用します。 もしバックグラウンドのTCP接続が切断されたり、タイムアウトを示した場合、TCPトランスポートの実装は次のパス上で接続を確立しようとします。 すべてのパスをラウンドロビン方式で通り、接続が確立されるまで続きます。

RDMA転送は接続のすべてのパスを同時に使用し、パス間のネットワークトラフィックを均等に分散します。

3.8. 暗号化ボリューム

LINSTORはDRBDボリュームの暗号化を透過的に扱うことができます。dm-cryptがストレージデバイスから提供されるストレージを暗号化するのに使われます。

dm-crypt を使用するには、’cryptsetup’ がインストールされていることを、サテライトを起動する前に確認してください。

暗号化の基本的な手順は以下になります。

  1. マスターパスフレーズを作成する

  2. luks をレイヤーリストに追加してください。すべてのプラグイン(例:Proxmox)は、明示的に他に指定しない限り、DRBDレイヤーを最上位のレイヤーとして必要とします。

  3. コントローラが再起動した後はマスターパスフレーズを再入力する

3.8.1. 暗号化のコマンド

以下にコマンドの詳細を示します。

LINSTORがボリュームを暗号化する前に、マスターパスフレーズを作成する必要があります。これはLINSTORクライアントで行うことができます。

# linstor encryption create-passphrase

crypt-create-passphrase はマスターパスフレーズを初期化するためにユーザの入力を待ちます。

マスターパスフレーズを変更したい場合は以下のコマンドで行います。

# linstor encryption modify-passphrase

resource-definition またはリソース自体を作成するときに luks レイヤーを追加できますが、前者の方法は、resource-definition から作成されたすべてのリソースに自動的に適用されるため、推奨されます。

# linstor resource-definition create crypt_rsc --layer-list luks,storage

マスターパスフェーズを入力する(コントローラを再起動した後)には以下を使用します。

# linstor encryption enter-passphrase
linstor-controllerが再起動したときは、コントローラにマスターパスフェーズを常に入力する必要があります。そうしないとLINSTORは暗号化されたボリュームをオープンしたり作成したりできません。

3.8.2. 自動パスフレーズ

マスターパスフレーズの作成と再入力のプロセスを自動化することは可能です。

これを使用するには、 MASTER_PASSPHRASE という名前の環境変数、またはマスターパスフレーズを含む /etc/linstor/linstor.toml のエントリを作成する必要があります。

linstor.toml は以下のようになります。

[encrypt]
passphrase="example"

もしどちらかが設定されている場合、コントローラーが起動する度にマスターパスフレーズがすでに存在するかどうかをチェックします。もし存在しない場合は、指定された通りに新しいマスターパスフレーズを作成します。存在する場合は、コントローラーはパスフレーズを入力します。

マスターパスフレーズが既に設定されており、その環境変数や linstor.toml で指定されているものと異なる場合、コントローラーはマスターパスフレーズを再入力できず、ユーザーが間違ったパスフレーズを入力したかのように反応します。これは、コントローラーが自動的なパスフレーズなしで起動された場合と同じコマンドを使用して、ユーザーが手動で入力することでのみ解決できます。
マスターパスフレーズが環境変数と linstor.toml の両方に設定されている場合、linstor.toml からのマスターパスフレーズのみが使用されます。

3.9. クラスター状態の確認

LINSTORは、クラスタの状態を確認するためのさまざまなコマンドを提供しています。これらのコマンドは、’list’の接頭辞で始まり、その後にさまざまなフィルタリングやソートオプションを使用することができます。’–groupby’オプションを使用して、出力を複数の次元でグループ化および並べ替えることができます。

# linstor node list
# linstor storage-pool list --groupby Size

3.10. ノードの退避

LINSTOR コマンド node evacuate を使用して、ノードのリソースを退避することができます。たとえば、クラスターからノードを削除する準備をしていて、ノードのリソースをクラスター内の他のノードに移動する必要がある場合です。ノードの退避に成功すると、ノードの LINSTOR ステータスは “Online” ではなく “EVACUATE” と表示され、LINSTOR リソースを持ちません。

LINSTOR が Kubernetes や OpenNebula などの別の環境内にデプロイされているノードを退避する場合は、リソースを退避する前に、ノードの LINSTOR でサポートされているワークロードをクラスター内の別のノードに移動する必要があります。Kubernetes 環境については Kubernetes でのノードの退避 を参照してください。OpenNebula の LINSTOR ノードの場合、ノードのリソースを退避する前に、ノードがホストする OpenNebula LINSTOR ベースの仮想マシンをクラスター内の別のノードにライブマイグレードする必要があります。

次の手順でノードを退避します。

  1. 退避するノード上のリソースが “InUse” であるかどうかを確認します。 “InUse” ステータスは、リソースが DRBD Primary 状態です。ノードを正常に退避させるには、ノード上のリソースを “InUse” にしないでください。そうしないと、LINSTOR は退避中にノードから “InUse” リソースを削除できません。

  2. linstor node evacuate <node_name> を実行します。退避ノード上のリソースに適した代替ノードがない場合は、警告が表示されます。たとえば、3 つのノードがあり、1 つを退避したいが、リソースグループで配置数が 3 に設定されている場合、ノードが退避ノードからリソースを削除できないという警告が表示されます。

  3. ノードの linstor node list のステータスが、 “Online” ではなく、 “EVACUATE” であることを確認してください。

  4. linstor resource list コマンドを使用して、ノード上のリソースの「状態」ステータスを確認してください。ノードのリソースに含まれるデータセットのサイズに応じて、しばらくの間同期が行われる活動が見られるはずです。

  5. linstor resource list --nodes <node_name> コマンドを使用して、ノード上の残りのリソースを一覧表示します。残っている場合は、同期が完了するのを待っているだけかどうかを確認します。

  6. linstor resource list コマンドを使用して、ノードにリソースがないことを確認します。

  7. linstor node delete node_name> コマンドを使用して、クラスタからノードを削除します。

3.10.1. 複数のノードの退避

一部の避難ケースでは特別な計画が必要になることがあります。たとえば、複数のノードを避難させる場合、LINSTORのリソース自動配置機能からノードを除外する必要があります。避難させたい各ノードで次のコマンドを使用することでこれを実行できます。

# linstor node set-property <node_name> AutoplaceTarget false

これにより、退避しようとしているノードから、退避を計画している別のノードに LINSTOR がリソースを配置することがなくなります。

3.10.2. 退避ノードの復元

もしすでに完了しているか、まだリソースが「Evacuating」状態にある node evacuate コマンドを実行している場合、node restore コマンドを使用してノードから「Evacuating」状態を削除することができます。これは、まだ node delete コマンドを実行していない場合に機能します。

ノードを復元した後は、前に AutoplaceTarget プロパティを “false” に設定していた場合は、node set-property <node_name> AutoplaceTarget true コマンドを使用する必要があります。これにより、LINSTORは再度リソースを自動的にノードに配置して、クラスター内のリソースに設定した配置数のプロパティを満たすことができます。

node restore コマンドを実行する際にLINSTORがすでにリソースを避難させている場合、避難されたリソースは自動的にノードに戻りません。 LINSTORがまだリソースを避難中の場合、この過程は続行され、LINSTORがリソースを他のノードに配置するまで続きます。 元のノードに以前配置されていたリソースを手動で「移動」する必要があります。これは、まず復元されたノードにリソースを作成し、その後、LINSTORがそれらを配置した可能性のある他のノードからリソースを削除することで行います。 resource list コマンドを使用して、どのノードにリソースが配置されているかを確認できます。

3.11. リソースのスナップショットとバックアップの取り扱い

LINSTORは、thin LVMまたはZFSストレージプールでバックアップされたリソースのスナップショットを取ることをサポートしています。スナップショットを作成して転送することで、LINSTORリソースを他のストレージにバックアップすることができます。これは、S3ストレージまたは別の(または同じ)LINSTORクラスタ内のストレージにバックアップする際に有用です。以下のサブセクションでは、スナップショットとバックアップの作業に関連するさまざまな側面について説明します。

3.11.1. スナップショットの作成

ノードに配置された’resource1’という名前のリソースを想定して、そのリソースのスナップショットを作成するには、次のコマンドを入力してください。

# linstor snapshot create resource1 snap1

これにより、リソースが存在するすべてのノードでスナップショットが作成されます。LINSTORは、リソースがアクティブに使用されている場合でも、一貫したスナップショットを作成します。

リソース定義のプロパティ AutoSnapshot/RunEvery を設定すると、LINSTOR は自動的に X 分ごとにスナップショットを作成します。オプションのプロパティ AutoSnapshot/Keep を使用して、自動的に作成された古いスナップショットをクリーンアップすることができます。手動で作成したスナップショットはクリーンアップされることはありません。AutoSnapshot/Keep が省略された場合(または ⇐ 0 )、LINSTOR はデフォルトで最新の 10 つのスナップショットを保持します。

# linstor resource-definition set-property AutoSnapshot/RunEvery 15
# linstor resource-definition set-property AutoSnapshot/Keep 5

3.11.2. スナップショットの復元

次の手順によって、スナップショットを新しいリソースに復元することができます。元のリソースがスナップショットを取得したノードから削除されていた場合でも、この操作は可能です。

最初にスナップショットに一致するボリュームをもつリソースを定義します。

# linstor resource-definition create resource2
# linstor snapshot volume-definition restore --from-resource resource1 \
  --from-snapshot snap1 --to-resource resource2

必要に応じて追加の構成を適用できる段階になります。それから、準備ができたら、スナップショットを基にリソースを作成します。

# linstor snapshot resource restore --from-resource resource1 \
  --from-snapshot snap1 --to-resource resource2

この操作により、スナップショットが存在するすべてのノードに新しいリソースが配置されます。リソースを配置するノードを明示的に選択することもできます。詳細はヘルプを参照してください(linstor snapshot resource restore --help)。

3.11.3. スナップショットへのロールバック

LINSTORはリソースをスナップショットの状態に巻き戻すことができます。リソースは使用中であってはいけません。つまり、リソースはどのノードにもマウントされていてはいけません。もしリソースが使用中であれば、代わりに スナップショットを復元する ことで目標を達成できるかどうか考えてください。

ロールバックは次のようにして実行します。

# linstor snapshot rollback resource1 snap1

リソースは、最新のスナップショットにのみロールバックできます。古いスナップショットに戻すには、まず中間のスナップショットを削除してください。

3.11.4. スナップショットの削除

スナップショットの削除は以下のコマンドで行います。

# linstor snapshot delete resource1 snap1

3.12. スナップショットの転送

スナップショットは、同じLINSTORクラスタ内のノード間、異なるLINSTORクラスタ間、または Amazon S3MinIO のようなS3ストレージに転送できます。

スナップショットを送受信するサテライトには、次のツールをインストールします。

  • zstd はデータが転送される前に圧縮するために必要です。

  • LVMのthinプロビジョニングボリュームを使用する際には、データを転送するために thin-send-recv が必要です。

これらのツールをインストールした後は、サテライトノード(またはノード)を再起動する必要があります。そうしないと、LINSTORはこれらのツールを使用できません。

3.12.1. スナップショット形式の配送リモートとの作業

LINSTORクラスターでは、スナップショットの転送先をリモートと呼びます。現在、スナップショットを転送する際に使用できる2つの異なる種類のリモートがあります: LINSTORリモートとS3リモート。 LINSTORリモートは、スナップショットを別のLINSTORクラスターや同じLINSTORクラスター内に転送するために使用されます。 S3リモートは、スナップショットをAWS S3、MinIO、またはS3互換のオブジェクトストレージを使用する他のサービスに転送するために使用されます。 リモート上に転送されたスナップショットはバックアップとも呼ばれます。

リモートはパスワードなどの機密データを保存する必要があるため、リモートをどのように使用するかにかかわらず、いつでも暗号化を有効にする必要があります。LINSTORの暗号化の設定方法はこちらに記載されています。
S3リモートの作成

S3リモートを作成するには、LINSTORはエンドポイントの情報(つまり、対象となるS3サーバーのURL)、対象バケットの名前、S3サーバーが存在する地域、およびバケットにアクセスするために使用するアクセスキーとシークレットキーが必要です。シークレットキーを追加せずにコマンドを送信すると、入力を求めるプロンプトが表示されます。コマンドは次のようになります:

# linstor remote create s3 myRemote s3.us-west-2.amazonaws.com \
  my-bucket us-west-2 admin password
通常、LINSTORはエンドポイントとバケットを使用して、与えられたバケットへのアクセスに仮想ホスト形式を使用したURLを作成します(例:my-bucket.s3.us-west-2.amazonaws.com)。もし設定がこの方法でのアクセスを許可していない場合は、s3.us-west-2.amazonaws.com/my-bucket のようなパス形式でアクセスするようにリモートを変更し、--use-path-style 引数を追加してLINSTORがパラメータを適切に組み合わせるようにします。
LINSTOR リモートの作成

LINSTORリモートを作成するには、リモートの名前とターゲットクラスタのコントローラのURLまたはIPアドレスを指定するだけです。例として、次のようなコマンドがあります:

# linstor remote create linstor myRemote 192.168.0.15

2つのLINSTORクラスタ間、または同じLINSTORクラスタ内でスナップショットを転送するには、ソースクラスタに対象クラスタを指すリモートを作成するだけでなく、対象クラスタでもソースクラスタを指すLINSTORリモートを作成する必要があります。これは、未知のソースからのバックアップ転送を受け入れないようにするためです。対象クラスタでこのようなリモートを作成するには、remote create コマンドに追加の引数としてソースクラスタのクラスタIDを指定します。詳細については、 LINSTOR へのスナップショットの送信 を参照してください。

リモートの一覧表示、変更、削除

ローカルクラスタに知られているすべてのリモートを表示するには、 linstor remote list を使用します。 リモートを削除するには、linstor remote delete myRemoteName を使用します。 既存のリモートを変更する必要がある場合は、 linstor remote modify を使用して変更してください。

リモートを作成する際にLINSTORのパスフレーズを指定します。

欲しいスナップショットにLUKSのレイヤーが含まれている場合、ターゲットクラスターのリモートでも、リモートを作成する際にソースクラスターのパスフレーズが必要です。これは、LUKSのパスフレーズを暗号化するためにLINSTORのパスフレーズが使用されるためです。ターゲットクラスターでLINSTORリモートを作成する際にソースクラスターのLINSTORのパスフレーズを指定するには、入力してください。

$ linstor --controllers <TARGET_CONTROLLER> remote create linstor \
--cluster-id <SOURCE_CLUSTER_ID> --passphrase <SOURCE_CONTROLLER_PASSPHRASE> <NAME> <URL>

LINSTORからLINSTORスナップショットの転送を行うには、ソースクラスタにもLINSTORリモートを作成する必要があります。簡単のため、厳密には必須ではありませんが、バックアップやスナップショットを転送する前に、ソースクラスタでターゲットクラスタのLINSTORパスフレーズを指定することができます。ソースクラスタで、次のように入力してください:

$ linstor --controllers <SOURCE_CONTROLLER> remote create linstor \
--cluster-id <TARGET_CLUSTER_ID> --passphrase <TARGET_CONTROLLER_PASSPHRASE> <NAME> <URL>
もしあなたが 高可用性コントローラ を所有しているために、LINSTORコントローラノードを指定する場合、リモートを作成する際には、コントローラをIPアドレスまたは解決可能なホスト名で指定できます。

3.12.2. S3リモートへのスナップショットの送信

スナップショットをS3リモートに送信するには、つまり、リソースのバックアップをS3リモートに作成するには、現在のクラスタがアクセスできるS3リモートを指定し、送信するリソースを指定するだけです。次のコマンドは、リソース myRsc のスナップショットを作成し、指定したS3リモート myRemote に送信します:

# linstor backup create myRemote myRsc

もし、このリソースのバックアップをこのリモートに転送するのが初めてでなく、以前のバックアップのスナップショットがまだ削除されていない場合、差分バックアップが転送されます。フルバックアップを強制的に作成するには、コマンドに --full 引数を追加してください。特定のノードにバックアップを転送させることも可能で、--node myNode を使用しますが、指定されたノードが利用できないかリソースのディスクがない場合は、別のノードが選択されます。

3.12.3. LINSTOR リモートにスナップショットを送信する

リモート LINSTOR を指定することで、2つの LINSTOR クラスター間でスナップショットを転送することができます。リモートの LINSTOR へのスナップショット転送には、少なくとも1つのディスクフル リソースがソース側に必要です(つまり、転送コマンドを実行する側)。

LINSTORターゲットクラスター用のリモートの作成:

LINSTOR ターゲットクラスタにスナップショットを送信する前に、ターゲット側で LINSTOR リモートを作成 し、ソースクラスタのクラスタIDをリモートとして指定する必要があります。

$ linstor remote create linstor --cluster-id <SOURCE_CLUSTER_ID> <NAME> <URL>
ソースクラスタのクラスターIDを指定しないで、ターゲットクラスターでLINSTORリモートを作成すると、バックアップを転送しようとするときに「不明なクラスター」エラーが発生します。ソースクラスタのクラスターIDを取得するには、ソースクラスタからコマンド linstor controller list-properties | grep -i cluster を入力してください。
もし、 LUKSレイヤー を持つリソースのスナップショットを作成して配信する必要がある場合は、リモートを作成する際にパスフレーズを指定する必要があります。

上記に示す remote create コマンドでは、<NAME> はリモートを識別するために指定する任意の名前です。<URL> は、ソース(リモート)の LINSTOR コントローラーのIPアドレスまたはその解決可能なホスト名です。もし高可用性の LINSTOR コントローラーを構成している場合は、その仮想IPアドレス(VIP)またはVIPの解決可能な名前を使用してください。

LINSTOR へのスナップショットの送信

ソースのLINSTORクラスタからリソースのスナップショットを作成し、それをターゲットのLINSTORクラスタに送信するには、次のコマンドを入力してください。

# linstor backup ship myRemote localRsc targetRsc

このコマンドは、基本的にはローカルリソースをターゲットのLINSTORリモートにバックアップするものです。

さらに、--source-node を使用して送信するノードを指定し、--target-node を使用してバックアップを受信するノードを指定することができます。これらのノードが利用できない場合、LINSTORコントローラーは自動的に異なるノードを選択します。

targetRsc がすでにリモートクラスタにデプロイされているリソースである場合、 localRsc のバックアップ転送のスナップショットはリモートクラスタに転送されますが、リモートクラスタでは復元されません。 linstor backup ship コマンドで --download-only オプションを指定した場合も同様です。

3.12.4. Snapshot Shipping Within a Single LINSTOR Cluster

同じクラスタ内でスナップショットを転送したい場合は、単純にローカルコントローラを指す LINSTOR リモートを作成する必要があります。例えば、LINSTOR コントローラにログインしている場合は、次のコマンドを入力します。

# linstor remote create linstor --cluster-id <CLUSTER_ID> <NAME> localhost

その後、 LINSTORリモートにスナップショットを送る 手順に従うことができます。

3.12.5. リモート上のバックアップを一覧表示します。

特定のS3リモートに存在するバックアップを表示するには、linstor backup list myS3Remote を使用します。リソース名をコマンドに追加して、特定のリソースのバックアップのみを表示するフィルターとして使用するには、引数 --resource myRsc を使用します。--other 引数を使用すると、LINSTORがバックアップとして認識しないバケット内のエントリのみが表示されます。LINSTORは常にバックアップを特定の方法で命名します。リモートのアイテムがこのスキーマに従って命名されている場合は、それがLINSTORによって作成されたバックアップであると推定されるため、このリストにはそれ以外のすべてが表示されます。

LINSTORリモートに存在するバックアップを表示するには、LINSTORターゲットクラスターで linstor snapshot list コマンドを使用します。

3.12.6. リモート上のバックアップを削除する

バックアップの削除に関しては、いくつかのオプションがあります。

  • linstor backup delete all myRemote : このコマンドは、バックアップであると認識されている、つまり期待されるネーミングスキーマに適合している限り、指定されたリモート上のすべての S3 オブジェクトを削除します。現在のクラスターによって作成されたバックアップのみを削除するオプション --cluster があります。

  • linstor backup delete id myRemote my-rsc_back_20210824_072543: このコマンドは、指定されたリモートから単一のバックアップを削除します。つまり、指定されたIDを持つバックアップであり、リソース名、自動生成されたスナップショット名(back_timestamp)、および設定されている場合は backup-suffix から構成されます。オプション --prefix を使用すると、指定されたIDで始まるすべてのバックアップを削除できます。オプション --cascade を使用すると、指定されたバックアップだけでなく、それに依存するすべての増分バックアップを削除できます。

  • linstor backup delete filter myRemote …​: このコマンドには、削除するバックアップの選択を指定するためのいくつかの異なる引数があります。-t 20210914_120000 は、2021年9月14日の12時より前に作成されたすべてのバックアップを削除します。-n myNode は、指定されたノードによってアップロードされたすべてのバックアップを削除します。-r myRsc は、指定されたリソース名を持つすべてのバックアップを削除します。これらのフィルターは必要に応じて組み合わせることができます。最後に、--cascade は選択されたバックアップだけでなく、選択されたバックアップに依存するすべての他の増分バックアップを削除します。

  • linstor backup delete s3key myRemote randomPictureInWrongBucket: このコマンドは指定されたS3キーを持つオブジェクトを見つけて削除します – 他の条件を考慮しません。 これはリモートから非バックアップアイテムを削除するか、他の手段で削除できなくなった壊れたバックアップを片付けるためにのみ使用すべきです。 このコマンドを使用して通常動作しているバックアップを削除すると、そのバックアップが壊れる可能性があるので注意してください!

--cascade オプションを持つすべてのコマンドは、明示的に指定しない限り、それに依存する増分バックアップを削除しません。
すべての linstor backup delete …​ コマンドには --dry-run オプションがあり、削除されるすべての S3 オブジェクトのリストが表示されます。これを使用して、削除してはならないものが誤って削除されることを防ぐことができます。

3.12.7. リモートからバックアップを復元する

バックアップを作成した後におそらく最も重要なタスクは、それを復元することでしょう。S3リモートからバックアップを復元するには、linstor backup restore コマンドを使用できます。

このコマンドを使用すると、バックアップを復元するためのS3リモートの名前、ターゲットノードの名前、およびノード上の復元先リソースの名前を指定します。リソース名が既存のリソース定義と一致しない場合、LINSTORはリソース定義とリソースを作成します。

さらに、バックアップを持つリモート上のリソースの名前を指定する必要があります。これは、--resource または --id 引数のいずれかを使用して行いますが、両方を使用することはできません。

--resource オプションを使用することで、指定したリソースの最新バックアップを復元することができます。例えば、以下のようになります。

# linstor backup restore myRemote myNode targetRsc --resource sourceRsc

--id オプションを使用することで、指定した正確なバックアップを復元することができます。たとえば、最新以外のリソースのバックアップを復元する場合などです。バックアップのIDを取得するには、 バックアップ一覧 を参照してください。

# linstor backup restore myRemote myNode targetRsc --id sourceRsc_back_20210824_072543
LINSTOR (S3以外) リモートにスナップショットを送信する際、--download-only オプションを使用しない限り、またはターゲットリソースに少なくとも1つのレプリカがある場合を除いて、スナップショットは即座にターゲット(リモート)クラスターの指定されたリソースに復元されます。

バックアップをリソースに復元すると、LINSTOR は指定したバックアップ(--id オプションを使用する場合)まで、または最新のバックアップまでのリソースの最後の完全バックアップから全てのスナップショットをダウンロードします。これらのスナップショットをダウンロードした後、LINSTOR はスナップショットを新しいリソースに復元します。backup restore コマンドに --download-only オプションを追加することで、スナップショットを新しいリソースに復元せずにスキップすることもできます。

LINSTORは、正しくセットアップされていれば、アップロードしたクラスタだけでなく、他のクラスタからもバックアップを復元するためにダウンロードできます。具体的には、対象リソースには既存のリソースやスナップショットが存在していてはならず、使用されるストレージプールは同じストレージプロバイダである必要があります。対象ノードのストレージプールがバックアップを作成したクラスタと全く同じ名前であれば、追加の操作は不要です。ただし、ノードに異なるストレージプール名がある場合は、 バックアップの復元 コマンドに --storpool-rename オプションを使用する必要があります。このオプションでは、少なくとも1つの oldname=newname ペアが期待されます。元のバックアップのすべてのストレージプールがそのリストに記載されていない場合、LINSTORは対象ノード上でストレージプールの名前がまったく同じであると仮定します。

正確にどのストレージプールをリネームする必要があり、ダウンロードと復元リソースのサイズがどれくらいになるかを知るには、linstor backup info myRemote …​ コマンドを使用します。リストアコマンドと同様に、--resource または --id オプションを指定する必要があります。backup info コマンドで使用する際、これらのオプションには backup restore コマンドで使用する際と同じ制限があります。リストア後にローカルストレージプールに残る空き容量を示すには、引数 -n myNode を追加します。実際のリストア操作と同様に、backup info コマンドは、対象ノードとソースノードのストレージプール名が完全に一致していると仮定します。そうでない場合は、リストアコマンドと同様に --storpool-rename オプションを使用できます。

LUKS レイヤーがあるバックアップの復元

バックアップを復元する際にLUKS層が含まれている場合、--passphrase 引数が必要です。この引数を使うと、バックアップ元のクラスターのパスフレーズを設定する必要があります。これにより、LINSTORがダウンロード後にボリュームを復号化し、ローカルのパスフレーズで再度暗号化できるようになります。

同時にアクティブな出荷がいくつあるかを制御する

自動化されたタスク(LINSTORの定期的なシッピングまたは外部ツール)が一度に余りにも多くの出荷を開始し、ネットワークやバックアップを送信するノードのいくつかが過負荷になる可能性があるケースがあります。

このような場合の解決策は、同じノードで同時に発生できる出荷量を減らすことです。これは、BackupShipping/MaxConcurrentBackupsPerNode プロパティを使用して行われます。このプロパティは、コントローラーまたは特定のノードで設定することができます。

このプロパティの期待値は数字です。 これを負の数に設定すると、「制限なし」として解釈されますが、ゼロに設定すると、この特定のノードがバックアップを出荷する資格がなくなります。また、コントローラーでこのプロパティを0に設定すると、バックアップ出荷が完全に無効になります。

他のどんな正の数も、ノードごとの同時アクティブな出荷の上限として扱われます。 バックアップ出荷を送信するノードを決定するために、LINSTORは以下のロジックを以下の順序で使用します:

  1. コマンドで指定されたノード(別のLINSTORクラスタに送信する場合は --source-node、S3互換ストレージに送信する場合は --node)がバックアップを送信します。

  2. 最も利用可能なバックアップスロットを持つノードがバックアップを転送します。

  3. もしノードに空きのバックアップスロットがない場合、出荷はキューに追加され、別の出荷が終了してバックアップスロットが利用可能になるとすぐに開始されます。

同じクラスター内へのスナップショットの転送

同じ LINSTOR クラスタ内の別のノードにスナップショットを転送する前に、お使いの LINSTOR クラスタの ID を指定する LINSTOR リモートオブジェクトを作成する必要があります。お使いの LINSTOR クラスタの ID を取得し、そのようなリモートを作成する手順については、 スナップショットを転送する方法 セクションを参照してください。例として、次のコマンドがあります。

# linstor remote create linstor self 127.0.0.1 --cluster-id <LINSTOR_CLUSTER_ID>
self は、あなたが指定したユーザー定義の LINSTOR リモートの任意の名前です。必要に応じて異なる名前を指定することができます。

ソースノードとターゲットノードの両方にスナップショット転送用のリソースを展開している必要があります。さらに、ターゲットリソースは非アクティブ化されている必要があります。

# linstor resource deactivate nodeTarget resource1
DRBDでリソースを非アクティブ化した後、そのレイヤーリスト内のリソースを再度アクティブ化することはできません。ただし、DRBDリソースの正常にシップされたスナップショットは、新しいリソースに 復元することができます。スナップショットのシップを手動で開始するには、次のようにします:
# linstor backup ship self localRsc targetRsc
snapshot ship コマンドは非推奨とされており、それに関するバグは修正されません。同じLINSTORクラスタ内でスナップショットを送信するには、ローカルコントローラを指すリモートを使用して、上記の例に示されているように backup ship コマンドを使用してください。LINSTORクラスタをリモートとして構成する詳細については、 LINSTOR リモートにスナップショットを送信する セクションを参照してください。

デフォルトでは、スナップショット送信機能は TCP ポートを 12000 から 12999 の範囲で使用します。この範囲を変更するには、コントローラーに設定できる SnapshotShipping/TcpPortRange プロパティを設定します。

# linstor controller set-property SnapshotShipping/TcpPortRange 10000-12000

リソースは定期的に出荷することも可能です。これを実現するには、リソース定義に SnapshotShipping/TargetNode および SnapshotShipping/RunEvery のプロパティを設定することが必須です。SnapshotShipping/SourceNode も設定できますが、省略した場合、LINSTORは同じリソース定義のアクティブなリソースを選択します。

増分スナップショット転送を可能にするには、LINSTOR は少なくとも最後に転送されたスナップショットをターゲットノードに保持する必要があります。プロパティ SnapshotShipping/Keep は、LINSTOR が保持する必要があるスナップショットの数を指定するために使用できます。プロパティが設定されていない(または 0 以下)の場合、LINSTOR はデフォルトで最新の10個のスナップショットを保持します。

# linstor resource-definition set-property resource1 SnapshotShipping/TargetNode nodeTarget
# linstor resource-definition set-property resource1 SnapshotShipping/SourceNode nodeSource
# linstor resource-definition set-property resource1 SnapshotShipping/RunEvery 15
# linstor resource-definition set-property resource1 SnapshotShipping/Keep 5

3.13. 計画されたバックアップの配信

LINSTOR Controller バージョン 1.19.0 以降、LINSTOR クライアントバージョン 1.14.0 以降では、配置された LINSTOR リソースのスケジュールバックアップの配信を設定することができます。

定期的なバックアップの配信は、3つのパートで構成されています。

  • バックアップと配信を行いたい1つまたは複数のLINSTORリソースからなるデータセット

  • バックアップの配信先(他のLINSTORクラスタまたはS3インスタンス)

  • バックアップを発行するタイミングを定義するスケジュール

LINSTORのバックアップ転送は、LINSTORでサポートされているスナップショット機能を持つthin-provisioned LVMおよびZFSストレージプールでバックアップされた展開済みLINSTORリソースにのみ適用されます。

3.13.1. バックアップの配信スケジュールを作成する

LINSTORクライアントの schedule create コマンドを使用してバックアップ出荷スケジュールを作成し、cron 構文を使用してバックアップ配信の頻度を定義します。また、スケジュールに名前を付けるオプションを設定し、障害発生時の対応、ローカルとリモートのバックアップコピーの数、増分バックアップの配信をスケジュールするかどうかなど、バックアップ配信の様々な側面を定義する必要があります。

最低限、このコマンドはバックアップ出荷スケジュールを作成するために、スケジュール名とフルバックアップcronスキーマを必要とします。コマンドの例は次のようになります。

# linstor schedule create \
  --incremental-cron '* * * * *' \ (1)
  --keep-local 5 \ (2)
  --keep-remote 4 \ (3)
  --on-failure RETRY \ (4)
  --max-retries 10 \ (5)
  <schedule_name> \ (6)
  '* * * * *' # full backup cron schema (7)
cronスキーマは一重引用符または二重引用符で囲んでください。
1 指定された場合、増分cronスキーマは、増分バックアップを作成し、出荷する頻度を記述します。新しいインクリメンタルバックアップは、最新のフルバックアップに基づいて行われます。
2 The --keep-local option allows you to specify how many snapshots that a full backup is based upon should be kept at the local backup source. If unspecified, all snapshots will be kept. [OPTIONAL]
3 --keep-remote オプションは、リモートバックアップ先で保持するフルバックアップの数を指定することができます。このオプションはS3リモートバックアップ先でのみ機能します。なぜなら、クラスタノードが他のクラスタ内のノードからバックアップを削除することを許可したくないからです。削除されたフルバックアップに基づくすべての増分バックアップも、リモートディスティネーションで削除されます。指定しない場合、--keep-remote オプションはデフォルトで “all” になります。[OPTIONAL]
4 スケジュールされたバックアップの出荷が失敗した場合に、”RETRY “または “SKIP “のどちらを行うかを指定します。SKIP” が指定された場合、LINSTORは失敗を無視し、次に予定されているバックアップの配送を続行します。RETRY” が指定された場合、LINSTORは60秒待って、再度バックアップの配送を試みます。LINSTOR の schedule create コマンドは --on-failure オプションが与えられないと、デフォルトで “SKIP” になります。[OPTIONAL]
5 バックアップの出荷が失敗し、--on-failure RETRY オプションが指定された場合、バックアップの出荷を再試行する回数です。このオプションがない場合、LINSTORコントローラはスケジュールされたバックアップの出荷を、成功するまで無期限に再試行します。[OPTIONAL]
6 スケジュールリスト、修正、削除、有効、無効コマンドで後で参照できるように、バックアップスケジュールに付ける名前です。[REQUIRED]
7 このcronスキーマは、LINSTORがどの程度の頻度でスナップショットを作成し、フルバックアップを出荷するかを記述しています。
増分cronスキーマを指定した場合、フルcronスキーマと重複しているため、両方のバックアップが同時に行われる場合、LINSTORはフルバックアップのみを作成し、出荷します。例えば、3時間ごとにフルバックアップを行い、1時間ごとに増分バックアップを行うように指定した場合、3時間ごとにLINSTORはフルバックアップのみを作成し出荷します。この理由から、増分バックアップとフルバックアップの出荷スケジュールの両方に同じcronスキーマを指定しても、増分バックアップは決して作成されないため、意味がありません。

3.13.2. バックアップの配信スケジュールを変更する

LINSTORクライアントの schedule modify コマンドを使用すると、バックアップの出荷スケジュールを変更することができます。 このコマンドの構文は schedule create コマンドの構文と同じです。schedule modify` コマンドで指定する名前は、すでに存在するバックアップスケジュールでなければなりません。コマンドのオプションで指定しないものは、既存の値を保持します。keep-local` または keep-remote オプションをデフォルト値に戻したい場合は、”all “に設定します。max-retries` オプションをデフォルトの値に戻したい場合は、”forever” に設定します。

3.13.3. Configuring the Number of Local Snapshots and Remote Backups to Keep

物理ストレージは無限ではなく、リモートストレージにはコストがかかるため、スナップショットやバックアップの保存数に制限を設けるとよいでしょう。

--keep-remote オプションと --keep-local オプションの両方が特筆すべきであり、その影響は明らかでない部分もあります。これらのオプションを使用すると、ローカルソースまたはリモート先のいずれかに保存されるスナップショットや完全バックアップの数を指定します。

ローカル保持オプションの設定:

例えば、--keep-local=2 オプションが設定されている場合、バックアップの出荷スケジュールは、最初の実行時に、フルバックアップのためのスナップショットを作成することになります。次にスケジュールされたフルバックアップの出荷では、フルバックアップのための2番目のスナップショットを作成します。次のスケジュールされたフルバックアップの出荷では、フルバックアップのための3番目のスナップショットが作成されます。しかし今回は、正常に完了すると、LINSTORは最初の(最も古い)フルバックアップの出荷用スナップショットを削除します。もしスナップショットがこのフルバックアップに基づく増分バックアップのために作成された場合、それらはローカルソースノードから削除されます。次のフルバックアップの出荷が成功すると、LINSTORは2番目のフルバックアップのスナップショットとそれに基づくすべての増分スナップショットを削除し、これを繰り返すことで各バックアップの出荷が成功します。

もし失敗した出荷から残っているローカルスナップショットがある場合、それらは、後から作成されたものであっても、最初に削除されます。

バックアップ配信スケジュールを有効にしている場合、後から手動で LINSTOR スナップショットを削除した場合、LINSTOR は削除すべきすべてを削除できない可能性があります。例えば、フルバックアップスナップショットの定義を削除した場合、後でフルバックアップの予定された配信で、手動で削除したフルバックアップスナップショットに基づく増分スナップショットが削除されないかもしれません。

保持リモートオプションの設定

上記の linstor schedule create コマンドの例のコールアウトで述べたように、 keep-remote オプションはS3リモートデスティネーションに対してのみ機能します。ここでは、このオプションがどのように機能するかの例を示します。keep-remote=2` オプションが設定されている場合、バックアップ出荷スケジュールは、最初の実行時に、フルバックアップ用のスナップショットを作成し、それをリモートデスティネーションに出荷します。次にスケジュールされたフルバックアップの出荷では、2番目のスナップショットが作成され、フルバックアップがリモートデスティネーションに出荷されます。次にスケジュールされたフルバックアップの出荷時に、3つ目のスナップショットが作成され、フルバックアップがリモートディスティネーションに出荷されます。今回はさらに、3つ目のスナップショットが正常に出荷された後、最初のフルバックアップがリモートディスティネーションから削除されます。フルバックアップの間に増分バックアップがスケジュールされていた場合、最初のフルバックアップから作成されたものはフルバックアップと一緒に削除されます。

このオプションは、リモート宛先のバックアップを削除するだけです。ローカル ソース ノードでのフル バックアップの基となったスナップショットは削除されません。

3.13.4. バックアップの配信スケジュールを記載する

linstor schedule list` コマンドを使用すると、バックアップの配信スケジュールを一覧することができます。

For example:

# linstor schedule list
╭──────────────────────────────────────────────────────────────────────────────────────╮
┊ Name                ┊ Full        ┊ Incremental ┊ KeepLocal ┊ KeepRemote ┊ OnFailure ┊
╞══════════════════════════════════════════════════════════════════════════════════════╡
┊ my-bu-schedule      ┊ 2 * * * *   ┊             ┊ 3         ┊ 2          ┊ SKIP      ┊
╰──────────────────────────────────────────────────────────────────────────────────────╯

3.13.5. バックアップした配信予定を削除する

LINSTORクライアントの schedule delete コマンドはバックアップされた配信予定LINSTORオブジェクトを完全に削除するコマンドです。このコマンドの唯一の引数は削除したいスケジュール名です。削除されたスケジュールが現在バックアップを作成または配信している場合、スケジュールされた出荷処理は停止されます。処理が停止した時点によっては、スナップショット、バックアップ、またはその両方が作成および配信されない可能性があります。

このコマンドは、以前に作成されたスナップショットや正常に配信されたバックアップには影響しません。これらは、手動で削除されるまで保持されます。

3.13.6. バックアップの定期的な配信を可能にする

LINSTORクライアントの backup schedule enable コマンドを使用すると、以前に作成したバックアップ配信スケジュールを有効にすることができます。このコマンドは次のような構文になっています。

# linstor backup schedule enable \
  [--node source_node] \ (1)
  [--rg resource_group_name | --rd resource_definition_name] \ (2)
  remote_name \ (3)
  schedule_name (4)
1 これは特別なオプションで、可能であればスケジュールされたバックアップ配信のソースとして使用されるコントローラノードを指定することができます。もしこのオプションをコマンドから省略した場合、LINSTORはスケジュールされた配信が行われる時にソースノードを選択することになります。[OPTIONAL]
2 ここでは、バックアップ配信スケジュールを有効にするリソースグループまたはリソース定義のいずれか(ただし両方は不可)を設定できます。このオプションを省略すると、スナップショットを作成できるすべてのLINSTORリソースに対して、バックアップ配信スケジュールが有効になります。[OPTIONAL]
3 バックアップを配信するリモート宛先の名前です。[REQUIRED]
4 以前に作成されたバックアップ配信スケジュールの名前です。[REQUIRED]

3.13.7. バックアップの配信スケジュールを無効にする

以前に有効にしたバックアップ配信スケジュールを無効にするには、LINSTORクライアントの backup schedule disable コマンドを使用します。このコマンドは次のような構文になります。

# linstor backup schedule disable \
  [--rg resource_group_name | --rd resource_definition_name] \
  remote_name \ (3)
  schedule_name (4)

もし、上記の backup schedule enable コマンドの例のように、リソースグループかリソース定義のどちらかを指定するオプションを含めると、そのリソースグループかリソース定義に対してのみ、スケジュールを無効にします。

例えば、以前の backup schedule enable コマンドでリソースグループやリソース定義の指定を省略した場合、LINSTORはスナップショットを作成することができるすべてのリソースのバックアップ出荷をスケジュールすることになります。disableコマンドは、そのコマンドで指定されたリソースグループやリソース定義にのみ影響します。バックアップ出荷のスケジュールは、指定されたリソースグループまたはリソース定義以外のすべてのLINSTORリソースに適用されます。

バックアップスケジュール有効化コマンドと同様に、リソースグループもリソース定義も指定しない場合、LINSTORは配備されたすべてのLINSTORリソースのコントローラレベルでのバックアップ出荷スケジュールを無効化します。

3.13.8. バックアップされた出荷予定のアスペクトを削除する

linstor backup schedule delete` コマンドを使うと、スケジュール自体を削除することなく、指定したリソース定義やリソースグループをバックアップ出荷スケジュールからきめ細かく削除することができます。このコマンドは backup schedule disable コマンドと同じシンタックスと引数を持っています。リソースグループもリソース定義も指定しない場合、指定したバックアップ出荷スケジュールはコントローラーレベルで削除されます。

バックアップスケジュール削除 コマンドは、指定されたLINSTORオブジェクトレベル(リソース定義、リソースグループ、または特定されていない場合はコントローラーレベル)からバックアップ配送スケジュールリモートペアを削除する方法として考えると役立つかもしれません。

backup schedule delete` コマンドは以前に作成されたスナップショットや正常にシッピングされたバックアップには影響を与えません。これらは手動で削除されるか、まだ適用可能な keep-local または keep-remote オプションの効果によって削除されるまで保持されます。

このコマンドは、複数のLINSTORオブジェクトレベルのバックアップスケジュールを無効にした後、粒度の細かい変更を行いたい場合に使用します。この場合、backup schedule enable コマンドは意図しない結果をもたらすかもしれません。

たとえば、コントローラーレベルで有効にしたバックアップスケジュール-リモートペアを持つシナリオを考えてみましょう。 このコントローラーには、myresgroup という名前のリソースグループがあり、その下に resdef1 から resdef9 までの複数のリソース定義があります。 メンテナンスのために、おそらく resdef1resdef2 の2つのリソース定義のスケジュールを無効にします。 その後、myresgroup リソースグループでバックアップ送信スケジュールを無効にする必要があると気づきます。

メンテナンス作業を完了した後、resdef3 から resdef9 に対するバックアップの配送スケジュールを有効にすることができますが、resdef1resdef2 に対するバックアップの配送を再開する準備はまだできていません。各リソース定義ごとにバックアップの配送を有効化できます。resdef3 から resdef9、または backup schedule delete コマンドを使用してリソースグループ myresgroup からバックアップの配送スケジュールを削除できます。backup schedule delete コマンドを使用すると、コントローラーレベルでバックアップの配送スケジュールが有効化されているため、resdef3 から resdef9 のバックアップが再び配送されますが、リソース定義レベルでまだバックアップの配送スケジュールが無効化されているため、resdef1resdef2 のバックアップは配送されません。

メンテナンスが完了し、再度 resdef1resdef2 のバックアップを出荷できるようになったら、これら2つのリソース定義に対するバックアップ出荷スケジュールを削除して、元の状態に戻すことができます:コントローラーレベルですべてのLINSTOR展開リソースのためにバックアップ出荷がスケジュールされています。これを理解するためには、LINSTORがバックアップを出荷するかどうかを決定する際の意思決定ツリーダイアグラムを参照すると役立つかもしれません。詳細は LINSTORコントローラがスケジュールされたバックアップの出荷を決定する方法 サブセクションを参照してください。

上記のシナリオの例では、いくつかのメンテナンス作業を完了した後に、リソースグループでバックアップ転送を有効にしている可能性があります。この場合、resdef3`から`resdef9`までのリソース定義に対してバックアップ転送が再開されますが、まだこれらのリソース定義に対してバックアップ転送が無効のままである`resdef1`と`resdef2`に対しては、引き続き転送されません。すべてのメンテナンス作業が完了した後、`resdef1`と`resdef2`のバックアップ転送スケジュールを削除することができます。その後、すべてのリソース定義がバックアップを提供するようになります。これは、メンテナンス前と同じであるということです。なぜなら、schedule-remote ペアがリソースグループレベルで有効になっていたからです。しかし、これによりコントローラーレベルで後で全体的にスケジュールされた運送を停止するオプションが削除されます。なぜなら、リソースグループレベルで有効になっているスケジュールが、コントローラーレベルで適用された `schedule disable コマンドを上書きするからです。

3.13.9. リソース別バックアップ出荷スケジュール一覧表

LINSTORクライアントの schedule list-by-resource コマンドを使えば、リソースごとのバックアップスケジュールをリストアップすることができます。このコマンドはLINSTORリソースを表示し、バックアップの出荷スケジュールがどのように適用され、どのリモートに出荷されるかを表示します。もしリソースが出荷されていない場合は、このコマンドは表示されます。

  • リソースにschedule-remote-pairのエントリーがないかどうか(空白のセル)

  • schedule-remote-pairの項目があるが、無効になっているかどうか(”disabled”)。

  • リソースがないため、schedule-remote-pairのエントリーが有効かどうかに関わらず、バックアップ出荷ができないかどうか(”undeployed”)

リソースにschedule-remote-pairがあり、出荷されている場合、コマンド出力には、最後のバックアップがいつ出荷されたか、次のバックアップがいつ出荷される予定であるかが表示されます。また、次回のバックアップと前回のバックアップの出荷がフルバックアップかインクリメンタルバックアップかが表示されます。最後に、このコマンドは、増分バックアップ(もしあれば)およびフルバックアップの次の出荷予定日を表示します。

スケジュールリストバイリソースコマンドで --active-only フラグを使用すると、出荷されていないリソースをすべてフィルタリングすることができます。

3.13.10. LINSTORコントローラがスケジュールされたバックアップの出荷を決定する方法

LINSTORコントローラは、デプロイされたLINSTORリソースが特定のリモート宛先に特定のバックアップスケジュールで出荷されるかどうかを判断するために、以下のロジックを使用します。

linstor controller backup schedule decision flowchart

図に示すように、有効または無効なバックアップ出荷スケジュールは、次の順序で効果を発揮します。

  1. リソース定義レベル

  2. リソースグループレベル

  3. コントローラーレベル

先行するレベルで有効または無効にされたバックアップ出荷スケジュールと遠隔地のペアは、後のレベルで同じスケジュールと遠隔地のペアの有効または無効の状態を上書きします。

3.13.11. スケジュールされたバックアップの出荷がリソースに与える影響の確認

LINSTORリソースがスケジュールされたバックアップ出荷によってどのような影響を受けるかを知るには、LINSTORクライアントの schedule list-by-resource-details コマンドを使用して指定したLINSTORリソースに対して行うことができます。

このコマンドは、どのLINSTORオブジェクト・レベルにおいて、バックアップ出荷スケジュールが設定されていない(空のセル)、有効、または無効であるかを示すテーブルを出力します。

このコマンドを使用すると、リソースのスケジュールバックアップの有効化、無効化、削除をどのレベルで変更する必要があるかを判断することができます。

出力例は次のようになります。

# linstor schedule list-by-resource-details my_linstor_resource_name
╭───────────────────────────────────────────────────────────────────────────╮
┊ Remote   ┊ Schedule   ┊ Resource-Definition ┊ Resource-Group ┊ Controller ┊
╞═══════════════════════════════════════════════════════════════════════════╡
┊ rem1     ┊ sch1       ┊ Disabled            ┊                ┊ Enabled    ┊
┊ rem1     ┊ sch2       ┊                     ┊ Enabled        ┊            ┊
┊ rem2     ┊ sch1       ┊ Enabled             ┊                ┊            ┊
┊ rem2     ┊ sch5       ┊                     ┊ Enabled        ┊            ┊
┊ rem3     ┊ sch4       ┊                     ┊ Disabled       ┊ Enabled    ┊
╰───────────────────────────────────────────────────────────────────────────╯

3.14. LINSTORオブジェクトに対するDRBDオプションの設定:

LINSTORコマンドを使用して、DRBDのオプションを設定することができます。/etc/drbd.d/global_common.confなど、LINSTORで管理されていないファイルに設定された構成は無視されます。このコマンドの構文は一般的には次のようになります:

# linstor <LINSTOR_object> drbd-options --<DRBD_option> <value> <LINSTOR_object_identifiers>

上記の構文では、<LINSTOR_ object_identifiers> はノード名、ノード名、リソース名、またはこれらの識別子の組み合わせなど、識別子のプレースホルダとして使われています。

例えば、backups というリソース定義に対して DRBD レプリケーションプロトコルを設定するには、次のように入力します:

# linstor resource-definition drbd-options --protocol C backups

drbd-options コマンドに --help または -h フラグを付けて LINSTOR オブジェクトを入力すると、コマンドの使用方法や利用可能なオプション、そして各オプションのデフォルト値が表示されます。たとえば、次のようになります:

# linstor controller drbd-options -h

3.14.1. LINSTOR リソースやリソース接続のための DRBD ピアオプションの設定

LINSTOR リソースオブジェクトは、一般的な LINSTOR オブジェクトの DRBD オプション設定の構文の例外です。この LINSTOR リソースオブジェクトでは、指定した2つのノード間の接続レベルで DRBD オプションを設定するために drbd-peer-options を使用できます。2つのノード間で LINSTOR リソースオブジェクトの drbd-peer-options を指定することは、2つのノード間でリソースの linstor resource-connection drbd-peer-options を使用するのと同等です。

例えば、2つのノード「node-0」と「node-1」の間で名前が「backups」のリソースに対して接続レベルでDRBDの最大バッファサイズを8192に設定する場合は、次のように入力します:

# linstor resource drbd-peer-options --max-buffers 8192 node-0 node-1 backups

上記のコマンドは、次の操作と等価です。

# linstor resource-connection drbd-peer-options --max-buffers 8192 node-0 node-1 backups

実際に、linstor --curl コマンドを使用して、LINSTOR REST API上での2つのコマンドの動作を調べると、出力はまったく同じです。

# linstor --curl resource drbd-peer-options --max-buffers 8192 node-0 node-1 backups
curl -X PUT -H "Content-Type: application/json" -d '{"override_props": {"DrbdOptions/Net/max-buffers": "8192"}}' http://localhost:3370/v1/resource-definitions/backups/resource-connections/node-0/node-1

# linstor --curl resource-connection drbd-peer-options --max-buffers 8192 node-0 node-1 backups
curl -X PUT -H "Content-Type: application/json" -d '{"override_props": {"DrbdOptions/Net/max-buffers": "8192"}}' http://localhost:3370/v1/resource-definitions/backups/resource-connections/node-0/node-1

node-0 上のLINSTORが生成したリソースファイル backups.res の接続部分は、以下のようになります。

connection {
        _peer_node_id 1;
        path {
            _this_host ipv4 192.168.222.10:7000;
            _remote_host ipv4 192.168.222.11:7000;
        }
        path {
            _this_host ipv4 192.168.121.46:7000;
            _remote_host ipv4 192.168.121.220:7000;
        }
        net {
			[...]
            max-buffers         8192;
            _name               "node-1";
        }
    }
上記の例のように2つのノード間に複数のパスがある場合、resource drbd-peer-options コマンドを使用して設定する DRBD オプションはすべてのパスに適用されます。

3.14.2. リソースのオプション設定ノード間接続のためのDRBDオプションの設定

drbd-peer-options 引数を使用して、2つのノード間で DRBD オプションを接続レベルで設定することができます。例えば、

# linstor node-connection drbd-peer-options --ping-timeout 299 node-0 node-1

前のコマンドは、2つのノード、node-0node-1 の間の接続レベルで、DRBDの ping-timeout オプションを29.9秒に設定します。

3.14.3. LINSTORオブジェクトの検証オプションを確認します。

list-properties コマンドを使用して、LINSTORオブジェクトの設定されたプロパティを確認できます。例えば:

|======================================================|
# linstor resource-definition list-properties backups
+------------------------------------------------------+
| Key                               | Value            |
| DrbdOptions/Net/protocol          | C                |
[...]

3.14.4. LINSTORオブジェクトからDRBDオプションを削除する

以前に設定されたDRBDオプションを削除するには、オプション名の前に unset- を付けます。例えば:

# linstor resource-definition drbd-options --unset-protocol backups

同じ構文は、LINSTORリソース、リソース接続、またはノード接続上に設定された drbd-peer-options に適用されます。例えば::

# linstor resource-connection drbd-peer-options --unset-max-buffers node-0 node-1 backups

DRBDオプションまたはDRBDピアオプションを削除すると、オプションがデフォルト値に戻ります。オプションのデフォルト値については、 linstor <LINSTOR_object> drbd-options --help(または drbd-peer-options --help )コマンドの出力を参照してください。DRBDオプションに関する情報は、 drbd.conf-9.0 のmanページも参照できます。 === LINSTORにおけるストレージの過剰割り当て

LINSTORサーバーバージョン1.26.0以降、LINSTORがオーバープロビジョニングストレージを制限する方法を制御することができるようになりました。これには MaxOversubscriptionRatioMaxFreeCapacityOversubscriptionRatioMaxTotalCapacityOversubscriptionRatio の3つのLINSTORオブジェクトプロパティを使用します。これらのプロパティは、LINSTORストレージプールまたはLINSTORコントローラーオブジェクトのいずれかに設定できます。これらのプロパティをコントローラーレベルで設定すると、クラスター内のすべてのLINSTORストレージプールに影響します。ただし、同じプロパティが特定のストレージプールにも設定されている場合は、そのストレージプールにのみ影響します。この場合、ストレージプールに設定されたプロパティ値がコントローラに設定されたプロパティ値より優先されます。オーバーサブスクリプション比率の値を設定することで、LINSTORがストレージプールで行うオーバープロビジョニングを制御することができます。物理的に説明できないレベルにストレージのオーバープロビジョニングが達することを望まない場合に便利です。次のサブセクションでは、異なるオーバープロビジョニング制限プロパティについて説明します。 ==== 最大空き容量オーバープロビジョニング比率の設定

LINSTORサーバーのバージョン1.26.0より前では、薄膜プロビジョニングされたLVMボリュームまたはZFS zpoolでバックアップされた ストレージプールのオーバープロビジョニングを設定する際、ストレージプール内に残っている空き容量に基づいていました。 LINSTORサーバーのバージョン1.26.0以降では、このオーバープロビジョニングの方法はまだ可能です。 MaxFreeCapacityOversubscriptionRatio プロパティに値を設定することで、LINSTOR ストレージプールまたは LINSTOR コントローラのいずれかに、これを実行できます。この比率の値を設定すると、ストレージプール内の残りの空き容量は 比率値によって乗算され、これがストレージプールからプロビジョニングできる新しいボリュームの最大許容サイズとなります。

デフォルトで、MaxFreeCapacityOversubscriptionRatio の値は 20 になっています。

LINSTORサテライトノードクラスターにある3つのLINSTORサテライトノード(node-0からnode-2まで)上の my_thin_pool というLINSTORストレージプールの MaxFreeCapacityOversubscriptionRatio プロパティに異なる値を設定するには、以下のコマンドを入力してください:

# for node in node-{0..2}; do \
linstor storage-pool set-property $node my_thin_pool MaxFreeCapacityOversubscriptionRatio 10
done

もしすでにいくつかのストレージリソースをデプロイメントしており、ストレージプールには 10GiBの空き容量が残っている場合( linstor storage-pool list を入力して表示される)、 そのストレージプールから新しいストレージリソースをプロビジョニングする際には、最大100GiBのボリュームをプロビジョニングできます。

新しいリソースグループから新しいLINSTORリソース(およびボリューム)を作成する前に、 LINSTORがそのリソースグループから設定できる最大ボリュームサイズをリストすることができます。 これを行うには、resource-group query-size-info コマンドを入力してください。たとえば、 DfltRscGrp リソースグループに関する情報を表示するには、次のコマンドを入力します。:

# linstor resource-group query-size-info DfltRscGrp

コマンドの出力には、指定されたリソースグループの値の表が表示されます。

+-------------------------------------------------------------------+ | MaxVolumeSize | AvailableSize | Capacity | Next Spawn Result |
|===================================================================|
| 99.72 GiB | 9.97 GiB | 9.97 GiB | my_thin_pool on node-0 | | | | | my_thin_pool on node-2 | +-------------------------------------------------------------------+

3.14.5. 最大総容量のオーバープロビジョニング比率の設定

LINSTORサーバーバージョン1.26.0以降、オーバープロビジョニングストレージを制限する別の方法が追加されました。LINSTORストレージプールまたはLINSTORコントローラーの MaxTotalCapacityOversubscriptionRatio の値を設定することで、LINSTORはストレージプールの総容量に基づいて、新しいボリュームの最大サイズを制限します。

これは、ストレージプール内に残っている空き容量に基づいて最大ボリュームサイズを制限する方法と比較して、オーバープロビジョニングを制限するよりもリラックスしている方法です。ストレージプール内でストレージをプロビジョニングし使用すると、空き容量が減少します。しかし、ストレージプールの総容量は、ストレージプールにバッキングストレージを追加しない限り変わりません。

デフォルトで、「MaxTotalCapacityOversubscriptionRatio」の値は20です。

異なる値を設定するには、クラスタ内の3つのLINSTORサテライトノード( node-0 から node-2 まで)の my_thin_pool というLINSTORストレージプールの MaxTotalCapacityOversubscriptionRatio プロパティに対して、次のコマンドを入力してください:

# for node in node-{0..2}; do \ linstor storage-pool set-property $node my_thin_pool MaxTotalCapacityOversubscriptionRatio 4 done

もし、合計容量が10GiBの薄いプロビジョンの論理ボリュームでバックアップされた ストレージプールがある場合、そのストレージプールから作成した新しいストレージリソースは、 ストレージプールに残っている空き容量に関係なく、最大サイズが40GiBになります。

3.14.6. オーバープロビジョニングのための最大オーバーサブスクリプション比率の設定

MaxOversubscriptionRatio プロパティをLINSTORストレージプールやLINSTORコントローラーオブジェクトのいずれかに設定した場合、それは MaxFreeCapacityOversubscriptionRatio および MaxTotalCapacityOversubscriptionRatio プロパティの両方の値として機能することができます。ただし、MaxOversubscriptionRatio プロパティは、他の2つのオーバーサブスクリプションプロパティのいずれかの値としてのみ機能しますが、他のプロパティが設定されていない場合です。デフォルトでは、MaxOversubscriptionRatio プロパティの値は20であり、他の2つのオーバーサブスクリプションプロパティのデフォルト値と同じです。

LINSTORコントローラーの MaxOversubscriptionRatio プロパティに異なる値を設定するには、例えば、次のコマンドを入力してください:

# linstor controller set-property MaxOversubscriptionRatio 5

コマンド例でプロパティ値を5に設定することで、10GiBのストレージプールを最大40GiBまで オーバープロビジョニングすることができます。

3.14.7. 複数のオーバー・プロビジョニング・プロパティにおける値の設定が及ぼす影響

前述の通り、3つのオーバープロビジョニング制限 [LINSTOR] プロパティのデフォルト値はそれぞれ20です。ストレージプールとコントローラーの同じプロパティを設定した場合、そのストレージプールにおいてストレージプールに設定されているプロパティの値が優先されます。

MaxTotalCapacityOversubscriptionRatio または MaxFreeCapacityOversubscriptionRatio のどちらかが設定されていない場合、MaxOversubscriptionRatio の値が未設定のプロパティまたはプロパティの値として使用されます。

例えば、次のコマンドを考えてみましょう:

# for node in node-{0..2}; do \ linstor storage-pool set-property $node my_thin_pool MaxOversubscriptionRatio 4 done # for node in node-{0..2}; do \ linstor storage-pool set-property $node my_thin_pool MaxTotalCapacityOversubscriptionRatio 3 done

MaxTotalCapacityOversubscriptionRatio プロパティを3に設定したため、LINSTORは その値を使用します。MaxOversubscriptionRatio プロパティに設定した値ではなく MaxFreeCapacityOversubscriptionRatio プロパティを設定しなかったため、LINSTORは MaxOversubscriptionRatio プロパティに設定した値である4を MaxFreeCapacityOversubscriptionRatio プロパティに使用します。

リソース配置を決定する際、つまり、LINSTORがリソースをストレージプールに配置できるかどうかを決定する際、 LINSTORは2つの値を比較します: MaxTotalCapacityOversubscriptionRatio プロパティによって設定された比率に ストレージプールの総容量を乗じた値と、 MaxFreeCapacityOversubscriptionRatio プロパティによって設定された比率にストレージプールの利用可能な空き容量を乗じた値です。 LINSTORは、これら2つの計算値のうち小さい方を使用して、ストレージプールにリソースを 配置する十分なスペースがあるかどうかを判断します。

前のコマンドで設定された値と、ストレージプールの合計容量が10GiBである場合を考えて みましょう。また、ストレージプールに関連付けられたデプロイされたLINSTORリソースが ないと仮定し、ストレージプールの利用可能な空き容量も10GiBであるとします。

注意: この例は単純化されています。例えば、ストレージプールの背後にあるストレージプロバイダ (例: ZFSやLVM)によっては、デプロイされたリソースがないストレージプールでは、空き容量が 総容量と等しくないことがあります。これは、デプロイされたリソース以前に、ストレージ プロバイダのインフラストラクチャによるオーバーヘッドがストレージプールのスペースを 使用しているためです。

この例では、MaxTotalCapacityOversubscriptionRatio 3 が、総容量 10GiB に乗じた値が、 MaxFreeCapacityOversubscriptionRatio 4 が、空き容量 10GiB に乗じた値よりも 小さいです。ここで覚えておいてください、MaxFreeCapacityOversubscriptionRatio が 設定されていない場合、LINSTOR は MaxOversubscriptionRatio の値を使用します。

したがって、ストレージプールにバックアップされた新しいリソースをデプロイする際、LINSTORは 空き容量の計算ではなく合計容量の計算を使用して、ストレージプールの過剰割当を制限し、 新しいリソースを配置できるかどうかを決定します。ただし、ストレージリソースをさらに デプロイし、それらがデータで埋まると、ストレージプール内の利用可能な空きスペースが 減少します。そのため、LINSTORがストレージプールの過剰割当を制限するために合計容量の 計算を常に使用するわけではない可能性があります。その比率が空き容量の比率よりも 小さい場合でもです。

3.15. ディスクの追加と削除

LINSTORは、ディスクレスとディスク搭載のリソースを変換することができます。これは、resource toggle-disk コマンドによって実現され、構文は resource create に類似しています。

例えば ‘alpha’ 上にディスクレスリソース backups のディスクを追加するには以下のようにします。

# linstor resource toggle-disk alpha backups --storage-pool pool_ssd

Remove this disk again:

# linstor resource toggle-disk alpha backups --diskless

3.15.1. ノード間でのディスクの移行

リソースを冗長性を減らすことなくノード間で移動するには、LINSTORのディスク移行機能を使用できます。まず、対象のノードにディスクレスリソースを作成し、その後 --migrate-from オプションを使用してディスクを追加します。これにより、データが新しいディスクに同期されるまで待機し、その後ソースディスクを削除します。

例えば、リソースの backupalpha から bravo に移行するには、次のようにします。

# linstor resource create bravo backups --drbd-diskless # linstor resource toggle-disk bravo backups --storage-pool pool_ssd --migrate-from alpha

3.16. LINSTOR を使用したDRBD Proxy 設定

LINSTORは、DRBD Proxyが接続するノード上で実行されることを期待しています。別のノードのDRBD Proxy経由の接続は、今のところサポートしていません。

クラスターは、ローカルネットワーク内にノード ‘alpha’ と ‘bravo’、リモートサイトにノード ‘charlie’ が存在し、それぞれのノードに backups というリソース定義がデプロイされているとします。その後、DRBD Proxy を ‘charlie’ への接続に有効にすることができます。

# linstor drbd-proxy enable alpha charlie backups # linstor drbd-proxy enable bravo charlie backups

DRBD Proxyの設定は、次のようなコマンドでカスタマイズすることができます。

# linstor drbd-proxy options backups --memlimit 100000000 # linstor drbd-proxy compression zlib backups --level 9

LINSTORは、長距離レプリケーションのためのDRBD構成を自動的に最適化しませんので、 おそらくプロトコルなどのいくつかの構成オプションを設定したいと思うでしょう。

# linstor resource-connection drbd-options alpha charlie backups --protocol A # linstor resource-connection drbd-options bravo charlie backups --protocol A

LINBITに連絡して、構成の最適化に関する支援を受けてください。

3.16.1. DRBD プロキシを自動的に有効にする

LINSTORは、上記のProxy接続を自動的に有効にするように設定することもできます。この自動化のために、LINSTORはまず、各ノードがどのサイトにあるかを知る必要があります。

# linstor node set-property alpha Site A # linstor node set-property bravo Site A # linstor node set-property charlie Site B

Site プロパティは将来の機能で他のサイトベースの決定にも使用される可能性があるため、 DrbdProxy/AutoEnabletrue に設定する必要があります。

# linstor controller set-property DrbdProxy/AutoEnable true

このプロパティは、ノード、リソース定義、リソース、およびリソース接続のレベルにも 設定できます(優先度が低い方から右に向かって増加し、コントローラーが最も優先度が低い、 つまり最も優先度が低いレベルである左端に位置しています)。

この初期化ステップが完了すると、すべての新しく作成されたリソースは自動的に、 その相互リソースのいずれかにDRBD Proxyを有効にする必要があるかどうかをチェックします。

3.17. 外部データベースプロバイダー

LINSTORはPostgresqlやMariaDBのような外部データベースとともに動作させることもでき、バージョン 1.1.0 以降では etcd キーバリューストアもサポートされています。

外部データベースを使用するには、設定する追加手順がいくつかあります。linstorで使用するためのDB/スキーマとユーザーを作成し、/etc/linstor/linstor.toml でこれを設定する必要があります。

3.17.1. PostgreSQL

サンプルのPostgreSQLの linstor.toml は、次のようになります:

[db]
user = "linstor" password = "linstor" connection_url = "jdbc:postgresql://localhost/linstor"

3.17.2. MariaDB

MariaDBのサンプル linstor.toml は以下のようになります:

[db]
user = "linstor" password = "linstor" connection_url = "jdbc:mariadb://localhost/LINSTOR?createDatabaseIfNotExist=true"

注意: LINSTORのスキーマ/データベースは LINSTOR として作成されますので、MariaDBの接続文字列が 上記の例のように LINSTOR スキーマを参照していることを確認してください。

3.17.3. etcd

etcdは、あなたのLINSTORデータベースを分散させるのが簡単になる分散型のキー値ストアです。etcdドライバーは、LINSTORコントローラーパッケージにすでに含まれており、linstor.toml で設定するだけです。

etcd のインストールおよび構成方法の詳細については、 etcd docs を参照ください。

以下は linstor.toml のサンプル [db] セクションです。

[db]
## only set user/password if you want to use authentication, only since LINSTOR 1.2.1 # user = "linstor" # password = "linstor"

## for etcd ## do not set user field if no authentication required connection_url = "etcd://etcdhost1:2379,etcdhost2:2379,etcdhost3:2379"

## if you want to use TLS, only since LINSTOR 1.2.1 # ca_certificate = "ca.pem" # client_certificate = "client.pem"

## if you want to use client TLS authentication too, only since LINSTOR 1.2.1 # client_key_pkcs8_pem = "client-key.pkcs8" ## set client_key_password if private key has a password # client_key_password = "mysecret"

3.18. 複数のLINSTORコントローラー

LINSTORコントローラーには、以下のパスに配置される必要がある設定ファイルがあります: /etc/linstor/linstor.toml

最新の構成例はこちらで見つけることができます: linstor.toml-example

3.18.1. LINSTOR REST API

LINSTORの管理タスクをよりアクセスしやすくし、Webフロントエンドでも利用できるようにするために、REST APIが作成されました。REST API はLINSTORコントローラーに組み込まれており、LINSTOR 0.9.13以降は linstor.toml 構成ファイルを通じて設定されています。

[http]
  enabled = true
  port = 3370
  listen_addr = "127.0.0.1"  # to disable remote access

REST APIを使用したい場合、現在のドキュメントは次のリンクで見つけることができます: https://app.swaggerhub.com/apis-docs/Linstor/Linstor/

3.18.2. LINSTOR REST API HTTPS

HTTP REST APIはHTTPSによってもセキュリティが確保されるように実行することができ、認証が必要な機能を使用する場合には強くお勧めします。そのためには、すべてのHTTPSトラフィックを暗号化するために使用される有効な証明書を含むJavaキーストアファイルを作成する必要があります。

以下は Javaランタイムに含まれている keytool を使って自己署名証明書を作成する方法の簡単な例です。

keytool -keyalg rsa -keysize 2048 -genkey -keystore ./keystore_linstor.jks\
 -alias linstor_controller\
 -dname "CN=localhost, OU=SecureUnit, O=ExampleOrg, L=Vienna, ST=Austria, C=AT"

keytool は生成されたキーストアファイルを保護するためのパスワードを要求し、LINSTOR コントローラーの設定に必要です。 linstor.toml ファイルには、次のセクションを追加する 必要があります。

[https]
  keystore = "/path/to/keystore_linstor.jks"
  keystore_password = "linstor"

linstor-controller を再起動し、HTTPS REST APIがポート3371で利用可能になります。

他の証明書をインポートする方法の詳細については、こちらをご覧ください。 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html

重要: HTTPSアクセスを有効にした後、HTTP v1 REST APIへのすべてのリクエストは HTTPSリダイレクトにリダイレクトされます。 もし LINSTORのコントローラをLINSTOR設定のTOMLファイル (/etc/linstor/linstor.toml)で指定していない場合は、 LINSTORクライアント(linstor)を使用する際に異なる構文を使用する必要があります。 詳細は LINSTORクライアントの使用 に記載されています。

LINSTOR REST-API HTTPS 制限付きクライアントアクセス

コントローラー上で SSL/TLS 信頼ストアを使用することで、クライアントアクセスを制限することができます。基本的に、クライアント用の証明書を作成して信頼ストアに追加し、その証明書をクライアントが認証に使用するようにします。

最初にクライアント証明書を作成します。

keytool -keyalg rsa -keysize 2048 -genkey -keystore client.jks\
 -storepass linstor -keypass linstor\
 -alias client1\
 -dname "CN=Client Cert, OU=client, O=Example, L=Vienna, ST=Austria, C=AT"

次に、この証明書をコントローラのトラストストアにインポートします。

keytool -importkeystore\
 -srcstorepass linstor -deststorepass linstor -keypass linstor\
 -srckeystore client.jks -destkeystore trustore_client.jks

そして linstor.toml 設定ファイルのトラストストアを有効にします。

[https]
  keystore = "/path/to/keystore_linstor.jks"
  keystore_password = "linstor"
  truststore = "/path/to/trustore_client.jks"
  truststore_password = "linstor"

ここで、Controllerを再起動してください。その後、正しい証明書がないと Controller APIにアクセスできなくなります。

LINSTORクライアントはPEM形式の証明書が必要ですので、使用する前に、 Javaのキーストア証明書をPEM形式に変換する必要があります。

# Convert to pkcs12
keytool -importkeystore -srckeystore client.jks -destkeystore client.p12\
 -storepass linstor -keypass linstor\
 -srcalias client1 -srcstoretype jks -deststoretype pkcs12

# use openssl to convert to PEM openssl pkcs12 -in client.p12 -out client_with_pass.pem

PEMファイルのパスワードを入力する手間を省くためには、パスワードを削除すると 便利かもしれません。

openssl rsa -in client_with_pass.pem -out client1.pem openssl x509 -in client_with_pass.pem >> client1.pem

これでこの PEMファイルをクライアントで使用できるようになります。

linstor --certfile client1.pem node list

--certfile パラメーターはクライアント構成ファイルにも追加できます。 詳細については、 LINSTORクライアントの使用 を参照してください。

3.19. LINSTOR Satellite の設定

LINSTOR Satelliteソフトウェアには、TOMLファイル形式を使用したオプションの設定ファイルがあり、次のパスに配置する必要があります:/etc/linstor/linstor_satellite.toml

最近の構成例は次のとおりです: linstor_satellite.toml-example

3.20. ロギング

LINSTORは、バインディングとして logback を使用してhttps://www.slf4j.org/[SLF4J]を利用しています。 これにより、LINSTORはログレベル ERROR, WARN, INFO, DEBUG, TRACE(詳細度の増加順)を区別することが可能となります。ログレベルを設定するさまざまな方法は、優先順に並べると以下の通りです(最初のものが最も優先度が高いです):

  1. LINSTOR client バージョン1.20.1以降、controller set-log-level コマンドを使用して、 LINSTORの実行設定で使用されるログレベルを変更できます。このコマンドにはさまざまな引数を 使用できます。詳細については、コマンドの --help テキストを参照してください。例えば、 LINSTORコントローラーとすべてのサテライトでログレベルを TRACE に設定するには、 次のコマンドを入力してください:

    $ linstor controller set-log-level --global TRACE

    特定のノードでLINSTORのログレベルを変更するには、LINSTORクライアント(バージョン1.20.1以降)の node set-log-level コマンドを使用できます。

    注意: LINSTORクライアントを使用してロギングレベルを変更した場合、 ノードが再起動するなどのデプロイメントで、設定は持続しません。

  2. TRACE モードは、デバッグコンソールを使用して enabled または disabled にできます。

    Command ==> SetTrcMode MODE(enabled) SetTrcMode Set TRACE level logging mode New TRACE level logging mode: ENABLED
  3. コントローラまたはサテライトを起動するときに、コマンドライン引数を渡すことができます。

    java ... com.linbit.linstor.core.Controller ... --log-level TRACE java ... com.linbit.linstor.core.Satellite ... --log-level TRACE
  4. 推奨される場所は、設定ファイル内の logging セクションです。コントローラのデフォルトの 設定ファイルの場所は /etc/linstor/linstor.toml であり、 サテライトの場合は /etc/linstor/linstor_satellite.toml です。 ログレベルを以下のように設定してください。

    [logging]
       level="TRACE"
  5. LINSTORは実装としてlogbackを使用しているため、/usr/share/linstor-server/lib/logback.xml も 使用することができます。現在、このアプローチのみが異なるコンポーネント用の異なるログレベルを サポートしています。その例で以下に示します。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="false" scanPeriod="60 seconds">
    <!--
     Values for scanPeriod can be specified in units of milliseconds, seconds, minutes or hours
     https://logback.qos.ch/manual/configuration.html
    -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <!-- encoders are assigned the type
            ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
       <encoder>
         <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
       </encoder>
     </appender>
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${log.directory}/linstor-${log.module}.log</file>
       <append>true</append>
       <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
         <Pattern>%d{yyyy_MM_dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</Pattern>
       </encoder>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>logs/linstor-${log.module}.%i.log.zip</FileNamePattern>
         <MinIndex>1</MinIndex>
         <MaxIndex>10</MaxIndex>
       </rollingPolicy>
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>2MB</MaxFileSize>
       </triggeringPolicy>
     </appender>
     <logger name="LINSTOR/Controller" level="TRACE" additivity="false">
       <appender-ref ref="STDOUT" />
       <!-- <appender-ref ref="FILE" /> -->
     </logger>
     <logger name="LINSTOR/Satellite" level="TRACE" additivity="false">
       <appender-ref ref="STDOUT" />
       <!-- <appender-ref ref="FILE" /> -->
     </logger>
     <root level="WARN">
       <appender-ref ref="STDOUT" />
       <!-- <appender-ref ref="FILE" /> -->
     </root>
    </configuration>

See the logback manual to find more details about logback.xml.

上記の設定方法のいずれも使用されない場合、LINSTOR はデフォルトで INFO ログレベルになります。

3.21. 監視

LINSTOR 1.8.0 以降、 Prometheus /metrics HTTP パス がLINSTOR および JVM 固有の方法で提供されています。

/metrics パスは LINSTOR のレポートデータ量を減らすために 3 つの GET 引数もサポートします。

  • resource

  • storage_pools

  • error_reports

これらはすべてデフォルトで true であり、無効にするには、例えば error-report データの場合 http://localhost:3370/metrics?error_reports=false とします。

3.21.1. ヘルスチェック

LINSTOR-Controllerは /health というHTTPパスも提供しており、コントローラがデータベースにアクセスでき、すべてのサービスが稼働している場合は単純にHTTPステータス200を返します。それ以外の場合は、HTTPエラーステータスコード500 内部サーバーエラー を返します。

3.22. サテライトへの安全な接続

LINSTORを使用してコントローラーとサテライトの間にSSL/TLSセキュアTCP接続を確立することが可能です。JavaのSSL/TLSエンジンの動作の詳細については触れませんが、安全な接続を使用するために、Javaの実行環境に含まれる keytool を使用したコマンドラインのスニペットを以下に示します。3ノードのセットアップをセキュア接続で構成する方法をご紹介します。

ノードの設定は次のようになります。

ノード alpha はコントローラーです。ノード bravo とノード charlie はサテライトです。

以下にキーストア設定を生成するコマンド例を示します。環境に合わせて変更してください。

# create directories to hold the key files mkdir -p /tmp/linstor-ssl cd /tmp/linstor-ssl mkdir alpha bravo charlie


# create private keys for all nodes
keytool -keyalg rsa -keysize 2048 -genkey -keystore alpha/keystore.jks\
 -storepass linstor -keypass linstor\
 -alias alpha\
 -dname "CN=Max Mustermann, OU=alpha, O=Example, L=Vienna, ST=Austria, C=AT"

keytool -keyalg rsa -keysize 2048 -genkey -keystore bravo/keystore.jks\
 -storepass linstor -keypass linstor\
 -alias bravo\
 -dname "CN=Max Mustermann, OU=bravo, O=Example, L=Vienna, ST=Austria, C=AT"

keytool -keyalg rsa -keysize 2048 -genkey -keystore charlie/keystore.jks\
 -storepass linstor -keypass linstor\
 -alias charlie\
 -dname "CN=Max Mustermann, OU=charlie, O=Example, L=Vienna, ST=Austria, C=AT"

# import truststore certificates for alpha (needs all satellite certificates)
keytool -importkeystore\
 -srcstorepass linstor -deststorepass linstor -keypass linstor\
 -srckeystore bravo/keystore.jks -destkeystore alpha/certificates.jks

keytool -importkeystore\
 -srcstorepass linstor -deststorepass linstor -keypass linstor\
 -srckeystore charlie/keystore.jks -destkeystore alpha/certificates.jks

# import controller certificate into satellite truststores
keytool -importkeystore\
 -srcstorepass linstor -deststorepass linstor -keypass linstor\
 -srckeystore alpha/keystore.jks -destkeystore bravo/certificates.jks

keytool -importkeystore\
 -srcstorepass linstor -deststorepass linstor -keypass linstor\
 -srckeystore alpha/keystore.jks -destkeystore charlie/certificates.jks

# now copy the keystore files to their host destinations ssh root@alpha mkdir /etc/linstor/ssl scp alpha/* root@alpha:/etc/linstor/ssl/ ssh root@bravo mkdir /etc/linstor/ssl scp bravo/* root@bravo:/etc/linstor/ssl/ ssh root@charlie mkdir /etc/linstor/ssl scp charlie/* root@charlie:/etc/linstor/ssl/

# generate the satellite ssl config entry
echo '[netcom]
  type="ssl"
  port=3367
  server_certificate="ssl/keystore.jks"
  trusted_certificates="ssl/certificates.jks"
  key_password="linstor"
  keystore_password="linstor"
  truststore_password="linstor"
  ssl_protocol="TLSv1.2"
' | ssh root@bravo "cat > /etc/linstor/linstor_satellite.toml"

echo '[netcom]
  type="ssl"
  port=3367
  server_certificate="ssl/keystore.jks"
  trusted_certificates="ssl/certificates.jks"
  key_password="linstor"
  keystore_password="linstor"
  truststore_password="linstor"
  ssl_protocol="TLSv1.2"
' | ssh root@charlie "cat > /etc/linstor/linstor_satellite.toml"

コントローラーとサテライトを起動し、ノードを --communication-type SSL で追加してください。

3.23. LDAP 認証の設定

LINSTORを設定して、LINSTORコントローラへのアクセスを制限するためにLDAP認証を使用することができます。 この機能はデフォルトで無効になっていますが、LINSTOR構成TOMLファイルを編集して有効にし、構成できます。 構成ファイルを編集した後は、linstor-controller.service を再起動する必要があります。 構成ファイル内のLDAPセクションの例は次のようになります:

[ldap]
  enabled = true (1)

  # allow_public_access: if no authorization fields are given allow
  # users to work with the public context
  allow_public_access = false (2)

  # uniform resource identifier: LDAP URI to use
  # for example, "ldaps://hostname" (LDAPS) or "ldap://hostname" (LDAP)
  uri = "ldaps://ldap.example.com"

  # distinguished name: {user} can be used as template for the username
  dn = "uid={user}" (3)

  # search base for the search_filter field
  search_base = "dc=example,dc=com" (4)

  # search_filter: ldap filter to restrict users on memberships
  search_filter = "(&(uid={user})(memberof=ou=storage-services,dc=example,dc=com))" (5)
1 enabled は真偽値です。デフォルトでは認証が無効になっています。
2 allow_public_access は真偽値です。trueに設定されていてLDAP認証が有効に なっている場合、ユーザーはLINSTOR Controllerの公開コンテキストで作業することができます。 falseに設定されていてLDAP認証が有効になっている場合、LDAP認証情報を持たないユーザーは バージョンやヘルプ情報の表示など些細なタスク以外でLINSTOR Controllerに アクセスすることができません。
3 dn は、LDAPディレクトリをクエリするためのLDAP識別名を指定することができる 文字列値です。ユーザーID(uid)に加え、その文字列には他の識別名属性が含まれる ことがあります。例えば、
dn = "uid={user},ou=storage-services,o=ha,dc=example"
4 search_base は、認証クエリのLDAPディレクトリツリーにおける開始 ポイントを指定することができる文字列値です。例えば:
search_base = "ou=storage-services"
5 search_filter は、ユーザーおよびグループのメンバーシップなどの認証のためのLDAPオ ブジェクトの制限を指定できる文字列値です。 例えば、以下のようなものがあります:
search_filter = "(&(uid={user})(memberof=ou=storage-services,dc=example,dc=com))"

警告: 潜在的に機密性の高いトラフィックを保護するために、LINSTORコントローラーと LDAPサーバー間を通過する LINSTOR REST API HTTPS およびLDAPSを構成することを強くお勧めします。

3.23.1. 認証ユーザとしてのLINSTORコマンドの実行

LINSTOR コントローラーを LDAP (または LDAPS) を介してユーザーを認証するように構成した後、LINSTOR REST API に HTTPS を設定すると、次のように LINSTOR コマンドを入力する必要があります。

$ linstor --user <LDAP_user_name> <command>

LDAP認証を設定した場合には、 LINSTOR REST API HTTPS も 構成する必要があります。そうでない場合は、linstor コマンドで --allow-insecure-path フラグを使用してHTTP経由でパスワード認証を明示的に有効にする必要があります。 これは、資格情報を平文で送信するため、安全で隔離された LAN以外では推奨されません。

$ linstor --allow-insecure-auth --user <LDAP_user_name> <command>

LINSTORコントローラーは、上記の例のそれぞれでユーザーのパスワードを求めます。 必要に応じて、--password 引数を使用してユーザーのパスワードをコマンドラインで 入力することができます。その際は慎重に警告を受けることになります。

3.24. DRBDリソースの自動化

このセクションでは、LINSTORがDRBDリソースのために持つ自動化機能の詳細を説明しています。

3.24.1. 自動クォーラムポリシー

LINSTORは、リソースにクォーラムポリシーを自動的に構成します(クォーラムが利用可能な場合)。つまり、少なくとも2つのディスクフルと1つ以上のディスクレスリソースがある場合、または3つ以上のディスクフルリソースがある場合 、LINSTORはリソースのクォーラムポリシーを自動的に有効にします。

逆に、LINSTORは、クォーラムを使用するのに必要な最低限のリソース割り当てを満たさない場合は、クォーラムポリシーを自動的に無効にします。

これは、linstor-controller, resource-group, および resource-definition LINSTORオブジェクトに適用できる DrbdOptions/auto-quorum プロパティを介して制御されます。 DrbdOptions/auto-quorum プロパティの受け入れられる値は disabled, suspend-io, および io-error です。

DrbdOptions/auto-quorum プロパティを disabled に設定すると、リソースのクォーラムポリシーを手動で、必要に応じてより詳細に制御できます。

ヒント: DrbdOptions/auto-quorum のデフォルトポリシーは quorum majorityon-no-quorum io-error です。DRBDのクォーラム機能およびその動作に関する詳細については、DRBDユーザーガイドクォーラムセクション を参照してください。

重要:DrbdOptions/auto-quorum ポリシーは、DrbdOptions/auto-quorum が無効にされていない場合、手動で設定されたプロパティを上書きします。

たとえば、リソースグループ名が my_ssd_group であるリソースグループのクォーラムポリシーを手動で設定する場合、以下のコマンドを使用します。

# linstor resource-group set-property my_ssd_group DrbdOptions/auto-quorum disabled # linstor resource-group set-property my_ssd_group DrbdOptions/Resource/quorum majority # linstor resource-group set-property my_ssd_group DrbdOptions/Resource/on-no-quorum suspend-io

DRBDのクォーラム機能を完全に無効にすることをお勧めします。そのためには、 まず適切なLINSTORオブジェクトで DrbdOptions/auto-quorum を無効にし、 その後DRBDのクォーラム機能を適切に設定する必要があります。たとえば、my_ssd_group リソースグループで 完全にクォーラムを無効にするには、次のコマンドを使用してください。

# linstor resource-group set-property my_ssd_group DrbdOptions/auto-quorum disabled # linstor resource-group set-property my_ssd_group DrbdOptions/Resource/quorum off # linstor resource-group set-property my_ssd_group DrbdOptions/Resource/on-no-quorum

注意: 上記のコマンドで DrbdOptions/Resource/on-no-quorum を空の値に設定すると、そのプロパティがオブジェクトから完全に削除されます。

3.24.2. 自動取り除き

サテライトが長期間オフラインになっている場合、LINSTOR は、そのノードを Evictedと宣言するように構成できます。これにより、影響を受ける DRBD リソースが他のノードに自動的に再割り当てされ、最小のレプリカ数が維持されるようになります。

この機能は、次のプロパティを使用して動作を適応させます。

  • DrbdOptions/AutoEvictMinReplicaCount は常に存在すべきレプリカの数を設定します。 このプロパティは、コントローラー上でグローバルデフォルトを変更するか、 特定のリソース定義やリソースグループでのみそのリソース定義やリソースグループの ために変更するために設定できます。このプロパティが空の場合、対応するリソース グループのAutoplacerに設定されたプレースカウントが使用されます。

  • DrbdOptions/AutoEvictAfterTime は、追い出しがトリガーされる前にノードが オフラインのままでいることができる時間を分単位で記述します。このプロパティは、 コントローラ上でグローバルなデフォルトを変更するために設定したり、異なる動作を 与えるために単一のノード上で設定したりできます。このプロパティのデフォルト値は60分です。

  • DrbdOptions/AutoEvictMaxDisconnectedNodes は、同時に到達不能になることが できるノードの割合を設定します(どんな理由であれ)。指定された割合以上の ノードが同時にオフラインになると、コントローラからの接続問題と見なされるため、 この場合、オート追い出しはトリガーされません。このプロパティはコントローラにのみ設定でき、 値は0から100の間でしか受け入れられません。デフォルト値は34です。オート追い出し機能を オフにしたい場合は、単純にこのプロパティを0に設定してください。 どれだけのサテライトが到達不能であっても常にオート追い出しを トリガーしたい場合は、100に設定してください。

  • DrbdOptions/AutoEvictAllowEviction は、ノードが追い出されるのを防ぐ追加プロパティです。 これは、例えばメンテナンスのためにノードをシャットダウンする必要がある場合など、 さまざまなケースで役立ちます。コントローラ上でこのプロパティを設定してグローバルなデフォルトを 変更するか、個々のノードで異なる動作をさせるために設定することができます。 このプロパティは、値としてtrueとfalseを受け入れ、デフォルトではコントローラ上でtrueに設定されています。 コントローラ上でこれをfalseに設定することで、自動追い出し機能をオフにすることが できますが、個々のノードに異なる値をすでに設定している場合、これは完全に機能しないかもしれません。 なぜなら、その値がグローバルデフォルトより優先されるからです。

LINSTORコントローラーがサテライトとの接続を失った場合、再接続を試みるだけでなく、 そのサテライト用のタイマーを開始します。そのタイマーが DrbdOptions/AutoEvictAfterTime を 超え、かつそのサテライト上のDRBDリソースへのすべてのDRBD接続が切断されると、 コントローラーは DrbdOptions/AutoEvictMaxDisconnectedNodes が達成されたかどうかを 確認します。もし、そうでない場合、および DrbdOptions/AutoEvictAllowEviction が 対象のノードでtrueの場合、サテライトはEVICTEDとマークされます。 同時にコントローラは、全てのDRBDリソースについて、リソースの数が まだ DrbdOptions/AutoEvictMinReplicaCount よりも多いかどうかを確認します。 もし多い場合、そのリソースはDELETEDとマークされます。もし成功しない場合、 対応するリソースグループの設定で自動配置が開始されます。自動配置が失敗した場合、 コントローラーは後で再度試行します。新しいノードの追加などの変更が行われることで、 別の結果が可能になるかもしれない場合があります。自動配置が必要なリソースは、 対応する自動配置が成功した場合にのみ削除マークが付けられます。

サテライトは自身を退去した場合、コントローラーとの接続を再確立することは できません。ノードが動作していても、手動で再接続を試みても失敗します。サテライトを 削除することもできません。サテライトは復元することができます。これにより、 サテライトからEVICTEDフラグが削除され、再度使用できるようになります。 以前に設定されたネットワークインターフェース、ストレージプール、プロパティ、 および同様のエンティティ、非DRBD関連のリソース、およびLINSTORが他の場所に自動配置できなかった リソースはまだサテライト上にあります。サテライトを復元するには、次のコマンドを使用してください:

# linstor node restore [nodename]

そのノードにあった全てのもの、ノード自体も含めて全てを捨て去りたい場合は、 代わりに node lost コマンドを使用する必要があります。

3.24.3. オートディスクフルと関連オプション

LINSTORオブジェクトのさまざまなLINSTORオブジェクト(たとえば、リソース定義など)に対して、LINSTORが自動的に「ディスク不足」ノードを「ディスクフル」にするのをサポートし、その後適切なクリーンアップ操作を実行するように、LINSTOR auto-diskful および auto-diskful-allow-cleanup プロパティを設定できます。

この機能は、Diskless ノードがDRBDリソースの Primary 状態に指定された分数よりも長く残っている場合に便利です。これは、LINSTORで管理されたストレージを他のオーケストレーションやスケジューリングプラットフォーム(OpenStack、OpenNebulaなど)と統合するケースで発生する可能性があります。LINSTORと統合する一部のプラットフォームでは、ストレージボリュームがクラスタ内のどこで使用されるかを影響する手段がないかもしれません。

auto-diskfulオプションは、統合プラットフォームの操作に対して、あなたのコントロールを超えたアクションに対応するために、ストレージノードの役割を賢く委任する方法を提供します。

自動ディスク上書きオプションの設定

DrbdOptions/auto-diskful オプションをLINSTORリソース定義に設定することで、リソースが指定された分数よりも長い間DRBDの Primary 状態にある場合、LINSTORコントローラは Diskless DRBDリソースを Diskful にするように構成されます。指定された分数が経過すると、LINSTORは指定されたリソースに対して Diskless ノードでリソースの状態を切り替えるために resource toggle-disk コマンド を自動的に使用します。

このプロパティを設定するには、例えば、5分の閾値を持つ myres というLINSTORリソース定義に対して、次のコマンドを入力してください。

# linstor resource-definition set-property myres DrbdOptions/auto-diskful 5
リソースグループまたはコントローラにおけるAuto-Diskfulオプションの設定

DrbdOptions/auto-diskful オプションをLINSTORの controller または resource-group オブジェクトにも設定できます。コントローラーレベルでオプションを設定すると、そのオプションは、このオプションが設定されていないLINSTORクラスター内のすべてのLINSTORリソース定義に影響します。リソース定義自体またはリソースグループでこのオプションを設定していない場合、またはリソースを作成したリソースグループで設定しない場合です。

LINSTORリソースグループにオプションを設定すると、グループから生成されるすべてのリソース定義に影響が及びますが、リソース定義にそのオプションが設定されている場合は影響がありません。

auto-diskful オプションを設定する効果の優先順位は、最も高いものから最も低いものまで次の通りです。

  • Resource definition – Resource group – Controller

自動ディスク割り当てオプションの解除

LINSTORの auto-diskful オプションを無効にするには、次を入力してください:

# linstor <controller|resource-definition|resource-group> set-property DrbdOptions/auto-diskful
Auto-Diskful-Allow-Cleanup(オート・ディスクフル・アロー・クリーンナップ)オプションの設定

LINSTORの auto-diskful オプションの補助オプションとして、 DrbdOptions/auto-diskful-allow-cleanup オプションがあります。

このオプションは、次のLINSTORオブジェクトに設定できます:ノード、リソース、リソース定義、またはリソースグループ。このオプションのデフォルト値は True ですが、auto-diskful オプションが設定されていない限り、このオプションは効果がありません。

LINSTORがリソースをディスクフル(state= Diskful )に切り替えた後、リソースの プライマリ ロールにディスクレスノードが一定時間以上割り当てられた場合、そしてそれが DRBD によって以前の ディスクレス ノード(現在は プライマリ ノード)にデータが同期された後、リソースが任意の セカンダリ ノードから削除される瞬間、リソースが持つレプリカ数の制約を満たすためにそのアクションが必要になった際に、LINSTORはそのリソースを削除します。このようなケースが発生する可能性があり、たとえば、--auto-place オプションを使用してリソースに対してレプリカ数を指定した場合です。

3.24.4. SkipDisk

デバイスがI/Oエラーを発生させている場合、例えば物理的な障害が原因の場合、DRBDはこの状態を検出し、自動的にローカルディスクから切り離します。すべての読み込みおよび書き込みリクエストは、依然として健全なpeerに転送され、アプリケーションが中断することなく継続できます。

この自動切り離しは、drbdsetup events2ストリームに新しいイベントエントリを引き起こし、DRBDボリュームの状態を ‘UpToDate’ から Failed 最終的に Diskless に変更します。 LINSTORはこれらの状態変更を検出し、指定されたリソースに DrbdOptions/SkipDisk プロパティを自動的に True に設定します。 このプロパティにより、I/Oエラーを発生させるデバイスを持つノード上で実行されているLINSTORサテライトサービスが、すべての drbdadm adjust コマンドに --skip-disk をアタッチするようになります。

もし、このプロパティが設定されている場合、 linstor resource list コマンドもそれに応じて表示されます。

╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ┊ ResourceName ┊ Node ┊ Port ┊ Usage ┊ Conns ┊ State ┊ CreatedOn ┊ ╞══════════════════════════════════════════════════════════════════════════════════════════════╡ ┊ rsc ┊ bravo ┊ 7000 ┊ Unused ┊ Ok ┊ UpToDate, Skip-Disk (R) ┊ 2024-03-18 11:48:08 ┊ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯

この場合、(R) はすでにプロパティがリソースに設定されていることを示しています。 プロパティ DrbdOptions/SkipDisk がリソースとノードレベルの両方に設定される場合、 インジケータは (R, N) に変更されます。

このプロパティはLINSTORによって自動的に有効になっていますが、I/Oエラーの原因を解決した後、 健全な UpToDate 状態に戻るためにプロパティを手動で削除する必要があります。

# linstor resource set-property bravo rsc DrbdOptions/SkipDisk

3.25. 外部 DRBD メタデータの使用

デフォルトでは、LINSTOR は DRBD リソースを作成する際に 内部の DRBD メタデータ を使用します。 もし 外部の DRBD メタデータ を使用したい場合は、クラスタ内の LINSTOR ストレージプールの名前を StorPoolNameDrbdMeta プロパティに設定することで可能です。

StorPoolNameDrbdMeta プロパティを、以下の LINSTOR オブジェクトに設定できます。優先度の増加順にリストされています。

  • noderesource-groupresource-definitionresourcevolume-groupvolume-definition

たとえば、ノードレベルでプロパティを設定すると、優先順位の高いすべてのLINSTORオブジェクトに適用されます。ただし、プロパティがより高い優先順位のLINSTORオブジェクトにも設定されている場合、適用可能なDRBDリソースに対して最も優先度の高いLINSTORオブジェクトに設定されたプロパティ値が優先されます。

LINSTORを使用して新しいDRBDリソースを作成する際に、StorPoolNameDrbdMeta プロパティがDRBDリソースに適用される場合、プロパティを設定するLINSTORオブジェクトに基づいて、LINSTORはストレージプール内に2つの新しい論理ボリュームを作成します。1つはリソースデータのストレージ用であり、2つ目はリソースのDRBDメタデータを格納するためのものです。

StorPoolNameDrbdMeta プロパティを設定、変更、または削除しても、既存の LINSTOR で管理されている DRBD リソースに影響はありません。

3.25.1. 外部 DRBD メタデータ LINSTOR プロパティの設定

ノードレベルでプロパティを設定するには、例えば、以下のコマンドを入力してください:

# linstor node set-property <node-name> StorPoolNameDrbdMeta <storage-pool-name>

3.25.2. 外部 DRBD メタデータ LINSTOR プロパティの一覧化

指定されたLINSTORオブジェクトにプロパティが設定されているかを確認するには、 list-properties サブコマンドを使用できます。

# linstor node list-properties node-0

コマンドの出力には、指定されたLINSTORオブジェクトのセットプロパティとその値のテーブルが 表示されます。

╭─────────────────────────────────────╮ ┊ Key ┊ Value ┊ ╞═════════════════════════════════════╡
[...]
┊ StorPoolNameDrbdMeta ┊ my_thin_pool ┊ ╰─────────────────────────────────────╯

3.25.3. 外部DRBDメタデータLINSTORプロパティをアンセットする

プロパティを解除するには、ストレージプール名を指定せずに、次の例のように同じコマンドを入力してください。

# linstor node set-property <node-name> StorPoolNameDrbdMeta

3.26. QoS設定

LINSTORは、ブロックI/O操作に関連するカーネル変数に対応するsysfsプロパティを使用して、管理されたリソースのためのQoSを実装します。これらのsysfsプロパティは、帯域幅(1秒あたりのバイト数)、またはIOPS、またはその両方の制限になりえます。

sysfsファイルとそれに対応するLINSTORのプロパティは以下の通りです。

[cols=”3,2″]

sysfs (/sys/fs/)

LINSTOR Property

cgroup/blkio/blkio.throttle.read_bps_device

sys/fs/blkio_throttle_read

cgroup/blkio/blkio.throttle.write_bps_device

sys/fs/blkio_throttle_write

cgroup/blkio/blkio.throttle.read_iops_device

sys/fs/blkio_throttle_read_iops

cgroup/blkio/blkio.throttle.write_iops_device

sys/fs/blkio_throttle_write_iops

3.26.1. LINSTOR sysfsのプロパティを使ったQoSの設定

これらのLINSTORのプロパティは、set-property コマンドを使用して設定することができ、以下のオブジェクトに設定することができます: ボリューム、ストレージプール、リソース、コントローラ、またはノード。また、これらのQoSプロパティは、リソースグループ、ボリュームグループ、リソース定義、またはボリューム定義にも設定することができます。グループや定義にQoSプロパティを設定すると、そのグループや定義から作成されるリソースは、QoSの設定を継承します。

グループまたは定義に対して行われた設定は、グループまたは定義から作成された既存のリソースと新しいリソースの両方に影響します。

次の例では、リソースグループを作成し、ボリュームグループを作成し、ボリュームグループにQoS設定を適用し、リソースグループからリソースをスポーンしています。検証コマンドを実行すると、スポーンされたリソースがQoS設定を継承していることがわかります。 この例では、pool1 という名前の以前に作成されたLINSTORストレージプールを想定して使用します。この名前は、あなたの環境に存在するストレージプール名に置き換える必要があります。

# linstor resource-group create qos_limited --storage-pool pool1 --place-count 3
# linstor volume-group create qos_limited
# linstor volume-group set-property qos_limited 0 sys/fs/blkio_throttle_write 1048576
# linstor resource-group spawn-resources qos_limited qos_limited_res 200M

生成されたリソースがQoS設定を継承していることを確認するには、ストレージプールにストレージを提供するノードで、対応するsysfsファイルの内容を表示します。

# cat /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
252:4 1048576
QoS プロパティは継承されコピーされないため、 “parent” グループまたは定義から生成された “child” オブジェクトにはプロパティが表示されません。

3.26.2. 複数の DRBD デバイスを持つ LINSTOR ボリュームの QoS 設定

単一の LINSTOR ボリュームは、複数の DRBD デバイスで構成できます。たとえば、外部メタデータを含む DRBD には、データ (ストレージ) デバイス、メタデータ デバイス、および LINSTOR に提供される複合 DRBD デバイス (ボリューム) の 3 つの下位デバイスがあります。データデバイスとメタデータデバイスが異なる下位ディスクに対応している場合、そのような LINSTOR ボリュームに sysfs プロパティを設定すると、ローカルデータ (ストレージ) 下位デバイスのみが対応する /sys/fs/cgroup/blkio/ ファイルのプロパティ値を受け取ります。DRBD メタデータの下位デバイスや、LINSTOR で提供される複合下位デバイスは値を受け取りません。ただし、DRBD のデータとそのメタデータが同じ下位ディスクを共有する場合、QoS 設定はデータとメタデータ操作の両方のパフォーマンスに影響します。

3.26.3. NVMe の QoS設定

LINSTORのリソース定義に nvme-targetnvme-initiator リソースがある場合、各ノードの両方のデータ(ストレージ)バッキングデバイスは、sysfsプロパティの値を受け取ります。ターゲットの場合、データバッキングデバイスは、LVMまたはZFSのいずれかのボリュームになります。一方、イニシエータの場合、データバッキングデバイスは、接続されている nvme-device になります。その際、LUKS、NVMe、DRBDなど、その上にある他のLINSTORレイヤーがあっても関係ありません(詳細は DRBDを使わないLINSTOR を参照)。

3.27. ヘルプの利用

3.27.1. コマンドラインから確認

コマンドラインで利用可能なコマンドを簡単にリストアップする方法は、linstor と入力することです。

サブコマンドに関する追加情報(例:ノードの一覧表示)は、2つの方法で取得できます:

# linstor node list -h
# linstor help node list

LINSTOR がインタラクティブモード( linstor interactive )で動作しているときには ‘help’ サブコマンドはとても役にたちます。

LINSTORの最も有用な機能の一つは、豊富なタブ補完機能です。これを使って、LINSTORが知っているほぼすべてのオブジェクトの補完が可能です。たとえば、ノード名、IPアドレス、リソース名などが挙げられます。以下の例では、いくつかの補完の可能性とその結果が示されています:

# linstor node create alpha 1<tab> # ホスト名が解決できるとIPアドレスを補完します
# linstor resource create b<tab> c<tab> # linstorは backups, charlieリソースを補完します

LINSTOR クライアントをインストールしてもタブ補完が機能しない場合は、適切なファイルをソースに指定してみてください:

# source /etc/bash_completion.d/linstor # または
# source /usr/share/bash_completion/completions/linstor

Zシェルユーザー向けに、linstor-client コマンドはZシェルコンパイルファイルを生成できます。このファイルには、コマンドや引数の補完に基本的なサポートが備わっています。

# linstor gen-zsh-completer > /usr/share/zsh/functions/Completion/Linux/_linstor

3.27.2. SOSレポートの作成

何か問題が発生して原因を特定する必要がある場合は、次のコマンドを入力してください:

# linstor sos-report create

上記のコマンドは、コントローラーノードの /var/log/linstor/controller ディレクトリに新しい sos-report を作成します。別の方法として、以下のコマンドを入力することもできます:

# linstor sos-report download

このコマンドを実行すると、新しいSOSレポートが作成され、そのレポートがあなたのローカルマシンのカレントディレクトリにダウンロードされます。

このSOSレポートには、複数の情報源(LINSTORログ、dmesg 、LINSTORで使用される外部ツールのバージョン、ip a 、データベースのダンプなど)からのログと有用なデバッグ情報が含まれています。これらの情報は、各ノードごとにプレーンテキスト形式で .tar.gz ファイルに保存されます。

3.27.3. コミュニティの助けを借りる

コミュニティからの支援を受けるには、こちらのDRBDユーザーメーリングリストに登録してください: https://lists.linbit.com/listinfo/drbd-user

3.27.4. GitHub

バグを報告したり機能のリクエストを提出したりするには、LINBITのGitHubページをご覧ください。https://github.com/linbit

3.27.5. 有料のサポートと開発

必要に応じてリモートインストールサービス、24時間365日のサポート、認定リポジトリへのアクセス、または機能開発を購入したい場合は、お問い合わせください。お問い合わせ先: +1-877-454-6248 (1-877-4LINBIT)、国際番号: +43-1-8178292-0、メール: [email protected]

GUIでLINSTORを管理

4. LINBIT SDS GUI

LINBIT SDS GUIは、現在テクノロジープレビュー段階にあるLINSTOR®クライアントの代替品です。このコンポーネントはプロプライエタリであり、利用するにはLINBIT®の顧客専用リポジトリにアクセスする必要があります。

4.1. 前提条件

  • LINBIT の顧客リポジトリへのアクセス

  • LINSTOR コントローラーインスタンスの実行と動作環境

4.2. LINSTOR SDS GUI のインストール

LINSTOR コントローラーと同じノードに LINSTOR GUI パッケージをインストールし linstor-controller サービスを再起動します。

yum/dnf ベースのディストリビューションでは、次の方法でソフトウェアをインストールできます。

yum install linstor-gui

apt ベースのディストリビューションでは、次の方法でソフトウェアをインストールします。

apt install linstor-gui

Kubernetes では、LINSTOR SDS GUI は linstor-controller v1.15.0 以降組み込まれています。

4.3. LINBIT SDS GUIを使用してLINSTORクラスターを管理する

LINBIT SDS GUIにアクセスするには、アクティブなLINSTORコントローラーノードに対してTCPポート3370を介したHTTP接続を開きます。たとえば、LINSTORコントローラーのIPアドレスが192.168.222.250の場合、Webブラウザーのアドレスバーに`http://192.168.222.250:3370` を入力してLINBIT SDS GUIを使用できます。

LINSTOR統合

5. Kubernetes で LINSTOR ボリューム

この章では、オペレータによって管理され、 LINSTOR CSIプラグインを使用してプロビジョニングされた ボリュームを使用する方法について、Kubernetes(K8s)でLINSTOR®の使用方法について説明します。

この章では、LINSTORとKubernetesを使用したすべてのインストールオプションや可能な構成について詳細に説明しています。この章は説明的なコメントから始まり、その後展開手順に移ります。その後、Kubernetes展開内でストレージを構成するためにLINSTORを始める手順が示されています。その後、スナップショットやモニタリングなどのより高度なトピックや構成について説明されています。

5.1. Kubernetesの概要

Kubernetes は、コンテナオーケストレーターです。Kubernetes は、宣言した仕様に基づいてコンテナと関連サービスの動作を定義します。このガイドでは、Kubernetes オブジェクトの仕様を定義する AML ファイルを介して kubectl を使用することに焦点を当てます。

5.2. Kubernetes への LINSTOR のデプロイ

LINBITは、商用サポートの顧客向けにLINSTOR Operatorを提供しています。このOperatorは、DRBDをインストールし、サテライトおよびコントローラーポッドを管理し、その他関連する機能を提供することで、Kubernetes上でのLINSTORの展開を容易にします。

LINBITのコンテナイメージリポジトリ(https://drbd.io)、LINSTOR Operatorによって使用されていますが、LINBITの顧客またはLINBIT顧客トライアルアカウントを通じてのみ利用可能です。[価格情報の取得やトライアルの開始については、LINBITにお問い合わせください。https://linbit.com/contact-us/]また、LINBITの顧客でなくても、LINSTOR SDSのアップストリームプロジェクトである[Piraeus](https://github.com/piraeusdatastore/piraeus-operator)を使用することもできます。

LINSTOR Operator v2は、新しいクラスタにLINBIT SDSをKubernetesに展開する推奨方法です。 既存のOperator v1の展開を使用しているユーザーは、引き続きHelmの展開を使用し、 Operator v1の展開手順 にスキップしてください。

5.3. LINSTOR Operator v2 のデプロイメント

LINSTOR Operator v2を展開する際は、Kustomizeツールを使用し、kubectl と統合するか、あるいはHelmとLINBITのHelmチャートを使用することができます。

もしすでにあなたのクラスターにLINSTOR Operator v1がデプロイされている場合、KubernetesでLINBIT SDSデプロイメントをOperator v2にアップグレードすることができます。詳細な手順は、charts.linstor.ioで確認できます。

5.3.1. Kustomizeを使用してオペレーターv2を作成する

オペレータを展開するには、kustomization.yaml ファイルを作成してください。これにより、drbd.io のプルシークレットを宣言し、オペレータの展開を許可します。オペレータは新しい名前空間 linbit-sds に展開されます。 MY_LINBIT_USERMY_LINBIT_PASSWORD をご自身の認証情報に置き換えてください。最新リリースはcharts.linstor.ioで確認できます。

Listing 2. kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: linbit-sds
resources:
  - https://charts.linstor.io/static/v2.4.0.yaml (1)
generatorOptions:
  disableNameSuffixHash: true
secretGenerator:
  - name: drbdio-pull-secret
    type: kubernetes.io/dockerconfigjson
    literals:
      - .dockerconfigjson={"auths":{"drbd.io":{"username":"MY_LINBIT_USER","password":"MY_LINBIT_PASSWORD"}}} (2)
1 リンクから最新のリリースマニフェストに置き換えてください: charts.linstor.io
2 MY_LINBIT_USERMY_LINBIT_PASSWORD を、あなたの my.linbit.com の認証情報で置き換えてください。

次に、kubectl コマンドを使用して kustomization.yaml ファイルを適用し、オペレーターの開始を待ちます:

$ kubectl apply -k .
namespace/linbit-sds created
...
$ kubectl -n linbit-sds  wait pod --for=condition=Ready --all
pod/linstor-operator-controller-manager-6d9847d857-zc985 condition met

オペレーターはLINBIT SDS for Kubernetes を展開する準備が整いました。

5.3.2. コマンドラインツールを使用して、LINBIT SDS for Kubernetes をデプロイ

KubernetesでのLINBIT SDSのオペレーターv2をデプロイするのは、新しい`LinstorCluster` リソースを作成して、オペレーターがセットアップを完了するのを待つだけで簡単です:

$ kubectl create -f - <<EOF
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec: {}
EOF
$ kubectl wait pod --for=condition=Ready -n linbit-sds --timeout=3m --all

出力には、待機条件が満たされ、LINBIT SDSポッドが起動して実行されていることが最終的に表示されるはずです。

pod/ha-controller-4tgcg condition met
pod/k8s-1-26-10.test condition met
pod/linstor-controller-76459dc6b6-tst8p condition met
pod/linstor-csi-controller-75dfdc967d-dwdx6 condition met
pod/linstor-csi-node-9gcwj condition met
pod/linstor-operator-controller-manager-6d9847d857-zc985 condition met

5.3.3. Helmを使用してオペレーターv2を作成する

Helmを使用してLINSTOR Operator v2を作成するには、まず次のコマンドを入力して`linstor` Helmチャートリポジトリを追加してください:

$ MY_LINBIT_USER=<my-linbit-customer-username>
$ MY_LINBIT_PASSWORD=<my-linbit-customer-password>
$ helm repo add linstor https://charts.linstor.io

次に、次のコマンドを入力して、LINSTOR Operator v2をインストールしてください:

$ helm install linstor-operator linstor/linstor-operator \
  --namespace linbit-sds \
  --create-namespace \
  --set imageCredentials.username=$MY_LINBIT_USER \
  --set imageCredentials.password=$MY_LINBIT_PASSWORD \
  --wait

5.3.4. Helmを使用してLINBIT SDS for Kubernetesをデプロイする

コマンドの出力により、Operator v2 がインストールされたことが確認できたら、Helm を使用して linbit-sds チャートをインストールして LINBIT SDS をデプロイできます:

$ helm install -n linbit-sds linbit-sds linstor/linbit-sds

この最終的な helm install コマンドの出力には、成功メッセージが表示されるべきです。

[...]
LinstorCluster: linbit-sds

Successfully deployed!
[...]

5.3.5. オペレーターv2を使用したストレージの設定

デフォルトでは、LINBIT SDS for Kubernetesはストレージを構成しません。ストレージを追加するには、Operatorが1つ以上のサテライトを構成するために使用する「LinstorSatelliteConfiguration」を構成できます。

次の例は、シンプルな FILE_THIN プールを作成し、ホストへの追加設定は不要です:

$ kubectl apply -f - <<EOF
apiVersion: piraeus.io/v1
kind: LinstorSatelliteConfiguration
metadata:
  name: storage-pool
spec:
  storagePools:
    - name: pool1
      fileThinPool:
        directory: /var/lib/linbit-sds/pool1
EOF

他の種類のストレージプールも設定することができます。詳細は、以下のリンクを参照してください。upstreamの例

5.3.6. オペレーターv2デプロイメントのセキュリティ化

キーと証明書に基づく暗号化を設定することで、例えば、LINSTORのサテライトノードとLINSTORコントローラーノード、またはLINSTORクライアントとLINSTOR API間など、特定のLINSTORコンポーネント間の通信をより安全にすることができます。

LINSTORコントローラーとサテライト間のTLSの設定

サテライトノードとLINSTORコントローラー間のトラフィックをセキュアにするためには、cert-managerまたはOpenSSLを使用してTLSを構成して、トラフィックを暗号化するTLS証明書を作成することができます。

cert-manager を使用してキーと証明書をプロビジョニングする

この方法を使用するには、クラスター内で機能するcert-managerのデプロイメントが必要です。キーと証明書をプロビジョニングする別の方法については、以下の OpenSSL セクションを参照してください。

LINSTORコントローラーとサテライトはお互いを信頼する必要があります。そのため、これらのコンポーネントには証明書機関(CA)だけが必要です。新しいcert-managerリンクを作成するために、デプロイメントに以下のYAML構成を適用してください:Issuerリソース:

Listing 3. linstor-cert-manager.yaml
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: ca-bootstrapper
  namespace: linbit-sds
spec:
  selfSigned: { }
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: linstor-internal-ca
  namespace: linbit-sds
spec:
  commonName: linstor-internal-ca
  secretName: linstor-internal-ca
  duration: 87600h # 10 years
  isCA: true
  usages:
    - signing
    - key encipherment
    - cert sign
  issuerRef:
    name: ca-bootstrapper
    kind: Issuer
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: linstor-internal-ca
  namespace: linbit-sds
spec:
  ca:
    secretName: linstor-internal-ca

次に、新しい発行者リソースを構成し、LINSTORオペレーターがコントローラーおよびサテライトのトラフィックを暗号化するために必要な証明書を提供できるように、次のYAML構成を適用してください:

Listing 4. linstor-ca-issuer.yaml
---
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec:
  internalTLS:
    certManager:
      name: linstor-internal-ca
      kind: Issuer
---
apiVersion: piraeus.io/v1
kind: LinstorSatelliteConfiguration
metadata:
  name: internal-tls
spec:
  internalTLS:
    certManager:
      name: linstor-internal-ca
      kind: Issuer

デプロイメントに上記の設定を適用した後、 TLSトラフィックの暗号化が機能している ことを確認できます。

OpenSSLを使用してキーと証明書をプロビジョニング

もしあなたが上記の Provisioning Keys and Certificates By Using cert-manager セクションを完了した場合、このセクションをスキップして Verifying TLS Configuration セクションに進むことができます。

この方法はコマンドライン上で openssl プログラムを必要とします。

最初に、新しいキーと自己署名証明書を使用して新しいCAを作成します。暗号化アルゴリズムや有効期限などのオプションを、デプロイメントの要件に合わせて変更することができます。

# openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 \
-subj "/CN=linstor-internal-ca" \
-keyout ca.key -out ca.crt

次に、新しいキーを2つ作成してください。1つはLINSTORコントローラ用、もう1つはすべてのサテライト用です:

# openssl genrsa -out controller.key 4096
# openssl genrsa -out satellite.key 4096

次に、前に作成したCAによって署名され、有効期限が10年の各キーのための証明書を作成してください:

# openssl req -new -sha256 -key controller.key -subj "/CN=linstor-controller" -out controller.csr
# openssl req -new -sha256 -key satellite.key -subj "/CN=linstor-satellite" -out satellite.csr
# openssl x509 -req -in controller.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out controller.crt -days 3650 -sha256
# openssl x509 -req -in satellite.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out satellite.crt -days 3650 -sha256

次に、作成したキーと証明書からKubernetesのシークレットを作成してください:

# kubectl create secret generic linstor-controller-internal-tls -n linbit-sds \
--type=kubernetes.io/tls --from-file=ca.crt=ca.crt --from-file=tls.crt=controller.crt \
--from-file=tls.key=controller.key
# kubectl create secret generic linstor-satellite-internal-tls -n linbit-sds \
--type=kubernetes.io/tls --from-file=ca.crt=ca.crt --from-file=tls.crt=satellite.crt \
--from-file=tls.key=satellite.key

最後に、Operatorリソースを新たに作成されたシークレットを参照するように設定し、次のYAML構成をデプロイメントに適用してください:

Listing 5. linstor-internal-tls-secret.yaml
---
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec:
  internalTLS:
    secretName: linstor-controller-internal-tls
---
apiVersion: piraeus.io/v1
kind: LinstorSatelliteConfiguration
metadata:
  name: internal-tls
spec:
  internalTLS:
    secretName: linstor-satellite-internal-tls
TLS設定の検証

LINSTORコントローラと サテライト トラフィックの暗号化を構成した後、kubectl linstor node list コマンドの出力を調べることで、LINSTORコントローラとサテライト間の安全なTLS接続を確認できます。TLSが有効になっている場合、出力にはアクティブなサテライトアドレスの横に (SSL) が表示されます。

|=====================================================================|
# kubectl linstor node list
+---------------------------------------------------------------------+
| Node               | NodeType  | Addresses                 | State  |
| node01.example.com | SATELLITE | 10.116.72.142:3367 (SSL)  | Online |
| node02.example.com | SATELLITE | 10.127.183.140:3367 (SSL) | Online |
| node03.example.com | SATELLITE | 10.125.97.50:3367 (SSL)   | Online |
+---------------------------------------------------------------------+
上記のコマンドは、Kubernetes内でLINSTORクライアントコマンドを簡素化するために kubectl-linstor コマンドに依存しています。ツールのインストール方法については、 LINSTORクライアントコマンド入力の簡略化 の手順に従ってインストールすることができます。

もし出力が (SSL) ではなく (PLAIN) になっている場合、それはTLS構成が正常に適用されていないことを示します。 LinstorClusterLinstorSatellite リソースの状態を確認してください。

出力に (SSL) が表示される場合でも、ノードがオフラインのままである場合、通常は証明書が他の側で信頼されていないことを示しています。コントローラーの tls.crt がサテライトの ca.crt に信頼されていること、そしてその逆も確認してください。次のシェル関数は、1つのTLS証明書が他のTLS証明書に信頼されているかどうかを迅速に確認する方法を提供します。

function k8s_secret_trusted_by() {
	kubectl get secret -n linbit-sds \
    -ogo-template='{{ index .data "tls.crt" | base64decode }}' \
    "$1" > $1.tls.crt
	kubectl get secret -n linbit-sds \
    -ogo-template='{{ index .data "ca.crt" | base64decode }}' \
    "$2" > $2.ca.crt
	openssl verify -CAfile $2.ca.crt $1.tls.crt
}
# k8s_secret_trusted_by satellite-tls controller-tls

TLS暗号化が適切に設定されている場合、上記の関数を実行した出力は次のようになるはずです。

satellite-tls.tls.crt: OK

上流のピレウスプロジェクトのリファレンスドキュメントには、TLSに関連するすべての利用可能な LinstorCluster および LinstorSatelliteConfiguration リソースオプションが表示されます。

LINSTOR APIのTLSの設定

このセクションでは、LINSTOR APIのTLS設定方法について説明します。このAPIは、LINSTORコントローラーによって提供され、CSIドライバーやオペレータ自体などのクライアントによって使用され、LINSTORクラスターを制御します。

このセクションの指示に従うには、以下に慣れている必要があります:

  • Editing LinstorCluster resources

  • Using either cert-manager or OpenSSL to create TLS certificates

cert-managerを使用してキーと証明書のプロビジョニング

この方法には、クラスター内のcert-managerデプロイメントに対する動作するcert-managerが必要です。キーと証明書を提供する代替方法については、以下の OpenSSL セクションを参照してください。

TLSを使用する場合、LINSTOR APIはクライアント証明書を認証に使用します。これらの証明書のためだけに別のCAを持つことが良い慣行です。これを行うには、まずデプロイメントに以下のYAML構成を適用して、証明書発行者を作成してください。

---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: ca-bootstrapper
  namespace: linbit-sds
spec:
  selfSigned: { }
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: linstor-api-ca
  namespace: linbit-sds
spec:
  commonName: linstor-api-ca
  secretName: linstor-api-ca
  duration: 87600h # 10 years
  isCA: true
  usages:
    - signing
    - key encipherment
    - cert sign
  issuerRef:
    name: ca-bootstrapper
    kind: Issuer
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: linstor-api-ca
  namespace: linbit-sds
spec:
  ca:
    secretName: linstor-api-ca

次に、この発行者を設定して、オペレーターが必要な証明書を提供できるようにし、次の設定を適用してください。

---
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec:
  apiTLS:
    certManager:
      name: linstor-api-ca
      kind: Issuer

これで、cert-managerを使用してTLSでLINSTOR APIを保護するために必要な手順が完了しました。 TLSが機能していることを確認するには、 Verifying LINSTOR API TLS Configuration セクションにスキップしてください。

OpenSSLを使用してキーと証明書をプロビジョニング

この方法では、コマンドライン上で openssl プログラムが必要です。キーと証明書を取得する別の方法については、上記の cert-manager セクションを参照してください。

最初に、新しいキーと自己署名証明書を使用して新しい証明書機関(CA)を作成します。暗号化アルゴリズムや有効期限などのオプションを変更して、デプロイメントの要件に合わせることができます。

# openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 \
-subj "/CN=linstor-api-ca" \
-keyout ca.key -out ca.crt

次に、LINSTOR APIサーバー用の1つとLINSTOR APIクライアント用の1つの新しいキーを作成してください。

# openssl genrsa -out api-server.key 4096
# openssl genrsa -out api-client.key 4096

次に、サーバーのための証明書を作成します。クライアントが異なる短縮されたサービス名を使用する可能性があるため、複数のサブジェクト名を指定する必要があります。

# cat /etc/ssl/openssl.cnf > api-csr.cnf
# cat >> api-csr.cnf <<EOF
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
DNS.0 = linstor-controller.linbit-sds.svc.cluster.local
DNS.1 = linstor-controller.linbit-sds.svc
DNS.2 = linstor-controller
EOF
# openssl req -new -sha256 -key api-server.key \
-subj "/CN=linstor-controller" -config api-csr.cnf \
-extensions v3_req -out api-server.csr
# openssl x509 -req -in api-server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -config api-csr.cnf \
-extensions v3_req -out api-server.crt \
-days 3650 -sha256

クライアント証明書について、1つのサブジェクト名を設定するだけで十分です。

# openssl req -new -sha256 -key api-client.key \
-subj "/CN=linstor-client" -out api-client.csr
# openssl x509 -req -in api-client.csr \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-out api-client.crt \
-days 3650 -sha256

次に、作成した鍵と証明書からKubernetesのシークレットを作成してください。

# kubectl create secret generic linstor-api-tls -n linbit-sds \
--type=kubernetes.io/tls --from-file=ca.crt=ca.crt --from-file=tls.crt=api-server.crt \
--from-file=tls.key=api-server.key
# kubectl create secret generic linstor-client-tls -n linbit-sds \
--type=kubernetes.io/tls --from-file=ca.crt=ca.crt --from-file=tls.crt=api-client.crt \
--from-file=tls.key=api-client.key

最後に、オペレータのリソースを新しく作成したシークレットを参照するように設定してください。シンプルにするため、すべてのコンポーネントに同じクライアントシークレットを設定することができます。.

apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec:
  apiTLS:
    apiSecretName: linstor-api-tls
    clientSecretName: linstor-client-tls
    csiControllerSecretName: linstor-client-tls
    csiNodeSecretName: linstor-client-tls
LINSTOR API TLS設定の検証

APIが実行され、TLSでセキュリティが確保されていることを、HTTPSエンドポイントに手動で curl コマンドを使用して接続することで検証できます。

# kubectl exec -n linbit-sds deploy/linstor-controller -- \
curl --key /etc/linstor/client/tls.key \
--cert /etc/linstor/client/tls.crt \
--cacert /etc/linstor/client/ca.crt \
https://linstor-controller.linbit-sds.svc:3371/v1/controller/version

コマンドが成功した場合、APIはHTTPSを使用しており、クライアントは自分の証明書を使用してコントローラに接続できるようになっています。コマンドの出力は、次のような内容が表示されるはずです:

{"version":"1.20.2","git_hash":"58a983a5c2f49eb8d22c89b277272e6c4299457a","build_time":"2022-12-14T14:21:28+00:00","rest_api_version":"1.16.0"}%

コマンドの出力にエラーが表示された場合、クライアント証明書がAPIシークレットに信頼されているか、その逆も確認してください。次のシェル関数は、1つのTLS証明書が別のTLS証明書に信頼されているかを簡単に確認する方法を提供します。

function k8s_secret_trusted_by() {
    kubectl get secret -n linbit-sds \
    -ogo-template='{{ index .data "tls.crt" | base64decode }}' \
    "$1" > $1.tls.crt
    kubectl get secret -n linbit-sds \
    -ogo-template='{{ index .data "ca.crt" | base64decode }}' \
    "$2" > $2.ca.crt
    openssl verify -CAfile $2.ca.crt $1.tls.crt
}
# k8s_secret_trusted_by satellite-tls controller-tls

TLS暗号化が適切に設定されている場合、上記の関数を実行した出力は次のようになるはずです。

satellite-tls.tls.crt: OK

別の問題は、予期していないサービス名を使用している証明書を使用しているAPIエンドポイントかもしれません。この問題に対する典型的なエラーメッセージは、次のようになります:

curl: (60) SSL: no alternative certificate subject name matches target host name 'linstor-controller.piraeus-datastore.svc'

この場合、証明書を提供する際に正しいサブジェクト名が指定されていることを確認してください。利用可能なすべてのオプションは、上流のPiraeusプロジェクトのリファレンスドキュメントに詳しく記載されています: LinstorCluster

LINSTORのパスフレーズ作成

LINSTORは、 ボリュームを暗号化 してアクセス認証情報をバックアップするなどの操作にパスフレーズを使用できます。

KubernetesデプロイメントでLINSTORパスフレーズを設定するには、参照されるシークレットはオペレータと同じ名前空間(デフォルトは linbit-sds )に存在し、MASTER_PASSPHRASE エントリを持っている必要があります。

次の例のYAML構成は、.spec.linstorPassphraseSecret のパスフレーズを example-passphrase に設定します。

重要: デプロイメント用に異なるパスフレーズを選択してください。

---
apiVersion: v1
kind: Secret
metadata:
  name: linstor-passphrase
  namespace: linbit-sds
data:
  # CHANGE THIS TO USE YOUR OWN PASSPHRASE!
  # Created by: echo -n "example-passphrase" | base64
  MASTER_PASSPHRASE: ZXhhbXBsZS1wYXNzcGhyYXNl
---
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec:
  linstorPassphraseSecret: linstor-passphrase

5.3.7. Operator v2 デプロイメントにおける CustomResourceDefinitions の使用

LINSTOR Operator v2のデプロイメント内では、LINSTOR関連のKubernetes CustomResourceDefinitions (CRDs) を変更することでクラスターの状態を変更したり、リソースのステータスを確認することができます。これらのリソースの概要リストは以下の通りです。より詳細な情報については、各リソースにリンクされたPiraeusプロジェクトのAPIリファレンスを参照してください。LinstorCluster

このリソースはLINSTORクラスターの状態とKubernetesとの統合を制御します。LinstorSatelliteConfiguration:: このリソースは、LINSTORのサテライトの状態を制御し、オプションで一部のノードにのみ適用できます。LinstorSatellite:: このリソースは単一のLINSTORサテライトの状態を制御します。このリソースは直接変更されることを意図していません。代わりに、すべての一致する LinstorSatelliteConfiguration リソースをマージしてLINSTOR Operatorによって作成されます。 LinstorNodeConnection:: このリソースはLINSTORノード接続の状態を制御します。 ==== LINSTORオペレータv2をデプロイメントした後の次のステップ

LINBIT SDSをKubernetesにデプロイした後、この章の [s-kubernetes-basic-configuration-and-deployment], Operator v2デプロイメントにおけるDRBDモジュールローダーの設定:, Operator v2 デプロイメントにおいて DRBD レプリケーション用ホストネットワークを使用する セクションに進むか、または上流のPiraeusプロジェクトの tutorials を参照してください。 === LINSTOR Operator v1のデプロイメント

<<s-kubernetes-deploy-linstor-operator-v2, Operator v2>>. LINSTOR Operator v2 を既にデプロイメント済みの場合は、このセクションをスキップし、 <<s-kubernetes-deploy-external-controller>> から始まるこの章の他のトピックに進んでください。

Operator v1 は、次のようにして Helm v3 チャートを使用してインストールされます:

  • あなたの my.linbit.com の認証情報を含む Kubernetes シークレットを作成してください。

    kubectl create secret docker-registry drbdiocred --docker-server=drbd.io \
      --docker-username=<YOUR_LOGIN> --docker-email=<YOUR_EMAIL> --docker-password=<YOUR_PASSWORD>

    この秘密の名前は、デフォルトで drbdiocred とHelmの値で指定されたものと一致しなければなりません。

  • LINSTORのデータベースバックエンドを構成します。デフォルトでは、このチャートはデータベースバックエンドとしてetcdを構成します。オペレータはLINSTORを データストアとしてKubernetesを 直接使用するようにも設定することができます。etcdの経路を選択する場合は、それに対して永続ストレージを構成する必要があります。

    • 既存のストレージプロビジョナーをデフォルトの StorageClass と共に使用してください。

    • Use hostPath volumes.

    • 永続化を無効にしてください。基本的なテストのみに使用してください。以下の helm install コマンドに --set etcd.persistentVolume.enabled=false を追加することで実現できます。

  • ストレージガイド を読んで、LINSTORの基本ストレージセットアップを構成してください。

  • セキュリティのデプロイメントを保護するセクション を読み、必要に応じて構成してください。

  • 最終段階で、helm install コマンドで --set を使用して適切なカーネルモジュールインジェクタを選択します。

    • 使用しているディストリビューションに応じてインジェクターを選択してください。適切なバージョンを、drbd9-rhel7drbd9-rhel8、その他のいずれかから、 http://drbd.io/ で最新バージョンを選択してください。drbd9-rhel8 イメージは、RHCOS(OpenShift)でも使用する必要があります。SUSE CaaS Platformの場合は、使用しているCaaS Platformのベースシステムに一致するSLESのインジェクターを使用してください(例:drbd9-sles15sp1)。例:

      operator.satelliteSet.kernelModuleInjectionImage=drbd.io/drbd9-rhel8:v9.1.8
    • ホストマシンに既に存在するモジュールのみを挿入します。モジュールが見つからない場合は、スキップされます。.

      operator.satelliteSet.kernelModuleInjectionMode=DepsOnly
    • D他の手段でDRBDをインストールする場合は、カーネルモジュールのインジェクションを無効にしてください。 DepsOnly によって非推奨設定されています。

      operator.satelliteSet.kernelModuleInjectionMode=None
  • 最後にすべてをセットアップする linstor-op という名前の Helm デプロイメントを作成します。

    helm repo add linstor https://charts.linstor.io
    helm install linstor-op linstor/linstor

    デプロイメントのさらなるカスタマイゼーションについては、 advanced deployment section で議論されています。 ==== LINSTOR向けKubernetesバックエンド

INSTORコントローラーは、クラスターの状態を永続化するために直接Kubernetes APIを使用することができます。このバックエンドを有効にするには、次のオーバーライドファイルをチャートのインストール中に使用してください。:

Listing 6. k8s-backend.yaml
etcd:
  enabled: false
operator:
  controller:
    dbConnectionURL: k8s

ヒント:既存のetcdバックエンドを使用するクラスタを、Kubernetes APIバックエンドに移行することが可能です。移行手順については、charts.linstor.ioの移行手順を参照してください。 ==== 永続ストレージボリュームの作成

pv-hostpath Helmテンプレートを使用して、hostPath 永続ボリュームを作成できます。必要なだけ多くのPVを作成して、設定されたetcd replicas(デフォルトは1)を満たしてください。

nodes= オプションの中で、クラスターノード名に応じて hostPath 永続ボリュームを作成してください。

helm repo add linstor https://charts.linstor.io
helm install linstor-etcd linstor/pv-hostpath

デフォルトでは、control-plane ノードごとに PV が作成されます。インストールコマンドに --set "nodes={<NODE0>,<NODE1>,<NODE2>}" を渡すことで、ストレージノードを手動で選択することができます。注意: ノードを参照する正しい値は、kubernetes.io/hostname ラベルの値です。すべてのノードの値をリストアップするには、kubectl get nodes -o custom-columns="Name:{.metadata.name},NodeName:{.metadata.labels['kubernetes\.io/hostname']}" を実行してください。 ==== 既存のデータベースの使用

LINSTORは既存のPostgreSQL、MariaDB、またはetcdデータ