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ディスクを介した既存のキロバイトへのアクセスは、それがユーザデータ用でないので、すべて失敗します。
パート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を拡張し、前の行を挿入します。
次の手順では、サーバ名としてaliceとbobを使用し、クラスタリソース名としてr0を使用します。aliceをプライマリノードとして設定し、/dev/sda1をストレージとして設定します。必ず、手順を変更して、ご使用のノード名とファイルの名前を使用してください。
次の項では、aliceとbobという2つのノードがあり、それぞれがTCPポート7788を使用するものと想定しています。ファイアウォールでこのポートが開いているようにしてください。
システムを準備します。
Linuxノード内のブロックデバイスを準備し、(必要な場合は)パーティション分割しておいてください。
ディスクに、必要のなくなったファイルシステムがすでに含まれている場合は、次のコマンドでファイルシステムの構造を破壊します。
root #ddif=/dev/zero of=YOUR_DEVICE count=16 bs=1M
破壊する、より多くのファイルシステムがある場合は、DRBDセットアップに含むすべてのデバイス上でこのステップを繰り返します。
クラスタがすでにDRBDを使用している場合は、クラスタを保守モードにします。
root #crmconfigure 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 #crmconfigure property maintenance-mode=false
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リソースの名前。たとえば、 | |
DRBD用デバイス名とそのマイナー番号。
先に示した例では、マイナー番号0がDRBDに対して使用されています。udev統合スクリプトは、シンボリックリンク(
| |
ノード間で複製されるrawデバイス。ただし、この例では、デバイスは両方のノードで「同じ」です。異なるデバイスが必要な場合は、 | |
meta-diskパラメータには、通常、値 | |
| |
それぞれのノードのIPアドレスとポート番号。リソースごとに、通常、 | |
複数のノードを設定する際は、ノードIDが必要です。ノードIDは、別々のノードを区別するための固有の負でない整数です。 | |
同期レート。このレートは、ディスク帯域幅およびネットワーク帯域幅の3分の1に設定します。これは、再同期を制限するだけで、レプリケーションは制限しません。 | |
同一メッシュのすべてのノードを設定します。 |
環境設定ファイルの構文をチェックします。次のコマンドがエラーを返す場合は、ファイルを検証します。
root #drbdadmdump all
YaSTを使用して、DRBDの初期セットアップを開始できます。DRBDセットアップの作成後、生成されたファイルを手動で調整できます。
ただし、設定ファイルを変更した後にYaST DRBDモジュールを使用しないでください。DRBDモジュールでサポートされているのは、限られた一連の基本設定のみです。再度DRBDモジュールを使用すると、変更内容がモジュールに表示されない可能性があります。
YaSTを使ってDRBDを設定するには、次の手順に従います。
YaSTを起動して、設定モジュール › を選択します。すでにDRBDを設定していた場合、YaSTはそのことを警告します。YaSTは設定を変更し、古いDRBD設定ファイルを*.YaSTsaveとして保存します。
› のブートフラグは、そのままにしてください(デフォルトではoff)。Pacemakerがこのサービスを管理するので変更しないでください。
ファイアウォールが実行中の場合は、を有効にします。
エントリに移動します。をクリックして、新しいリソースを作成します(図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フィルタの最初のエントリとして挿入されます。フィルタを手動で変更するには、チェックボックスをクリックします。
をクリックして、変更を保存します。
システムを準備してDRBDを設定したら、ディスクの初回の初期化を行います。
両ノード(aliceとbob)でメタデータストレージを初期化します。
root #drbdadmcreate-md r0root #drbdadmup r0
DRBDリソースの初期再同期を短縮する場合は、次のことを確認します。
すべてのノード上のDRBDデバイスが同じデータを持つ場合(たとえば、20.3項 「DRBDサービスの設定」に示すようにddコマンドでファイルシステム構造を破壊することによる)、次のコマンドを使用して初期再同期をスキップします(両ノード)。
root #drbdadmnew-current-uuid --clear-bitmap r0/0
状態はSecondary/Secondary UpToDate/UpToDateです
その後、次のステップに進みます。
プライマリノードのaliceから再同期プロセスを開始します。
root #drbdadmprimary --force r0
以下を使用してステータスをチェックします。
root #drbdadmstatus r0 r0 role:Primary disk:UpToDate bob role:Secondary peer-disk:UpToDate
DRBDデバイスの上にファイルシステムを作成します。たとえば、次のように指定します。
root #mkfs.ext3/dev/drbd0
ファイルシステムをマウントして使用します。
root #mount/dev/drbd0 /mnt/
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 #drbdadmcreate-md RESOURCE
スタンバイモードをキャンセルします。
スタックされた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;
}
}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がその同期プロセスを完了すると、制限が解除されます。クラスタマネージャは自由にリソースをプロモートできるようになります。
インストールと設定のプロシージャが予期どおりの結果となった場合は、DRBD機能の基本的なテストを実行できます。このテストは、DRDBソフトウェアの機能を理解する上でも役立ちます。
alice上でDRBDサービスをテストします。
端末コンソールを開き、rootとしてログインします。
aliceにマウントポイント(/srv/r0など)を作成します。
root #mkdir-p /srv/r0
drbdデバイスをマウントします。
root #mount-o rw /dev/drbd0 /srv/r0
プライマリノードからファイルを作成します。
root #touch/srv/r0/from_alice
aliceでディスクをマウント解除します。
root #umount/srv/r0
aliceで次のコマンドを入力して、aliceのDRBDサービスを降格します。
root #drbdadmsecondary r0
bob上でDRBDサービスをテストします。
端末コンソールを開き、bobでrootとしてログインします。
bobで、DRBDサービスをプライマリに昇格します。
root #drbdadmprimary r0
bobで、bobがプライマリかどうかチェックします。
root #drbdadmstatus r0
bobで、/srv/r0などのマウントポイントを作成します。
root #mkdir/srv/r0
bobで、DRBDデバイスをマウントします。
root #mount-o rw /dev/drbd0 /srv/r0
aliceで作成したファイルが存在していることを確認します。
root #ls/srv/r0/from_alice
/srv/r0/from_aliceファイルが一覧に表示されている必要があります。
サービスが両方のノードで稼動していれば、DRBDの設定は完了です。
再度、aliceをプライマリとして設定します。
bobで次のコマンドを入力して、bobのディスクをマウント解除します。
root #umount/srv/r0
bobで次のコマンドを入力して、bobのDRBDサービスを降格します。
root #drbdadmsecondary
aliceで、DRBDサービスをプライマリに昇格します。
root #drbdadmprimary
aliceで、aliceがプライマリかどうかチェックします。
root #drbdadmstatus r0
サービスを自動的に起動させ、サーバに問題が発生した場合はフェールオーバーさせるためには、Pacemaker/CorosyncでDRBDを高可用性サービスとして設定できます。SUSE Linux Enterprise 12 SP5のインストールと設定については、パートII「設定および管理」を参照してください。
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/を参照してください。
DRBDセットアップには、多数のコンポーネントが使用され、別のソースから問題が発生することがあります。以降のセクションでは、一般的なシナリオをいくつか示し、さまざまなソリューションを推奨します。
初期のDRBDセットアップが予期どおりに機能しない場合は、おそらく、環境設定に問題があります。
環境設定の情報を取得するには:
端末コンソールを開き、rootとしてログインします。
drbdadmに-dオプションを指定して、環境設定ファイルをテストします。入力次のコマンドを入力します。
root #drbdadm-d adjust r0
adjustオプションのドライ実行では、drbdadmは、DRBDリソースの実際の設定を使用中のDRBD環境設定ファイルと比較しますが、コールは実行しません。出力をレビューして、エラーのソースおよび原因を確認してください。
/etc/drbd.d/*ファイルとdrbd.confファイルにエラーがある場合は、そのエラーを修正してから続行してください。
パーティションと設定が正しい場合は、drbdadmを-dオプションなしで、再度実行します。
root #drbdadmadjust r0
このコマンドは、環境設定ファイルをDRBDリソースに適用します。
DRBDの場合、ホスト名の大文字と小文字が区別され(Node0はnode0とは異なるホストであるとみなされる)、カーネルに格納されているホスト名と比較されます(uname -n出力を参照)。
複数のネットワークデバイスがあり、専用ネットワークデバイスを使用したい場合、おそらく、ホスト名は使用されたIPアドレスに解決されません。この場合は、パラメータdisable-ip-verificationを使用します。
システムがピアに接続できない場合は、ローカルファイアウォールに問題のある可能性があります。DRBDは、デフォルトでは、TCPポート7788を使用して、もう一方のノード にアクセスします。このポートを両方のノード からアクセスできるかどうか確認してください。
DRBDサブシステムが実際のどのデバイスが最新データを保持しているか認識していない場合、スプリットブレイン受験に変更されます。この場合、それぞれのDRBDサブシステムがセカンダリとして起動され、互いに接続しません。この場合、ログ記録データに、次のメッセージが出力されることがあります。
Split-Brain detected, dropping connection!
この状況を解決するには、廃棄するデータを持つノードで、次のコマンドを入力します。
root #drbdadmsecondary r0
状態がWFconnectionの場合、最初に切断します。
root #drbdadmdisconnect r0
最新のデータを持つノードで、次のコマンドを入力します。
root #drbdadmconnect --discard-my-data r0
このコマンドは、あるノードのデータをピアのデータで上書きすることによって問題を解決するため、両方のノードで一貫したビューが得られます。
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/)に関する最新の通知を参照してください。