20 DRBD #
分散複製ブロックデバイス(DRBD*)を使用すると、IPネットワーク内の2つの異なるサイトに位置する2つのブロックデバイスのミラーを作成できます。Corosyncと共に使用すると、DRBDは分散高可用性Linuxクラスタをサポートします。この章では、DRBDのインストールとセットアップの方法を示します。
20.1 概念の概要 #
DRBDは、プライマリデバイス上のデータをセカンダリデバイスに、データの両方のコピーが同一に保たれるような方法で複製します。これは、ネットワーク型のRAID 1と考えてください。DRBDは、データをリアルタイムでミラーリングするので、そのレプリケーションは連続的に起こります。アプリケーションは、実際そのデータがさまざまなディスクに保存されるということを知る必要はありません。
DRBDは、Linuxカーネルモジュールであり、下端のI/Oスケジューラと上端のファイルシステムの間に存在しています(図20.1「Linux内でのDRBDの位置」参照)。DRBDと通信するには、高レベルのコマンドdrbdadm
を使用します。柔軟性を最大にするため、DRBDには、低レベルのツールdrbdsetup
が付いてきます。
ミラー間のデータトラフィックは暗号化されません。データ交換を安全にするには、接続に仮想プライベートネットワーク(VPN)ソリューションを導入する必要があります。
DRBDでは、Linuxでサポートされる任意のブロックデバイスを使用できます。通常は次のデバイスです。
パーティションまたは完全なハードディスク
ソフトウェアRAID
LVM (Logical Volume Manager)
EVMS (Enterprise Volume Management System)
DRBDは、デフォルトでは、DRBDノード間の通信にTCPポート7788
以上を使用します。使用しているポートの通信がファイアウォールで許可されていることを確認してください。
まず、DRBDデバイスを設定してから、その上にファイルシステムを作成する必要があります。ユーザデータに関することはすべて、rawデバイスではなく、/dev/drbdN
デバイスを介してのみ実行される必要があります。これは、DRBDが、メタデータ用にrawデバイスの最後の部分を使用するからです。rawデバイスを使用すると、データが矛盾する原因となります。
udevの統合により、/dev/drbd/by-res/RESOURCES
の形式でシンボリックリンクも取得されます。このリンクは、より簡単に使用でき、デバイスのマイナー番号を誤って記憶しないように安全対策が講じられています。
たとえば、rawデバイスのサイズが1024MBの場合、DRBDデバイスは、1023MBしかデータ用に使用できません。70KBは隠され、メタデータ用に予約されています。rawディスクを介した既存のキロバイトへのアクセスは、それがユーザデータ用でないので、すべて失敗します。
20.2 DRBDサービスのインストール #
パートI「インストール、セットアップ、およびアップグレード」で説明されているように、High Availability Extensionをネットワーククラスタの両方のSUSE Linux Enterprise Serverマシンにインストールします。High Availability Extensionをインストールすると、DRBDプログラムファイルもインストールされます。
クラスタスタック全体を必要とせず、のみを使用したい場合、パッケージ drbd、 drbd-kmp-FLAVOR、 drbd-utils、および yast2-drbdをインストールしてください。
drbdadm
の操作を簡素化するには、Bash補完サポートを使用します。現在のシェルセッションでこのサポートを有効にするには、次のコマンドを挿入します。
root #
source
/etc/bash_completion.d/drbdadm.sh
root
用に永続的に使用するには、ファイル/root/.bashrc
を拡張し、前の行を挿入します。
20.3 DRBDサービスの設定 #
次の手順では、サーバ名としてaliceとbobを使用し、クラスタリソース名としてr0
を使用します。aliceをプライマリノードとして設定し、/dev/sda1
をストレージとして設定します。必ず、手順を変更して、ご使用のノード名とファイルの名前を使用してください。
次の項では、aliceとbobという2つのノードがあり、それぞれがTCPポート7788
を使用するものと想定しています。ファイアウォールでこのポートが開いているようにしてください。
システムを準備します。
Linuxノード内のブロックデバイスを準備し、(必要な場合は)パーティション分割しておいてください。
ディスクに、必要のなくなったファイルシステムがすでに含まれている場合は、次のコマンドでファイルシステムの構造を破壊します。
root #
dd
if=/dev/zero of=YOUR_DEVICE count=16 bs=1M破壊する、より多くのファイルシステムがある場合は、DRBDセットアップに含むすべてのデバイス上でこのステップを繰り返します。
クラスタがすでにDRBDを使用している場合は、クラスタを保守モードにします。
root #
crm
configure property maintenance-mode=trueクラスタがすでにDRBDを使用している場合に、この手順をスキップすると、ライブ設定の構文エラーによってサービスがシャットダウンされます。
別の方法として、
drbdadm
-c FILE
を使用して設定ファイルをテストすることもできます。
次のいずれかの方法を選択してDRBDを設定します。
Csync2 (デフォルト)を設定している場合、DRBD設定ファイルは、同期に必要なファイルのリストにすでに含まれています。同期するには、次のコマンドを使用します。
root #
csync2
-xv /etc/drbd.d/Csync2を設定していない場合(または使用しない場合)には、DRBD設定ファイルを手動で他のノードにコピーしてください。
root #
scp
/etc/drbd.conf bob:/etc/root #
scp
/etc/drbd.d/* bob:/etc/drbd.d/初期同期を実行します(20.3.3項 「DRBDリソースの初期化とフォーマット」を参照してください)。
クラスタの保守モードフラグをリセットします。
root #
crm
configure property maintenance-mode=false
20.3.1 手動によるDRBDの設定 #
DRBD9機能の「自動プロモート」は、マスタ/スレーブ接続の代わりにクローンとファイルシステムリソースを使用できます。ファイルシステムがマウントされているときにこの機能を使用すると、DRBDは自動的にプライマリモードに変わります。
自動プロモート機能は現在サポートが限定されています。DRBD 9では、SUSEはDRBD-8でもサポートされていた使用例と同じ使用例をサポートしています。3つ以上のノードでのセットアップなど、それを超える使用例はサポートされていません。
DRBDを手動で設定するには、次の手順に従います。
DRBDバージョン8.3以降、設定ファイルは、複数のファイルに分割され、/etc/drbd.d/
ディレクトリに保存されています。
/etc/drbd.d/global_common.conf
ファイルを開きます。このファイルには、すでにいくつかのグローバルな事前定義値が含まれています。startup
セクションに移動し、次の3行を挿入します。startup { # wfc-timeout degr-wfc-timeout outdated-wfc-timeout # wait-after-sb; wfc-timeout 100; degr-wfc-timeout 120; }
これらのオプションは、ブート時のタイムアウトを減らすために使用します。詳細については、https://docs.linbit.com/docs/users-guide-9.0/#ch-configureを参照してください。
ファイル
/etc/drbd.d/r0.res
を作成し、状況に合わせて行を変更し、ファイルを保存します。resource r0 { 1 device /dev/drbd0; 2 disk /dev/sda1; 3 meta-disk internal; 4 on alice { 5 address 192.168.1.10:7788; 6 node-id 0; 7 } on bob { 5 address 192.168.1.11:7788; 6 node-id 1; 7 } disk { resync-rate 10M; 8 } connection-mesh { 9 hosts alice bob; } }
必要なサービスへのいくつかの関連付けを許可するDRBDリソースの名前。たとえば、
nfs
、http
、mysql_0
、postgres_wal
など。ここでは、一般的な名前r0
が使用されています。DRBD用デバイス名とそのマイナー番号。
先に示した例では、マイナー番号0がDRBDに対して使用されています。udev統合スクリプトは、シンボリックリンク(
/dev/drbd/by-res/nfs/0
)を提供します。または、設定のデバイスノード名を省略し、代わりに次のラインを使用します。drbd0 minor 0
(/dev/
は必要に応じて指定します)または/dev/drbd0
ノード間で複製されるrawデバイス。ただし、この例では、デバイスは両方のノードで「同じ」です。異なるデバイスが必要な場合は、
disk
パラメータをon
ホストに移動します。meta-diskパラメータには、通常、値
internal
が含まれますが、メタデータを保持する明示的なデバイスを指定することもできです。詳細については、https://docs.linbit.com/docs/users-guide-9.0/#s-metadataを参照してください。on
セクションでは、この設定文が適用されるホストを記述します。それぞれのノードのIPアドレスとポート番号。リソースごとに、通常、
7788
から始まる別個のポートが必要です。1つのDRBDリソースに対して両方のポートが同じである必要があります。複数のノードを設定する際は、ノードIDが必要です。ノードIDは、別々のノードを区別するための固有の負でない整数です。
同期レート。このレートは、ディスク帯域幅およびネットワーク帯域幅の3分の1に設定します。これは、再同期を制限するだけで、レプリケーションは制限しません。
同一メッシュのすべてのノードを設定します。
hosts
パラメータには、同じDRBDセットアップを共有するすべてのホスト名が含まれます。環境設定ファイルの構文をチェックします。次のコマンドがエラーを返す場合は、ファイルを検証します。
root #
drbdadm
dump all
20.3.2 YaSTによるDRBDの設定 #
YaSTを使用して、DRBDの初期セットアップを開始できます。DRBDセットアップの作成後、生成されたファイルを手動で調整できます。
ただし、設定ファイルを変更した後にYaST DRBDモジュールを使用しないでください。DRBDモジュールでサポートされているのは、限られた一連の基本設定のみです。再度DRBDモジュールを使用すると、変更内容がモジュールに表示されない可能性があります。
YaSTを使ってDRBDを設定するには、次の手順に従います。
YaSTを起動して、設定モジュール
› を選択します。すでにDRBDを設定していた場合、YaSTはそのことを警告します。YaSTは設定を変更し、古いDRBD設定ファイルを*.YaSTsave
として保存します。off
)。Pacemakerがこのサービスを管理するので変更しないでください。ファイアウォールが実行中の場合は、
を有効にします。図20.2「リソースの環境設定」を参照してください)。
エントリに移動します。 をクリックして、新しいリソースを作成します(see図 20.2: リソースの環境設定 #次のパラメータを設定する必要があります。
DRBDリソースの名前(必須)。
関連するノードのホスト名。
それぞれのノードのIPアドレスとポート番号(デフォルトは
7788
)複製されたデータにアクセスするためのブロックデバイスパス。デバイスにマイナー番号が使用されている場合は、関連付けられたブロックデバイスの名前は
/dev/drbdX
になることが普通です。Xはデバイスのマイナー番号です。デバイスにマイナー番号が使用されていない場合は、必ずデバイス名の後にminor 0
を追記します。両方のノード間で複製されるrawデバイス。LVMを使用する場合、LVMデバイス名を挿入します。
internal
に設定されるか、またはインデックスで拡張された、drbdで必要なメタデータを保持する明示的なデバイスを指定します。複数のDRBDリソースに実際のデバイスを使用することもできます。たとえば、最初のリソースに対して
が/dev/sda6[0]
の場合、/dev/sda6[1]
を2番目のリソースに使用できます。ただし、このディスク上で各リソースについて少なくとも128MBのスペースが必要です。メタデータの固定サイズによって、複製できる最大データサイズが制限されます。
これらのオプションはすべて、
/usr/share/doc/packages/drbd/drbd.conf
ファイルの例とdrbd.conf(5)
のマニュアルページで説明されています。をクリックします。
をクリックして、2番目のDRBDリソースを入力し、 をクリックして終了します。
と をクリックして、[リソース設定]を閉じます。
DRBDでLVMを使用する場合、LVM設定ファイルでオプションをいくつか変更する必要があります(
エントリを参照してください)。この変更は、YaST DRBDモジュールを使用して自動的に実行できます。DRBDリソースのローカルホストのディスク名およびデフォルトのフィルタはLVMフィルタで拒否されます。LVMデバイスをスキャンできるのは
/dev/drbd
のみです。たとえば、
/dev/sda1
をDRBDディスクとして使用している場合、そのデバイス名がLVMフィルタの最初のエントリとして挿入されます。フィルタを手動で変更するには、 チェックボックスをクリックします。をクリックして、変更を保存します。
20.3.3 DRBDリソースの初期化とフォーマット #
システムを準備してDRBDを設定したら、ディスクの初回の初期化を行います。
両ノード(aliceとbob)でメタデータストレージを初期化します。
root #
drbdadm
create-md r0root #
drbdadm
up r0DRBDリソースの初期再同期を短縮する場合は、次のことを確認します。
すべてのノード上のDRBDデバイスが同じデータを持つ場合(たとえば、20.3項 「DRBDサービスの設定」に示すように
dd
コマンドでファイルシステム構造を破壊することによる)、次のコマンドを使用して初期再同期をスキップします(両ノード)。root #
drbdadm
new-current-uuid --clear-bitmap r0/0状態は
Secondary/Secondary UpToDate/UpToDate
ですその後、次のステップに進みます。
プライマリノードのaliceから再同期プロセスを開始します。
root #
drbdadm
primary --force r0以下を使用してステータスをチェックします。
root #
drbdadm
status r0 r0 role:Primary disk:UpToDate bob role:Secondary peer-disk:UpToDateDRBDデバイスの上にファイルシステムを作成します。たとえば、次のように指定します。
root #
mkfs.ext3
/dev/drbd0ファイルシステムをマウントして使用します。
root #
mount
/dev/drbd0 /mnt/
20.4 DRBD 8から DRBD 9への移行 #
DRBD 8 (SUSE Linux Enterprise High Availability Extension 12 SP1に付属)とDRBD 9 (SUSE Linux Enterprise High Availability Extension 12 SP2に付属)間で、メタデータフォーマットが変更されました。DRBD 9では、以前のメタデータファイルが新しいフォーマットに自動的に変換されません。
12 SP2に移行した後で、DRBDを開始する前に、DRBDメタデータをバージョン9フォーマットに手動で変換します。これを実行するには、drbdadm
create-md
を使用します。設定を変更する必要はありません。
DRBD 9では、SUSEはDRBD-8でもサポートされていた使用例と同じ使用例をサポートしています。3つ以上のノードでのセットアップなど、それを超える使用例はサポートされていません。
DRBD 9は、バージョン8と互換性を持つように切り替わります。3つ以上のノードの場合、DRBDバージョン9固有のオプションを使用するため、メタデータを再作成する必要があります。
スタックされたDRBDリソースがある場合は、詳細について20.5項 「スタックされたDRBDデバイスの作成」も参照してください。
新しいリソースを再作成せずにデータを保持し、新しいノードを追加することを許可する場合は、次の操作を実行します。
1つのノードをスタンバイモードで設定します。
ノードのすべてでDRBDパッケージのすべてを更新します。20.2項 「DRBDサービスのインストール」を参照してください。
リソース設定に新しいノード情報を追加します。
すべての
on
セクションごとにnode-id。connection-mesh セクションには、ホストパラメータのすべてのホスト名が含まれます。 hosts パラメータで制御します。
手順20.1「DRBDの手動設定」のサンプル設定を参照してください。
internal
をmeta-disk
キーとして使用する場合は、DRBDディスクのスペースを拡大します。LVMのようなスペースの拡大をサポートするデバイスを使用します。別の方法として、メタデータ用の外部ディスクに変更して、meta-disk DEVICE;
を使用します。新しい設定に基づいてメタデータを再作成します。
root #
drbdadm
create-md RESOURCEスタンバイモードをキャンセルします。
20.5 スタックされたDRBDデバイスの作成 #
スタックされたDRBDデバイスには少なくとも一方のデバイスがDRBDリソースでもある2つの他のデバイスが含まれます。すなわち、DRBDは既存のDRBDリソースの最上部に追加のノードを追加します(図20.3「リソースのスタッキング」を参照してください)。このようなレプリケーションセットアップは、バックアップおよび障害復旧目的に使用できます。
Three-wayレプリケーションは、非同期(DRBDプロトコルA)と同期レプリケーション(DRBDプロトコルC)を使用します。非同期部分はスタックされたリソースに使用され、同期部分はバックアップに使用されます。
ご使用の運用環境ではスタックされたデバイスを使用します。たとえば、最上部にDRBDデバイス/dev/drbd0
とスタックされたデバイス/dev/drbd10
がある場合、ファイルシステムは/dev/drbd10
上に作成されます。詳細については、例20.1「3ノードのスタックされたDRBDリソースの設定」を参照してください。
# /etc/drbd.d/r0.res resource r0 { protocol C; device /dev/drbd0; disk /dev/sda1; meta-disk internal; on amsterdam-alice { address 192.168.1.1:7900; } on amsterdam-bob { address 192.168.1.2:7900; } } resource r0-U { protocol A; device /dev/drbd10; stacked-on-top-of r0 { address 192.168.2.1:7910; } on berlin-charlie { disk /dev/sda10; address 192.168.2.2:7910; # Public IP of the backup node meta-disk internal; } }
20.6 リソースレベルのフェンシングの使用 #
DRBDレプリケーションリンクが途切れた場合、PacemakerはDRBDリソースを別のノードにプロモートしようとします。Pacemakerが古いデータでサービスを開始しないようにするため、例20.2「クラスタ情報ベース(CIB)を使用したリソースレベルのフェンシングを含むDRBDの設定」に示すようにDRBD設定ファイルでリソースレベルのフェンシングを有効にします。
resource RESOURCE { net { fencing resource-only; # ... } handlers { fence-peer "/usr/lib/drbd/crm-fence-peer.9.sh"; after-resync-target "/usr/lib/drbd/crm-unfence-peer.9.sh"; # ... } ... }
DRBDレプリケーションリンクが切断されると、DRBDは以下を実行します。
DRBDは
crm-fence-peer.9.sh
スクリプトを呼び出します。スクリプトはクラスタマネージャに連絡します。
スクリプトはこのDRBDリソースに関連付けられたPacemakerリソースを判断します。
スクリプトは、このDRBDリソースが他のノードにプロモートされないことを確認します。リソースは現在アクティブなノード上にとどまります。
レプリケーションリンクがもう一度接続され、DRBDがその同期プロセスを完了すると、制限が解除されます。クラスタマネージャは自由にリソースをプロモートできるようになります。
20.7 DRBDサービスのテスト #
インストールと設定のプロシージャが予期どおりの結果となった場合は、DRBD機能の基本的なテストを実行できます。このテストは、DRDBソフトウェアの機能を理解する上でも役立ちます。
alice上でDRBDサービスをテストします。
端末コンソールを開き、
root
としてログインします。aliceにマウントポイント(
/srv/r0
など)を作成します。root #
mkdir
-p /srv/r0drbd
デバイスをマウントします。root #
mount
-o rw /dev/drbd0 /srv/r0プライマリノードからファイルを作成します。
root #
touch
/srv/r0/from_alicealiceでディスクをマウント解除します。
root #
umount
/srv/r0aliceで次のコマンドを入力して、aliceのDRBDサービスを降格します。
root #
drbdadm
secondary r0
bob上でDRBDサービスをテストします。
端末コンソールを開き、bobで
root
としてログインします。bobで、DRBDサービスをプライマリに昇格します。
root #
drbdadm
primary r0bobで、bobがプライマリかどうかチェックします。
root #
drbdadm
status r0bobで、
/srv/r0
などのマウントポイントを作成します。root #
mkdir
/srv/r0bobで、DRBDデバイスをマウントします。
root #
mount
-o rw /dev/drbd0 /srv/r0aliceで作成したファイルが存在していることを確認します。
root #
ls
/srv/r0/from_alice/srv/r0/from_alice
ファイルが一覧に表示されている必要があります。
サービスが両方のノードで稼動していれば、DRBDの設定は完了です。
再度、aliceをプライマリとして設定します。
bobで次のコマンドを入力して、bobのディスクをマウント解除します。
root #
umount
/srv/r0bobで次のコマンドを入力して、bobのDRBDサービスを降格します。
root #
drbdadm
secondary r0aliceで、DRBDサービスをプライマリに昇格します。
root #
drbdadm
primary r0aliceで、aliceがプライマリかどうかチェックします。
root #
drbdadm
status r0
サービスを自動的に起動させ、サーバに問題が発生した場合はフェールオーバーさせるためには、Pacemaker/CorosyncでDRBDを高可用性サービスとして設定できます。SUSE Linux Enterprise 15 SP2のインストールと設定については、パートII「設定および管理」を参照してください。
20.8 DRBDデバイスの監視 #
DRBDには、リアルタイム監視用のdrbdmon
ユーティリティが付属しています。このユーティリティにより、設定されているすべてのリソースの状態と、それらのリソースで発生している問題が示されます。
drbdmon
が示す正常な接続 #問題がある場合、drbdadm
に次のエラーメッセージが表示されます。
drbdmon
が示す異常な接続 #20.9 DRBDのチューニング #
DRBDをチューニングするには、いくつかの方法があります。
メタデータ用には外部ディスクを使用します。これは便利ですが、保守作業は煩雑になります。
sysctl
を介して受信および送信バッファ設定を変更することで、ネットワーク接続を調整します。DRBD設定で
max-buffers
、max-epoch-size
、またはその両方を変更します。IOパターンに応じて、
al-extents
の値を増やします。ハードウェアRAIDコントローラとBBU (「バッテリバックアップユニット」)を併用する場合、
no-disk-flushes
、no-disk-barrier
、およびno-md-flushes
の設定が有効な場合があります。ワークロードに従って読み込みバランスを有効にします。詳細については、https://www.linbit.com/en/read-balancing/を参照してください。
20.10 DRBDのトラブルシュート #
DRBDセットアップには、多数のコンポーネントが使用され、別のソースから問題が発生することがあります。以降のセクションでは、一般的なシナリオをいくつか示し、さまざまなソリューションを推奨します。
20.10.1 環境設定 #
初期のDRBDセットアップが予期どおりに機能しない場合は、おそらく、環境設定に問題があります。
環境設定の情報を取得するには:
端末コンソールを開き、
root
としてログインします。drbdadm
に-d
オプションを指定して、環境設定ファイルをテストします。入力次のコマンドを入力します。root #
drbdadm
-d adjust r0adjust
オプションのドライ実行では、drbdadm
は、DRBDリソースの実際の設定を使用中のDRBD環境設定ファイルと比較しますが、コールは実行しません。出力をレビューして、エラーのソースおよび原因を確認してください。/etc/drbd.d/*
ファイルとdrbd.conf
ファイルにエラーがある場合は、そのエラーを修正してから続行してください。パーティションと設定が正しい場合は、
drbdadm
を-d
オプションなしで、再度実行します。root #
drbdadm
adjust r0このコマンドは、環境設定ファイルをDRBDリソースに適用します。
20.10.2 ホスト名 #
DRBDの場合、ホスト名の大文字と小文字が区別され(Node0
はnode0
とは異なるホストであるとみなされる)、カーネルに格納されているホスト名と比較されます(uname -n
出力を参照)。
複数のネットワークデバイスがあり、専用ネットワークデバイスを使用したい場合、おそらく、ホスト名は使用されたIPアドレスに解決されません。この場合は、パラメータdisable-ip-verification
を使用します。
20.10.3 TCPポート7788 #
システムがピアに接続できない場合は、ローカルファイアウォールに問題のある可能性があります。DRBDは、デフォルトでは、TCPポート7788
を使用して、もう一方のノード にアクセスします。このポートを両方のノード からアクセスできるかどうか確認してください。
20.10.4 DRBDデバイスが再起動後に破損した #
DRBDサブシステムが実際のどのデバイスが最新データを保持しているか認識していない場合、スプリットブレイン受験に変更されます。この場合、それぞれのDRBDサブシステムがセカンダリとして起動され、互いに接続しません。この場合、ログ記録データに、次のメッセージが出力されることがあります。
Split-Brain detected, dropping connection!
この状況を解決するには、廃棄するデータを持つノードで、次のコマンドを入力します。
root #
drbdadm
secondary r0
状態がWFconnection
の場合、最初に切断します。
root #
drbdadm
disconnect r0
最新のデータを持つノードで、次のコマンドを入力します。
root #
drbdadm
connect --discard-my-data r0
このコマンドは、あるノードのデータをピアのデータで上書きすることによって問題を解決するため、両方のノードで一貫したビューが得られます。
20.11 詳細情報 #
DRBDについては、次のオープンソースリソースを利用できます。
プロジェクトホームページhttp://www.drbd.org。
詳細については、Highly Available NFS Storage with DRBD and Pacemakerを参照してください。
http://clusterlabs.org/wiki/DRBD_HowTo_1.0(Linux Pacemaker Cluster Stack Projectによる)。
このディストリビューションで利用できるDRBDのマニュアルページは、
drbd(8)
、rbdmeta(8)
、drbdsetup(8)
、drbdadm(8)
、drbd.conf(5)
です。コメント付きのDRBD設定例が、
/usr/share/doc/packages/drbd-utils/drbd.conf.example
にあります。さらに、クラスタ間のストレージ管理を容易にするために、「DRBD-Manager」(https://www.linbit.com/en/drbd-manager/)に関する最新の通知を参照してください。