
分散複製ブロックデバイス(DRBD*)を使用すると、IPネットワーク内の2つの異なるサイトに位置する2つのブロックデバイスのミラーを作成できます。Corosyncと共に使用すると、DRBDは分散高可用性Linuxクラスタをサポートします。この章では、DRBDのインストールとセットアップの方法を示します。
DRBDは、プライマリデバイス上のデータをセカンダリデバイスに、データの両方のコピーが同一に保たれるような方法で複製します。これは、ネットワーク型のRAID 1と考えてください。DRBDは、データをリアルタイムでミラーリングするので、そのレプリケーションは連続的に起こります。アプリケーションは、実際そのデータがさまざまなディスクに保存されるということを知る必要はありません。
ミラー間のデータトラフィックは暗号化されません。データ交換を安全にするには、接続に仮想プライベートネットワーク(VPN)ソリューションを導入する必要があります。
DRBDは、Linuxカーネルモジュールであり、下端のI/Oスケジューラと上端のファイルシステムの間に存在しています(図15.1「Linux内でのDRBDの位置」参照)。DRBDと通信するには、高レベルのコマンドdrbdadmを使用します。柔軟性を最大にするため、DRBDには、低レベルのツールdrbdsetupが付いてきます。
DRBDでは、Linuxでサポートされる任意のブロックデバイスを使用できます。通常は次のデバイスです。
パーティションまたは完全なハードディスク
ソフトウェアRAID
LVM (Logical Volume Manager)
EVMS (Enterprise Volume Management System)
DRBDは、デフォルトでは、DRBDノード間の通信にTCPポート7788以上を使用します。使用しているポートの通信がファイアウォールで許可されていることを確認してください。
まず、DRBDデバイスを設定してから、その上にファイルシステムを作成する必要があります。ユーザデータに関することはすべて、rawデバイスではなく、/dev/drbd_Nデバイスを介してのみ実行される必要があります。これは、DRBDが、メタデータ用にrawデバイスの最後の部分を使用するからです。rawデバイスを使用すると、データが矛盾する原因となります。
udevの統合により、/dev/drbd/by-res/RESOURCESの形式でシンボリックリンクも取得されます。このリンクは、より簡単に使用でき、デバイスのマイナー番号を誤って記憶しないように安全対策が講じられています。
たとえば、rawデバイスのサイズが1024MBの場合、DRBDデバイスは、1023MBしかデータ用に使用できません。70KBは隠され、メタデータ用に予約されています。/dev/drbdNを介した既存のキロバイトへのアクセスは、それがユーザデータ用でないので、すべて失敗します。
パートI「インストールおよびセットアップ」で説明されているように、High Availability Extensionアドオンをネットワーククラスタの両方のSUSE Linux Enterprise Serverマシンにインストールします。High Availability Extensionをインストールすると、DRBDプログラムファイルもインストールされます。
クラスタスタック全体を必要とせず、DRBDのみを使用したい場合、パッケージdrbdをインストールしてください。
drbdadm (drbdパッケージの一部)を使用した作業を簡素化するには、バッシュ補完サポートを使用してください。現在のシェルセッションでこのサポートを有効にするには、次のコマンドを挿入します。
root #source/etc/bash_completion.d/drbdadm.sh
root用に永続的に使用するには、ファイル/root/.bashrcを拡張し、前の行を挿入します。
次の手順では、サーバ名としてjupiterとvenusを使用し、クラスタリソース名としてr0を使用します。jupiterはプライマリノードとして設定し、/dev/sda1に保管します。必ず、手順を変更して、ご使用のノード名とファイルの名前を使用してください。
DRBDの設定を始める前に、Linuxノード内のブロックデバイスを準備し、(必要な場合は)パーティション分割しておいてください。次の手順では、jupiterとvenusという2つのノードがあり、それらがTCPポート7788を使用すると想定します。ファイアウォールでこのポートが開いているようにしてください。
DRBDを手動で設定するには、次の手順に従います。
クラスタがすでにDRBDを使用している場合は、クラスタを保守モードにします。
root #crmconfigure edit node alice attributes maintenance="true"
クラスタがすでにDRBDを使用している場合に、この手順をスキップすると、ライブ設定の構文エラーによってサービスがシャットダウンされます。
rootユーザとしてログインします。
DRBDの環境設定ファイルを変更します。
ファイル/etc/drbd.confを開き、次の行を挿入します(これらの行がない場合)。
include "drbd.d/global_common.conf"; include "drbd.d/*.res";
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;
}これらのオプションは、ブート時のタイムアウトを減らすために使用します。詳細については、http://www.drbd.org/users-guide-emb/re-drbdconf.htmlを参照してください。
ファイル/etc/drbd.d/r0.resを作成し、状況に合わせて行を変更し、ファイルを保存します。
resource r0 { 1
device /dev/drbd0; 2
disk /dev/sda1; 3
meta-disk internal; 4
on jupiter { 5
address 192.168.1.10:7788; 6
}
on venus { 5
address 192.168.1.11:7788; 6
}
syncer {
rate 7M; 7
}
}
必要なサービスへのいくつかの関連付けを許可する名前。たとえば、 | |
DRBD用デバイス名とそのマイナー番号。
先に示した例では、マイナー番号0がDRBDに対して使用されています。udev統合スクリプトは、シンボリックリンク(
| |
ノード間で複製されるrawデバイス。ただし、この例では、デバイスは両方のノードで同じです。異なるデバイスが必要な場合は、 | |
meta-diskパラメータには、通常、値 | |
| |
それぞれのノードのIPアドレスとポート番号。リソースごとに、通常、 | |
同期レート。このレートは、ディスク帯域幅およびネットワーク帯域幅の3分の1に設定します。これは、再同期を制限するだけで、レプリケーションは制限しません。 |
環境設定ファイルの構文をチェックします。次のコマンドがエラーを返す場合は、ファイルを検証します。
root #drbdadmdump all
Csync2(デフォルト)を設定している場合、DRBD設定ファイルは、同期に必要なファイルのリストにすでに含まれています。同期するには、次のコマンドを使用します。
root #csync2-xv /etc/drbd.d/
Csync2を設定していない場合(または使用しない場合)には、DRBD設定ファイルを手動で他のノードにコピーしてください。
root #scp/etc/drbd.conf venus:/etc/ scp /etc/drbd.d/* venus:/etc/drbd.d/
各ノードで次のコマンドを入力することにより、両方のシステムでメタデータを初期化します。
root #drbdadmcreate-md r0root #systemctlstart drbd.service
ディスクに、必要のなくなったファイルシステムがすでに含まれている場合は、次のコマンドでファイルシステムの構造を破壊し、このステップを繰り返します。
root #ddif=/dev/zero of=/dev/sda1 count=16 bs=1M
次のコマンドを各ノードで入力して、DRBDステータスをチェックします。
root #systemctlstatus drbd.service
次のような出力が表示されます。
[... version string omitted ...] m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C
プライマリにしたいノード(この場合はjupiter)で再同期プロセスを開始します。
root #drbdadm-- --overwrite-data-of-peer primary r0
systemctl status drbd.serviceを使用してステータスを再度チェックすると、再同期後に、次のような結果が得られます。
... m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C
ds行のステータス(ディスクステータス)は、両方のノードでUpToDateである必要があります。
DRBDデバイスの上にファイルシステムを作成します。たとえば、次のように指定します。
root #mkfs.ext3/dev/drbd/by-res/r0/0
ファイルシステムをマウントして使用します。
root #mount/dev/drbd /mnt/
クラスタの保守モードフラグをリセットします。
root #crmconfigure edit node alice attributes maintenance="false"
または、YaSTを使用してDRBDを設定するには、次の手順を実行します。
YaSTを起動して、設定モジュール › を選択します。すでにDRBDを設定していた場合、YaSTはそのことを警告します。YaSTは設定を変更し、古いDRBD設定ファイルを*.YaSTsaveとして保存します。
› のブートフラグは、そのままにしてください(デフォルトではoff)。Pacemakerがこのサービスを管理するので変更しないでください。
リソースの実際の設定は、で実行されます(図15.2「リソース設定」を参照)。
をクリックして、新規リソースを作成します。次のパラメータは2度設定する必要があります。
|
|
リソースの名前(必須)。 |
|
|
関連するノードのホスト名。 |
|
|
それぞれのノードのIPアドレスとポート番号(デフォルトは7788)。 |
|
|
複製されたデータにアクセスするためのブロックデバイスパス。 |
|
|
両方のノード間で複製されるデバイス。 |
|
|
は、値
複数のdrbdリソースに実際のデバイスを使用することもできます。たとえば、最初のリソースに対してが |
これらのオプションはすべて、/usr/share/doc/packages/drbd/drbd.confファイルの例とdrbd.conf(5)のマニュアルページで説明されています。
Csync2(デフォルト)を設定している場合、DRBD設定ファイルは、同期に必要なファイルのリストにすでに含まれています。同期するには、次のコマンドを使用します。
root #csync2-xv /etc/drbd.d/
Csync2を設定していない場合(または使用しない場合)には、DRBD設定ファイルを手動で他のノードにコピーしてください(venusという名前のもう1つのノードとされています)。
root #scp/etc/drbd.conf venus:/etc/ scp /etc/drbd.d/* venus:/etc/drbd.d/
各ノードで、次のように入力して、DRBDサービスを両方のシステム上で初期化し、起動します。
root #drbdadmcreate-md r0root #systemctlstart drbd.service
alice上で次のコマンドの入力により、aliceをプライマリノードとして設定します。
root #drbdsetup/dev/drbd0 primary --overwrite-data-of-peer
各ノード で、次のコマンドを入力して、DRBDサービスのステータスをチェックします。
root #systemctlstatus drbd.service
続行する前に、両方のノード のブロックデバイスが完全に同期されるまで待機します。systemctl status drbd.serviceコマンドを繰り返して、同期の進捗を追跡します。
両方のノードのブロックデバイスが完全に同期されたら、希望のファイルシステムで、プライマリノード上のDRBDデバイスをフォーマットします。任意のLinuxファイルシステムを使用できます。/dev/drbd/by-res/RESOURCE名を使用することをお勧めします。
インストールと設定のプロシージャが予期どおりの結果となった場合は、DRBD機能の基本的なテストを実行できます。このテストは、DRDBソフトウェアの機能を理解する上でも役立ちます。
jupiterでDRBDサービスをテストします。
端末コンソールを開き、rootとしてログインします。
jupiterにマウントポイント(/srv/r0など)を作成します。
root #mkdir-p /srv/r0
drbdデバイスをマウントします。
root #mount-o rw /dev/drbd0 /srv/r0
プライマリノードからファイルを作成します。
root #touch/srv/r0/from_jupiter
jupiterでディスクをマウント解除します。
root #umount/srv/r0
jupiterで次のコマンドを入力して、jupiterのDRBDサービスを降格します。
root #drbdadmsecondary
venusでDRBDサービスをテストします。
端末コンソールを開き、venusでrootとしてログインします。
venusで、DRBDサービスをプライマリに昇格します。
root #drbdadmprimary
venusで、venusがプライマリかどうかチェックします。
root #systemctlstatus drbd.service
venusで、/srv/r0mountなどのマウントポイントを作成します。
root #mkdir/srv/r0mount
venusで、DRBDデバイスをマウントします。
root #mount-o rw /dev/drbd_r0 /srv/r0mount
jupiterで作成したファイルが存在していることを検証します。
root #ls/srv/r0
/srv/r0mount/from_jupiterファイルが一覧表示されるはずです。
サービスが両方のノードで稼動していれば、DRBDの設定は完了です。
再度、jupiterをプライマリとして設定します。
venusで次のコマンドを入力して、venusのディスクをディスマウントします。
root #umount/srv/r0
venusで次のコマンドを入力して、venusのDRBDサービスを降格します。
root #drbdadmsecondary
jupiterで、DRBDサービスをプライマリに昇格します。
root #drbdadmprimary
jupiterで、jupiterがプライマリかどうかチェックします。
root #systemctlstatus drbd.service
サービスを自動的に起動させ、サーバに問題が発生した場合はフェールオーバーさせるためには、Pacemaker/CorosyncでDRBDを高可用性サービスとして設定できます。SUSE Linux Enterprise 12のインストールと設定については、パートII「設定および管理」.参照してください。
DRBDをチューニングするには、いくつかの方法があります。
メタデータ用には外部ディスクを使用します。これは便利ですが、保守作業は煩雑になります。
DRBDデバイスの先読み設定を変更するudevルールを作成します。次の行をファイル/etc/udev/rules.d/82-dm-ra.rulesに保存し、read_ahead_kb値を独自のワークロードに変更します。
ACTION=="add", KERNEL=="dm-*", ATTR{bdi/read_ahead_kb}="4100"このラインはLVMを使用する場合にのみ有効です。
sysctlを介して受信および送信バッファ設定を変更することで、ネットワーク接続を調整します。
DRBD設定でmax-buffers、max-epoch-size、またはその両方を変更します。
IOパターンに応じて、al-extentsの値を増やします。
ハードウェアRAIDコントローラとBBU (「バッテリバックアップユニット」)を併用する場合、no-disk-flushes、no-disk-barrier、およびno-md-flushesの設定が有効な場合があります。
ワークロードに従って読み込みバランスを有効にします。詳細については、http://blogs.linbit.com/p/256/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 #drbdadm secondary r0root #drbdadm-- --discard-my-data connect r0
最新のデータを持つノードで、次のコマンドを入力します。
root #drbdadmconnect 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)、drbddisk(8)、drbdsetup(8)、drbdsetup(8)、drbdadm。(8)、drbd.conf(5)
コメント付きのDRBD構成例が、/usr/share/doc/packages/drbd/drbd.confにあります。
さらに、クラスタ間のストレージ管理を容易にするために、「DRBD-Manager」(http://blogs.linbit.com/p/666/drbd-manager)に関する最新の通知を参照してください。