第25章 DRBD Manage

目次

25.1. クラスタの初期設定
25.2. ノードの追加
25.2.1. DRBD Manageノードの種類
25.2.2. コントロールノードの追加
25.2.3. ピュアコントローラーノード追加
25.2.4. サテライトノードの追加
25.2.5. ピュアクライアントノードの追加
25.2.6. 外部ノードの追加
25.3. クラスタ設定
25.4. ストレージプラグインの設定
25.4.1. LVM の設定
25.4.2. ZFS の設定
25.4.3. ストレージプラグインについての情報
25.5. リソース/ボリュームの作成とデプロイ
25.6. スナップショット管理
25.6.1. スナップショットの作成
25.6.2. スナップショットのリストア
25.6.3. スナップショット削除
25.7. クラスタ状態の確認
25.8. リソースのオプション設定をする
25.9. DRBD Manageでのデータ再配置
25.10. ヘルプ
[重要]重要

DRBD Manage は 2018年の EoL に達し、LINSTOR に置き換えられます。

DRBD Manageは論理ボリューム(LVM)とDRBDの設定ファイルの管理を行う抽象化レイヤーです。DRBD Manageの機能には、DRBDボリュームの作成、リサイズ、削除が含まれます。また、DRBD ManageはDRBD領域のスナップショット作成やボリューム作成も制御します。

この章では一般的なオペレーションでの管理作業を説明します。トラブルシューティングについては扱いません。トラブルシューティングについては12章トラブルシューティングとエラーからの回復を参照ください。ストレージプラグインとして LVM を使用する場合は、「LVM の設定」 セクションを読んでから、ここに戻ってきてください。

25.1. クラスタの初期設定

前提として、以下の手順が すべての クラスタノードで行われている必要があります。

  1. DRBD9のカーネルモジュールがインストールされてロードされている。
  2. drbd-utils がインストールされている。
  3. LVM toolsがインストールされている。
  4. drbdmanage と、その依存関係のあるパッケージがインストールされている。

サーバコンポーネントの開始が必要な場合は、DRBDmanageがDBusアクティベーションを使用して行います。手動では行わないでください。

まず最初に drbdmanage の設定ファイル(/etc/drbdmanaged.cfg)を確認し、設定ファイルで指定した名前の LVM ボリュームグループを作成します。以下の例ではデフォルト名の drbdpool を使用し, /dev/sda6/dev/sda7 からなるボリュームグループを作成しています。ボリュームグループの作成は、すべての クラスタノードで行います。

# vgcreate drbdpool /dev/sda6 /dev/sda7

次に、クラスタ設定を全クラスタノードに配布するために使用する「コントロールボリューム」を作成します。ノードに複数のインターフェースがある場合は、DRBDが他のノードとの通信に使用するIPアドレスを指定する必要があります。そうでない場合にはIPアドレス指定は任意項目です。この作業は1つのノードで実行すれば十分です。

# drbdmanage init 10.43.70.2

LVMボリューム名は管理者の負担も減りますので、デフォルトのまま drbdpool を使用するのがよいでしょう。何らかの理由で別の名前を使用する場合には、/etc/drbdmanaged.cfg で正しく drbdctrl-vg オプションが設定されているか確認してください。設定は「クラスタ設定」で説明します。

25.2. ノードの追加

クラスタへのノードの追加は簡単で、コマンドを1つ、パラメータを2つ付けて実行するだけです。

  1. パラメータの1つはノード名で、これは 必ず uname -n の出力結果と一致していなければなりません。
  2. The IP address of the node.

Note. DNSが適切に設定されていれば、drbdmanage はノード名に対するIPアドレスをタブ補完することができます。

# drbdmanage add-node bravo 10.43.70.3

コマンドが alpha ノードで実行されたものとします。このとき root ユーザーが ssh 経由で bravo ノード上で root ユーザーとしてコマンドが実行できれば、bravo ノードは自動的にクラスタに参加します。

公開鍵認証で ssh ログインができない場合は、drbdmanagebravo ノードをクラスタに参加させるコマンドを表示しますので、これを bravo ノードで実行します。参加させたいノードで実行するためのコマンドは、いつでも drbdmanage で確認することができます。

# drbdmanage howto-join bravo
# drbdmanage join -p 6999 10.43.70.3 1 alpha 10.43.70.2 0 cOQutgNMrinBXb09A3io

25.2.1. DRBD Manageノードの種類

DRBD Manageが扱うノードは数種類あります。以下の図を見てください。

図25.1 DRBDのノードの種類

drbdmanage-venn

ノードに種類がある理由は次の通りです。現在はDRBD9/DRBD Manageクラスタは30ノード以下という制限があります。これは現在のDRBD9のレプリケーションするノード数に対する制限です。DRBD Manageはクラスタ情報の伝播にDRBDのボリュームを使用する(コントロールボリューム)ので、DRBD ManageはリソースごとにDRBD9のノード数の制限を受けます。

サテライトのコンセプトは、この制限をクラスタを以下のように分けることで緩和するものです。

  • コントロールノード: コントロールボリュームへ直接アクセスできる。
  • サテライトノード: 直接コントロールボリュームにアクセスすることはできないが、コントロールノードを通じてコントロールボリュームの内容を受け取ることができる。

1つのコントロールノードは複数のサテライトノードに応答しますが、1つのサテライトノードは1つのコントロールにのみ割り当てられます。当然サテライトノードもDRBD9のリソースを共有することができます。

コントロールノード には以下の特徴があります。

  • コントロールボリュームへ直接接続
  • 1つがリーダーの役割を担い、残りはサテライトノードの役割を担う。
  • 通常のコントロールノードであればローカルストレージを持つ
  • ピュアコントローラであればローカルストレージを持たない

サテライトノード には以下の特徴があります。

  • コントロールノードへの直接のアクセスは不可。TCP/IPを通じてクラスタ設定を受け取る。
  • 通常のサテライトノードであればローカルストレージを持つ
  • ピュアクライアントであればローカルストレージを持たない

図25.2 サテライトノードを使ったクラスタ構成

satellitecluster

外部ノード には以下の特徴があります。

  • 完全にコントロールボリュームへのコネクションがなく(コントロールノードへのコネクション用TCP/IP経路がない)、ローカルストレージがない
  • 別の経路から設定ファイルを入手する(scp など)
  • このノードの使用方法が不明な場合は使用すべきではない

25.2.2. コントロールノードの追加

# drbdmanage add-node bravo 10.43.70.3

25.2.3. ピュアコントローラーノード追加

# drbdmanage add-node --no-storage bravo 10.43.70.3

25.2.4. サテライトノードの追加

これまでCharlieノードはクラスタに追加されていなかったものとします。以下のコマンドではCharlieを、alphaをコントロールノードとするサテライトノードとして追加しています。

# drbdmanage add-node --satellite charlie 10.43.70.4

25.2.5. ピュアクライアントノードの追加

# drbdmanage add-node --satellite --no-storage charlie 10.43.70.4

25.2.6. 外部ノードの追加

# drbdmanage add-node --external delta 10.43.70.5

25.3. クラスタ設定

DRBD Manageは、ログレベルや使用するストレージプラグイン(LVM、ThinLV、ThinPoolなど)の多くの設定を行うことができます。これらの設定は drbdmanage modify-config を実行すると表示されるエディタで行います。設定は何項目かに分けられます。[GLOBAL] セクションでオプション設定を行うと、この設定はクラスタ全体で有効になります。また、ノードごとやサイトごとの設定を行うことも可能です。ノードセクションは [Node:nodename] の後に書いていきます。もしオプション設定をグローバルセクションとノードセクションの両方に行った場合には、ノードセクションの設定が使用されます。

複数のノードを束ねて サイト として取り扱えます。alpha ノードを mysite の一部にしたい場合は、alphaのノードセクションで site オプションを指定してください。

# drbdmanage modify-config
[Node:alpha]
site = mysite

drbdmanage設定の [Site:] セクションを使用して指定することも可能です。基本的に loglevel オプションのレベルは INFO に設定しますが、mysite サイトでは WARN レベルに設定して、mysite サイト内にあるalphaノードでは DEBUG に設定したいとします。その場合には、以下のように記述します。

# drbdmanage modify-config
[GLOBAL]
loglevel = INFO

[Site:mysite]
loglevel = WARN

[Node:alpha]
site = mysite
loglevel = DEBUG

drbdmanage modify-config をオプションを付けずに実行すると、グローバル、サイトごと、ノードごとの設定ができます。 modify-config は特定ノード用に実行することも可能です。このノードごとのビューでは、「ストレージプラグインの設定」で説明しているストレージプラグインの設定のような特定の設定も可能です。

25.4. ストレージプラグインの設定

ストレージプラグインは ノード ごとmodify-config サブコマンドで設定します。

ThinLV プラグインをノード bravo に使用し、pool-name オプションを mythinpool にしたい場合には次のようにします。

# drbdmanage modify-config --node bravo
[GLOBAL]
loglevel = INFO

[Node:bravo]
storage-plugin = drbdmanage.storage.lvm_thinlv.LvmThinLv

[Plugin:ThinLV]
pool-name = mythinpool

25.4.1. LVM の設定

最近のバージョンの LVMツール は、ファイルシステムのシグネチャ検出をサポートしています。ただ lvcreate の機能はディストリビューションの間で異なります。いくつかのものは --wipesignatures オプションをサポートし、また、いくつこのものは --yes オプションをサポートしています。しかし、一般的な強制フラグをサポートしているものはありません。lvcreate が既存のファイルシステムのシグネチャを検出すると、入力を促し処理を停止ししてしまいます。最近のバージョンの LVMツール を使用している場合は、 /etc/lvm/lvm.conf に ` wipe_signatures_when_zeroing_new_lvs = 0` を設定してください。Drbdmanage自体は、作成されたブロックデバイスに対して wipefs を実行します。

If you use a version of LVM where resources from snapshots are not activated, which we saw for the LvmThinPool plugin, also set auto_set_activation_skip = 0 in /etc/lvm/lvm.conf.

25.4.2. ZFS の設定

ZFSでも同じ手順です。ZFSボリュームを使用するノードに storage-plugin と同様の設定をします。ZFSはファイルシステムとしては扱われず、論理ボリュームマネージャーとして扱われるという点に注意ください。そのため下位デバイスがZFSボリュームのDRBDデバイスの上に、どのようなファイルシステムでも作成することができます。ZFSプラグインを使う場合には、すべてのDRBDリソースはZFS上に作成してあることが重要ですが、ノードがコントロールノードである場合には、コントロールボリューム用にLVMが必要です。

一般的な利用では以下の手順が必要です。

# zpool create drbdpool /dev/sdX /dev/sdY
# drbdmanage modify-config --node bravo
[Node:bravo]
storage-plugin = drbdmanage.storage.zvol2.Zvol2
[注意]注意

現在はストレージプラグインの稼働中の変更は未対応です。 ワークフローは、ノードの追加、そのノードの設定の実施、ノードの使用、という流れになります。ログレベルなどの他の設定変更は稼働中でも問題ありません。

25.4.3. ストレージプラグインについての情報

DRBD Manageは以下のストレージプラグインに対応しています。

  • Thick LVM (drbdmanage.storage.lvm.Lvm);
  • Thin LVM with a single thin pool (drbdmanage.storage.lvm_thinlv.LvmThinLv)
  • Thin LVM with thin pools for each volume (drbdmanage.storage.lvm_thinpool.LvmThinPool)
  • Thick ZFS (drbdmanage.storage.zvol2.Zvol2)
  • Thin ZFS (drbdmanage.storage.zvol2_thinlv.ZvolThinLv2)

ZFSの場合、レガシープラグイン("2"なし)も存在します。新規ユーザー、および ZFS スナップショットを使用しなかったユーザーは、新しいバージョンに切り替えるべきです。ストレージプラグインの動的変更はこの特定のケースでサポートされています。

以下は各プラグインの長所と短所をまとめたものです。

表25.1 DRBD Manageストレージプラグイン比較表

Topic lvm.Lvm lvm_thinlv.LvmThinLv lvm_thinpool.LvmThinPool

Pools

the VG is the pool

a single Thin pool

one Thin pool for each volume

Free Space reporting

Exact

Free space goes down as per written data and snapshots, needs monitoring

Each pool carves some space out of the VG, but still needs to be monitored if snapshots are used

Allocation

Fully pre-allocated

thinly allocated, needs nearly zero space initially

Snapshots

 — not supported — 

Fast, efficient (copy-on-write)

Stability

Well established, known code, very stable

Some kernel versions have bugs re Thin LVs, destroying data

Recovery

Easiest - text editor, and/or lvm configuration archives in /etc/lvm/, in the worst case dd with offset/length

All data in one pool, might incur running thin_check across everything (needs CPU, memory, time)

Independent Pools, so not all volumes damaged at the same time, faster thin_check (less CPU, memory, time)


25.5. リソース/ボリュームの作成とデプロイ

3つのクラスタノードにレプリケートする 500 GBbackups リソースを作成するとします。 はじめに、各手順ごとに正式な手順を示します。次に手順をショートカットする方法を示します。

まず、新しいリソースを作成します。

# drbdmanage add-resource backups

次に、そのリソースの中に新しいボリュームを作成します。

# drbdmanage add-volume backups 500GB

最初の段階で add-resource をしていなかった場合には、drbdmanage はリソースが存在しないことを検知して作成します。

そして、3つのクラスタノードにリソースをデプロイします。

# drbdmanage deploy-resource backups 3

この場合、drbdmanage は最も要件に合致する3ノードを選択します。デフォルトでは drbdpool 内に空きスペースがあるものから選ばれます。手動で任意のノードにリソースを割り当てる方法も次に説明します。

なお、新規リソース/ボリュームを複数ノードにデプロイする作業は頻繁にあるので、drbdmanage には次のようなショートカットがあります。

# drbdmanage add-volume backups 500GB --deploy 3

手動デプロイは、特定ノードへ assign することで行えます。backups リソースを bravocharlie ノードにデプロイする場合には以下のようにします。

# drbdmanage add-volume backups 500GB
# drbdmanage assign-resource backups bravo
# drbdmanage assign-resource backups charlie

25.6. スナップショット管理

スナップショットを取得をするリソースがデプロイされているノード全てで ThinLV プラグインを使用している事が前提になります。ストレージプラグインの設定詳細については「クラスタ設定」を参照してください。

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

前のセクションで使用した例を使用します。alphabravocharliedelta ノードがあり、最初の3つのノードに backups リソースがデプロイされています。スナップショット名が snap_backups で、 bravocharlie にスナップショットが欲しい場合は次のようにします。

# drbdmanage create-snapshot snap_backups backups bravo charlie

25.6.2. スナップショットのリストア

スナップショット名 snap_backups の内容を新規リソース res_backup_from_snap にリストアしたい場合は次のようにします。

# drbdmanage restore-snapshot res_backup_from_snap backups snap_backups

このコマンドで res_backup_from_snap という名前のリソースが作成されます。このリソースは自動的に、現在 backups リソースがデプロイされているノードにデプロイされます。

25.6.3. スナップショット削除

既存のスナップショットは次のようにして削除できます。

# drbdmanage remove-snapshot backups snap_backups

25.7. クラスタ状態の確認

Drbdmanage にはクラスタの状態を確認するための様々なコマンドがあります。これらのコマンドには接頭語 list- が付き、様々なフィルタやソートのオプションがあります。--groupby オプションは様々な出力をグループ分けしたりソートするために使用します。--show オプションでは詳細な出力をすることができます。代表的な使い方を以下に示します。

# drbdmanage list-nodes
# drbdmanage list-volumes --groupby Size
# drbdmanage list-volumes --groupby Size --groupby Minor
# drbdmanage list-volumes --groupby Size --show Port

25.8. リソースのオプション設定をする

次の drbdsetup のオプションを設定することができます。

  1. net-options
  2. peer-device-options
  3. disk-options
  4. resource-options

加えて、DRBDイベントハンドラを設定することもできます。

リソースごとに common セクションを設定するのと同じように、それらのコマンドを以下のようにして使うことができます。

max-buffersbackups リソースに設定するのは次のようになります。

# drbdmanage net-options --max-buffers 2048 --resource backups

commonセクションにオプションを設定するのは次のようになります。

# drbdmanage net-options --max-buffers 2048 --common

さらに、すべてのオプションに --unset- を付けて使用することができます。max-buffersbackups リソースから削除するには次のようにします。

# drbdmanage net-options --unset-max-buffers --resource backups

現在設定しているオプションは show-options サブコマンドで表示することができます。

サイトごとに net-options を設定することも可能です。alphabravofirst サイトに、 charliedeltasecond サイトにするとします。さらに、2つのサイト内部ではDRBDのプロトコル C を使用して、first サイトと second サイトの間ではプロトコル A を使用するとします。この場合は次のようにして設定できます。

# drbdmanage modify-config
[Node:alpha]
site = first

[Node:bravo]
site = first

[Node:charlie]
site = second

[Node:delta]
site = second
# drbdmanage net-options --protocol C --sites 'first:first'
# drbdmanage net-options --protocol C --sites 'second:second'
# drbdmanage net-options --protocol A --sites 'first:second'

--sites パラメータには from:to の構文が続きます。fromto は左右対称の構文です。first:second の設定は、同時に second:first の設定も行います。

DRBDイベントハンドラは common セクションとノードごとに設定できます。

# drbdmanage handlers --common --after-resync-target /path/to/script.sh
# drbdmanage handlers --common --unset-after-resync-target
# drbdmanage handlers --resource backups --after-resync-target /path/to/script.sh

25.9. DRBD Manageでのデータ再配置

データの再配置とは、利用可能なリソースの有効活用をするために、データの割り当てを移動することです。同様の例を<s-rebalance-workflow,manual workflow>> でも扱っています。

例えばデータを3ノードでレプリケーションするポリシーでは、構成するのに最低3台のサーバが必要です。

しかし、データ量が増えてくると、サーバ追加の必要性に迫られます。その際には、また新たに3台のサーバを購入する必要はなく、1つのノードだけを追加をしてデータを 再配置 することができます。

図25.3 DRBDデータ再配置

rebalance

まず、新しいマシンをクラスタに追加します。コマンドは「ノードの追加」 を参照してください。

次にリソースに新しいノードを追加します。

# drbdmanage assign <resource> <new-node>

(初期)同期が完了するまでしばらく待ちます。drbdadm status コマンドをリソース名をオプションにして使用すると状態を確認できます。

データがまだあるノードでは以下のようにステータス表示されます。

replication:SyncSource peer-disk:Inconsistent done:5.34

ターゲットノードでは SyncTarget の状態になります。

ターゲットのアサインが UpToDate になれば、そのノードにデータの完全な追加コピーが行われています。これで、他方のノードで既存のノードのリソース割り当てを解除できます。

# drbdmanage unassign <resource> <old-node>

さあ、これでデータの再配置が完了しました。

25.10. ヘルプ

もっとも簡単なDRBDmanageのサブコマンドの概要を知る方法はメインのman-page(man drbdmanage)を読むことです。

コマンドラインで使用できるコマンドをてっとり早く表示するには drbdmanage list とタイプします。

サブコマンド(例:list-nodes)のより詳しい情報は3つの方法で得られます。

# man drbdmanage-list-nodes
# drbdmanage list-nodes -h
# drbdmanage help list-nodes

help サブコマンドを使用するのは、特にDRBDmanageをインタラクティブモード(drbdmanage interactive)で使用している時に便利です。

DRBDmanageの最も便利な機能の1つは強力なタブ補完です。基本的にすべてのDRBDmanageが判別できる対象を補足することができます。(ノード名、IPアドレス、リソース名など) 以下に、補完の候補とその結果を示します。

# drbdmanage add-node alpha 1<tab> # completes the IP address if hostname can be resolved
# drbdmanage assign-resource b<tab> c<tab> # drbdmanage assign-resource backups charlie

そのままの状態でタブ補完ができない時には、以下のファイルを読み込んでください。

# source /etc/bash_completion.d/drbdmanage # or
# source /usr/share/bash_completion/completions/drbdmanage