27 DRBD #
分散複製ブロックデバイス(DRBD*)を使用すると、IPネットワーク内の2つの異なるサイトに位置する2つのブロックデバイスのミラーを作成できます。Corosyncとともに使用すると、DRBDは分散高可用性Linuxクラスタをサポートします。この章では、DRBDのインストールとセットアップの方法を示します。
27.1 概念の概要 #
DRBDは、プライマリデバイス上のデータをセカンダリデバイスに、データの両方のコピーが同一に保たれるような方法で複製します。これは、ネットワーク型のRAID 1と考えてください。DRBDは、データをリアルタイムでミラーリングするので、そのレプリケーションは連続的に起こります。アプリケーションは、実際そのデータがさまざまなディスクに保存されるということを知る必要はありません。
DRBDは、Linuxカーネルモジュールであり、下端のI/Oスケジューラと上端のファイルシステムの間に存在しています(図27.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ディスクを介した既存のキロバイトへのアクセスは、それがユーザデータ用でないので、すべて失敗します。
27.2 DRBDサービスのインストール #
パートI「インストールおよびセットアップ」で説明されているように、High Availabilityパターンをネットワーククラスタの両方のSUSE Linux Enterprise Serverマシンにインストールします。このパターンをインストールすると、DRBDプログラムファイルもインストールされます。
クラスタスタック全体を必要とせず、DRBDのみを使用したい場合、パッケージdrbd、drbd-kmp-FLAVOR、drbd-utils、およびyast2-drbdをインストールしてください。
27.3 DRBDサービスの設定 #
次の手順では、サーバ名としてaliceとbobを使用し、DRBDリソース名としてr0を使用します。aliceをプライマリノードとして設定し、/dev/disk/by-id/example-disk1をストレージとして設定します。必ず、手順を変更して、ご使用のノード名とファイルの名前を使用してください。
以下の手順は、クラスタノードがTCPポート7788を使用することを前提としています。ファイアウォールでこのポートが開いているようにしてください。
DRBDを設定するには、次の手順を実行します。
次の方法のいずれかを使用してDRBDを設定します。
27.3.1 DRBDを使用するためのシステムの準備 #
DRBDの設定を開始する前に、以下の手順の一部またはすべてを実行する必要がある場合があります。
Linuxノード内のブロックデバイスを準備し、(必要な場合は)パーティション分割しておいてください。
ディスクに、必要のなくなったファイルシステムがすでに含まれている場合は、次のコマンドでファイルシステムの構造を破壊します。
#dd if=/dev/zero of=YOUR_DEVICE count=16 bs=1M破壊する、より多くのファイルシステムがある場合は、DRBDセットアップに含むすべてのデバイス上でこのステップを繰り返します。
クラスタがすでにDRBDを使用している場合は、クラスタを保守モードにします。
#crm maintenance onクラスタがすでにDRBDを使用している場合に、この手順をスキップすると、ライブ設定の構文エラーによってサービスがシャットダウンされます。別の方法として、
drbdadm -c FILEを使用して設定ファイルをテストすることもできます。
27.3.2 手動によるDRBDの設定 #
DRBD9「自動プロモート」機能は、デバイスの1つがマウントされているか、書き込み用に開かれている場合に、リソースを自動的にプライマリロールにプロモートできます。
自動プロモート機能は現在サポートが限定されています。DRBD 9では、SUSEはDRBD-8でもサポートされていた使用例と同じ使用例をサポートしています。3つ以上のノードでのセットアップなど、それを超える使用例はサポートされていません。
DRBDを手動で設定するには、次の手順に従います。
DRBDバージョン8.3以降、これまで使用されてきた設定ファイルは、複数のファイルに分割され、/etc/drbd.d/ディレクトリに保存されています。
ファイル
/etc/drbd.d/global_common.confを開きます。すでにグローバルな事前定義された値が含まれています。startupセクションに移動し、次の行を挿入します。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/disk/by-id/example-disk1; 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; } net { protocol C; 10 fencing resource-and-stonith; 11 } handlers { 12 fence-peer "/usr/lib/drbd/crm-fence-peer.9.sh"; after-resync-target "/usr/lib/drbd/crm-unfence-peer.9.sh"; } }関連サービスを示す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セットアップを共有するすべてのホスト名が含まれます。この接続に使用するプロトコル。プロトコル
Cはデフォルトのオプションです。データの可用性を高め、書き込みがすべてのローカルディスクとリモートディスクに到達するまで書き込みが完了したと見なしません。DRBDレベルでフェンシングポリシー
resource-and-stonithを指定します 。このポリシーは、STONITHが完了するまで、アクティブなI/O操作を直ちに一時停止します。Pacemakerが古いデータでサービスを開始しないようにするため、リソースレベルのフェンシングを有効にします。DRBDレプリケーションリンクが切断された場合、
crm-fence-peer.9.shスクリプトは、レプリケーションリンクが再び接続され、DRBDが同期処理を完了するまで、別のノードへのDRBDリソースの昇格を停止します。環境設定ファイルの構文をチェックします。次のコマンドがエラーを返す場合は、ファイルを検証します。
#drbdadm dump allDRBD環境設定ファイルをすべてのノードにコピーします。
#csync2 -xvデフォルトでは、DRBD環境設定ファイル
/etc/drbd.confとディレクトリ/etc/drbd.d/は、Csync2が同期するファイルのリストにすでに含まれています。
27.3.3 YaSTによるDRBDの設定 #
YaSTを使用して、DRBDの初期セットアップを開始できます。DRBDセットアップの作成後、生成されたファイルを手動で調整できます。
ただし、設定ファイルを変更した後にYaST DRBDモジュールを使用しないでください。DRBDモジュールでサポートされているのは、限られた一連の基本設定のみです。これを再使用すると、モジュールに変更が表示されない場合があります。
YaSTを使ってDRBDを設定するには、次の手順に従います。
YaSTを起動して、設定モジュール › を選択します。すでにDRBDを設定していた場合、YaSTはそのことを警告します。YaSTは、設定を変更し、元のDRBD設定ファイルを
*.YaSTsaveとして保存します。› のブートフラグは、そのままにしてください(デフォルトでは
off)。Pacemakerがこのサービスを管理するので変更しないでください。ファイアウォールが実行中の場合は、を有効にします。
エントリに移動します。を選択して、新しいリソースを作成します(図27.2「リソースの環境設定」を参照してください)。
図 27.2: リソースの環境設定 #次のパラメータを設定する必要があります。
DRBDリソースの名前(必須)。
関連するノードのホスト名。
それぞれのノードのIPアドレスとポート番号(デフォルトは
7788)。複製されたデータにアクセスするためのブロックデバイスパス。デバイスにマイナー番号が使用されている場合は、関連付けられたブロックデバイスの名前は
/dev/drbdXになることが普通です。Xはデバイスのマイナー番号です。デバイスにマイナー番号が使用されていない場合は、必ずデバイス名の後にminor 0を追記します。両方のノード間で複製されるrawデバイス。LVMを使用する場合、LVMデバイス名を挿入します。
は、値
internalに設定されるか、またはインデックスで拡張された、DRBDで必要なメタデータを保持する明示的なデバイスを指定します。複数のDRBDリソースに実際のデバイスを使用することもできます。たとえば、最初のリソースに対してが
/dev/disk/by-id/example-disk6[0]の場合、/dev/disk/by-id/example-disk6[1]を2番目のリソースに使用できます。ただし、このディスク上で各リソースについて少なくとも128 MBのスペースが必要です。メタデータの固定サイズによって、複製できる最大データサイズが制限されます。
これらのオプションはすべて、ファイル
/usr/share/doc/packages/drbd/drbd.confおよびdrbd.conf(5)のマニュアルページで説明されています。をクリックします。
をクリックして、2番目のDRBDリソースを入力し、をクリックして終了します。
とをクリックして、[リソース設定]を閉じます。
DRBDでLVMを使用する場合、LVM設定ファイルで特定のオプションを変更する必要があります(エントリを参照してください)。この変更は、YaST DRBDモジュールを使用して自動的に実行できます。
DRBDリソースのローカルホストのディスク名およびデフォルトのフィルタはLVMフィルタで拒否されます。LVMデバイスをスキャンできるのは
/dev/drbdのみです。たとえば、
/dev/disk/by-id/example-disk1をDRBDディスクとして使用している場合、そのデバイス名がLVMフィルタの最初のエントリとして挿入されます。フィルタを手動で変更するには、チェックボックスをクリックします。をクリックして、変更を保存します。
DRBD環境設定ファイルをすべてのノードにコピーします。
#csync2 -xvデフォルトでは、DRBD環境設定ファイル
/etc/drbd.confとディレクトリ/etc/drbd.d/は、Csync2が同期するファイルのリストにすでに含まれています。
27.3.4 DRBDリソースの初期化とフォーマット #
システムを準備してDRBDを設定したら、ディスクの初回の初期化を行います。
両ノード(aliceとbob)でメタデータストレージを初期化します。
#drbdadm create-md r0#drbdadm up r0DRBDリソースの初期再同期を短縮する場合は、次のことを確認します。
すべてのノード上のDRBDデバイスが同じデータを持つ場合(たとえば、
ddに示すように27.3項 「DRBDサービスの設定」コマンドでファイルシステム構造を破壊することによる)、次のコマンドを使用して初期再同期をスキップします(両ノード)。#drbdadm new-current-uuid --clear-bitmap r0/0状態は
Secondary/Secondary UpToDate/UpToDateのはずです。その後、次のステップに進みます。
プライマリノードのaliceから再同期プロセスを開始します。
#drbdadm primary --force r0以下を使用してステータスをチェックします。
#drbdadm status r0r0 role:Primary disk:UpToDate bob role:Secondary peer-disk:UpToDateDRBDデバイスの上にファイルシステムを作成します。たとえば、次のように指定します。
#mkfs.ext3 /dev/drbd0ファイルシステムをマウントして使用します。
#mount /dev/drbd0 /mnt/
27.3.5 DRBDのクラスタリソースを作成する #
DRBDデバイスを初期化した後、クラスタリソースを作成して、DRBDデバイスおよびプロモータブルクローンを管理し、このリソースを両ノード上で実行できるようにします。
crmインタラクティブシェルを起動します。#crm configureDRBDリソース
r0のプリミティブを作成します。crm(live)configure#primitive drbd-r0 ocf:linbit:drbd \ params drbd_resource="r0" \ op monitor interval=15 role=Promoted \ op monitor interval=30 role=Unpromoteddrbd-r0プリミティブのプロモータブルクローンを作成します。crm(live)configure#clone cl-drbd-r0 drbd-r0 \ meta promotable="true" promoted-max="1" promoted-node-max="1" \ clone-max="2" clone-node-max="1" notify="true" interleave=trueこの設定をコミットします。
crm(live)configure#commit対話型シェルを終了します。
crm(live)configure#quit
DRBDを設定する前にクラスタを保守モードにした場合は、crm maintenance offを使用して通常の操作に戻すことができます。
27.4 スタックされたDRBDデバイスの作成 #
スタックされたDRBDデバイスには少なくとも一方のデバイスがDRBDリソースでもある2つの他のデバイスが含まれます。すなわち、DRBDは既存のDRBDリソースの最上部にノードを追加します(図27.3「リソースのスタッキング」を参照してください)。このようなレプリケーションセットアップは、バックアップおよび障害復旧目的に使用できます。
Three-wayレプリケーションは、非同期(DRBDプロトコルA)と同期レプリケーション(DRBDプロトコルC)を使用します。非同期部分はスタックされたリソースに使用され、同期部分はバックアップに使用されます。
ご使用の運用環境ではスタックされたデバイスを使用します。たとえば、DRBDデバイス/dev/drbd0があり、その上にスタックされたデバイス/dev/drbd10がある場合、ファイルシステムは/dev/drbd10に作成されます。詳しくは例27.1「3ノードのスタックされたDRBDリソースの設定」を参照してください。
# /etc/drbd.d/r0.res
resource r0 {
protocol C;
device /dev/drbd0;
disk /dev/disk/by-id/example-disk1;
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/disk/by-id/example-disk10;
address 192.168.2.2:7910; # Public IP of the backup node
meta-disk internal;
}
}27.5 DRBDサービスのテスト #
インストールと設定のプロシージャが予期どおりの結果となった場合は、DRBD機能の基本的なテストを実行できます。このテストは、DRDBソフトウェアの機能を理解する上でも役立ちます。
alice上でDRBDサービスをテストします。
端末コンソールを開き、
rootとしてログインします。aliceにマウントポイント(
/srv/r0など)を作成します。#mkdir -p /srv/r0drbdデバイスをマウントします。#mount -o rw /dev/drbd0 /srv/r0プライマリノードからファイルを作成します。
#touch /srv/r0/from_alicealiceでディスクをマウント解除します。
#umount /srv/r0aliceで次のコマンドを入力して、aliceのDRBDサービスを降格します。
#drbdadm secondary r0
bob上でDRBDサービスをテストします。
端末コンソールを開き、bobで
rootとしてログインします。bobで、DRBDサービスをプライマリに昇格します。
#drbdadm primary r0bobで、bobがプライマリかどうかチェックします。
#drbdadm status r0bobで、
/srv/r0などのマウントポイントを作成します。#mkdir /srv/r0bobで、DRBDデバイスをマウントします。
#mount -o rw /dev/drbd0 /srv/r0aliceで作成したファイルが存在していることを確認します。
#ls /srv/r0/from_alice/srv/r0/from_aliceファイルが一覧に表示されている必要があります。
サービスが両方のノードで稼働していれば、DRBDの設定は完了です。
再度、aliceをプライマリとして設定します。
bobで次のコマンドを入力して、bobのディスクをマウント解除します。
#umount /srv/r0bobで次のコマンドを入力して、bobのDRBDサービスを降格します。
#drbdadm secondary r0aliceで、DRBDサービスをプライマリに昇格します。
#drbdadm primary r0aliceで、aliceがプライマリかどうかチェックします。
#drbdadm status r0
サービスを自動的に起動させ、サーバに問題が発生した場合はフェールオーバーさせるためには、Pacemaker/CorosyncでDRBDを高可用性サービスとして設定できます。SUSE Linux Enterprise 15 SP7のインストールと設定については、パートII「設定および管理」を参照してください。
27.6 DRBDデバイスの監視 #
DRBDには、リアルタイム監視用のdrbdmonユーティリティが付属しています。このユーティリティにより、設定されているすべてのリソースの状態と、それらのリソースで発生している問題が示されます。
drbdmonが示す正常な接続 #問題がある場合、drbdadmに次のエラーメッセージが表示されます。
drbdmonが示す異常な接続 #27.7 DRBDのチューニング #
DRBDをチューニングするには、いくつかの方法があります。
メタデータ用には外部ディスクを使用します。これは便利ですが、保守作業は煩雑になります。
sysctlを介して受信バッファ設定および送信バッファ設定を変更することで、ネットワーク接続を調整します。DRBD設定で
max-epoch-size、max-buffers、またはその両方を変更します。IOパターンに応じて、
al-extentsの値を増やします。ハードウェアRAIDコントローラとBBU (バッテリバックアップユニット)を併用する場合、
no-disk-flushes、no-disk-barrier、およびno-md-flushesの設定が有効な場合があります。ワークロードに従って読み込みバランスを有効にします。詳しくはhttps://www.linbit.com/en/read-balancing/を参照してください。
27.8 DRBDのトラブルシュート #
DRBDセットアップには、多数のコンポーネントが使用され、別のソースから問題が発生することがあります。以降の各セクションでは、一般的なシナリオをいくつか示し、ソリューションを提示します。
27.8.1 設定 #
初期のDRBDセットアップが予期どおりに機能しない場合は、設定に問題がある場合があります。
環境設定の情報を取得するには:
端末コンソールを開き、
rootとしてログインします。drbdadmに-dオプションを指定して、環境設定ファイルをテストします。次のコマンドを入力します。#drbdadm -d adjust r0adjustオプションのドライ実行では、drbdadmは、DRBDリソースの実際の設定を使用中のDRBD環境設定ファイルと比較しますが、コールは実行しません。出力をレビューして、エラーのソースおよび原因を確認してください。/etc/drbd.d/*ファイルおよびdrbd.confファイルにエラーがある場合は、それらのエラーを修正してから続行します。パーティションと設定が正しい場合は、
drbdadmを-dオプションなしで、再度実行します。#drbdadm adjust r0このコマンドは、環境設定ファイルをDRBDリソースに適用します。
27.8.2 ホスト名 #
DRBDの場合、ホスト名の大文字と小文字が区別され(Node0はnode0とは異なるホストであるとみなされる)、カーネルに格納されているホスト名と比較されます(uname -n出力を参照)。
複数のネットワークデバイスがあり、専用ネットワークデバイスを使用したい場合、ホスト名は使用されたIPアドレスに解決されない場合があります。この場合は、パラメータdisable-ip-verificationを使用します。
27.8.3 TCPポート7788 #
システムがピアに接続できない場合は、ローカルファイアウォールに問題のある可能性があります。DRBDは、デフォルトでは、TCPポート7788を使用して、もう一方のノード にアクセスします。このポートを両方のノード からアクセスできるかどうか確認してください。
27.8.4 DRBDデバイスが再起動後に破損した #
DRBDサブシステムが実際のどのデバイスが最新データを保持しているか認識していない場合、スプリットブレイン状態に変更されます。この場合、それぞれのDRBDサブシステムがセカンダリとして起動され、互いに接続しません。この場合、ログ記録データに、次のメッセージが出力されることがあります。
Split-Brain detected, dropping connection!
この状況を解決するには、廃棄するデータを持つノードで、次のコマンドを入力します。
#drbdadm disconnect r0#drbdadm secondary r0#drbdadm connect --discard-my-data r0
最新のデータを持つノードで、次のコマンドを入力します。
#drbdadm disconnect r0#drbdadm connect r0
このコマンドは、あるノードのデータをピアのデータで上書きすることによって問題を解決するため、両方のノードで一貫したビューが得られます。
27.9 詳細情報 #
DRBDについては、次のオープンソースリソースを利用できます。
プロジェクトホームページhttps://linbit.com/drbd/。
Highly Available NFS Storage with DRBD and Pacemakerを参照してください。
ディストリビューションには、次のDRBDのマニュアルページが含まれています:
drbd(8)、drbdmeta(8)、drbdsetup(8)、drbdadm(8)、drbd.conf(5)。コメント付きのDRBD設定例が、
/usr/share/doc/packages/drbd-utils/drbd.conf.exampleにあります。

![[リソースの基本設定]画面には、リソース名のフィールド、ノードのリスト、および各ノードの詳細が含まれます。 [リソースの基本設定]画面には、リソース名のフィールド、ノードのリスト、および各ノードの詳細が含まれます。](images/yast_drbd-resconfig.png)


