適用先 SUSE Linux Enterprise High Availability Extension 12

15 DRBD

分散複製ブロックデバイス(DRBD*)を使用すると、IPネットワーク内の2つの異なるサイトに位置する2つのブロックデバイスのミラーを作成できます。Corosyncと共に使用すると、DRBDは分散高可用性Linuxクラスタをサポートします。この章では、DRBDのインストールとセットアップの方法を示します。

15.1 概念の概要

DRBDは、プライマリデバイス上のデータをセカンダリデバイスに、データの両方のコピーが同一に保たれるような方法で複製します。これは、ネットワーク型のRAID 1と考えてください。DRBDは、データをリアルタイムでミラーリングするので、そのレプリケーションは連続的に起こります。アプリケーションは、実際そのデータがさまざまなディスクに保存されるということを知る必要はありません。

重要
重要: 暗号化されないデータ

ミラー間のデータトラフィックは暗号化されません。データ交換を安全にするには、接続に仮想プライベートネットワーク(VPN)ソリューションを導入する必要があります。

DRBDは、Linuxカーネルモジュールであり、下端のI/Oスケジューラと上端のファイルシステムの間に存在しています(図15.1「Linux内でのDRBDの位置」参照)。DRBDと通信するには、高レベルのコマンドdrbdadmを使用します。柔軟性を最大にするため、DRBDには、低レベルのツールdrbdsetupが付いてきます。

Linux内でのDRBDの位置
図 15.1 Linux内でのDRBDの位置

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を介した既存のキロバイトへのアクセスは、それがユーザデータ用でないので、すべて失敗します。

15.2 DRBDサービスのインストール

パート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を拡張し、前の行を挿入します。

15.3 DRBDサービスの設定

注記
注記: 必要な調整

次の手順では、サーバ名としてjupiterとvenusを使用し、クラスタリソース名としてr0を使用します。jupiterはプライマリノードとして設定し、/dev/sda1に保管します。必ず、手順を変更して、ご使用のノード名とファイルの名前を使用してください。

DRBDの設定を始める前に、Linuxノード内のブロックデバイスを準備し、(必要な場合は)パーティション分割しておいてください。次の手順では、jupiterとvenusという2つのノードがあり、それらがTCPポート7788を使用すると想定します。ファイアウォールでこのポートが開いているようにしてください。

DRBDを手動で設定するには、次の手順に従います。

手順 15.1 DRBDの手動設定
  1. クラスタがすでにDRBDを使用している場合は、クラスタを保守モードにします。

    root # crm configure edit node alice attributes maintenance="true"

    クラスタがすでにDRBDを使用している場合に、この手順をスキップすると、ライブ設定の構文エラーによってサービスがシャットダウンされます。

  2. rootユーザとしてログインします。

  3. DRBDの環境設定ファイルを変更します。

    1. ファイル/etc/drbd.confを開き、次の行を挿入します(これらの行がない場合)。

      include "drbd.d/global_common.conf";
      include "drbd.d/*.res";

      DRBD 8.3以降、環境設定ファイルは、複数のファイルに分割され、/etc/drbd.d/ディレクトリに保存されています。

    2. /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を参照してください。

    3. ファイル/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
        }
      }

      1

      必要なサービスへのいくつかの関連付けを許可する名前。たとえば、nfshttpmysql_0postgres_walなど。

      2

      DRBD用デバイス名とそのマイナー番号。

      先に示した例では、マイナー番号0がDRBDに対して使用されています。udev統合スクリプトは、シンボリックリンク(/dev/drbd/by-res/nfs/0)を提供します。または、設定のデバイスノード名を省略し、代わりに次のラインを使用します。

      device minor 0

      3

      ノード間で複製されるrawデバイス。ただし、この例では、デバイスは両方のノードで同じです。異なるデバイスが必要な場合は、diskパラメータをonホストに移動します。

      4

      meta-diskパラメータには、通常、値internalが含まれますが、メタデータを保持する明示的なデバイスを指定することもできです。詳細については、http://www.drbd.org/users-guide-emb/ch-internals.html#s-metadataを参照してください。

      5

      onセクションでは、この設定文が適用されるホストを記述します。

      6

      それぞれのノードのIPアドレスとポート番号。リソースごとに、通常、7788から始まる別個のポートが必要です。

      7

      同期レート。このレートは、ディスク帯域幅およびネットワーク帯域幅の3分の1に設定します。これは、再同期を制限するだけで、レプリケーションは制限しません。

  4. 環境設定ファイルの構文をチェックします。次のコマンドがエラーを返す場合は、ファイルを検証します。

    root # drbdadm dump all
  5. 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/
  6. 各ノードで次のコマンドを入力することにより、両方のシステムでメタデータを初期化します。

    root # drbdadm create-md r0
    root # systemctl start drbd.service

    ディスクに、必要のなくなったファイルシステムがすでに含まれている場合は、次のコマンドでファイルシステムの構造を破壊し、このステップを繰り返します。

    root #  dd if=/dev/zero of=/dev/sda1 count=16 bs=1M
  7. 次のコマンドを各ノードで入力して、DRBDステータスをチェックします。

    root # systemctl status drbd.service

    次のような出力が表示されます。

    [... version string omitted ...]
    m:res  cs         ro                   ds                         p  mounted  fstype
    0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
  8. プライマリにしたいノード(この場合はjupiter)で再同期プロセスを開始します。

    root # drbdadm -- --overwrite-data-of-peer primary r0
  9. systemctl status drbd.serviceを使用してステータスを再度チェックすると、再同期後に、次のような結果が得られます。

    
    
    
    ...
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C

    ds行のステータス(ディスクステータス)は、両方のノードでUpToDateである必要があります。

  10. DRBDデバイスの上にファイルシステムを作成します。たとえば、次のように指定します。

    root # mkfs.ext3 /dev/drbd/by-res/r0/0
  11. ファイルシステムをマウントして使用します。

    root # mount /dev/drbd /mnt/
  12. クラスタの保守モードフラグをリセットします。

    root # crm configure edit node alice attributes maintenance="false"

または、YaSTを使用してDRBDを設定するには、次の手順を実行します。

手順 15.2 YaSTを使用してDRBDを設定
  1. YaSTを起動して、設定モジュール高可用性 › DRBDを選択します。すでにDRBDを設定していた場合、YaSTはそのことを警告します。YaSTは設定を変更し、古いDRBD設定ファイルを*.YaSTsaveとして保存します。

    起動設定 › ブートのブートフラグは、そのままにしてください(デフォルトではoff)。Pacemakerがこのサービスを管理するので変更しないでください。

  2. リソースの実際の設定は、ソース設定で実行されます(図15.2「リソース設定」を参照)。

    リソース設定
    図 15.2 リソース設定

    追加をクリックして、新規リソースを作成します。次のパラメータは2度設定する必要があります。

    リソース名

    リソースの名前(必須)。

    Name (名前)

    関連するノードのホスト名。

    アドレス:ポート

    それぞれのノードのIPアドレスとポート番号(デフォルトは7788)。

    デバイス

    複製されたデータにアクセスするためのブロックデバイスパス。

    ディスク

    両方のノード間で複製されるデバイス。

    メタディスク

    メタディスクは、値internalに設定されるか、またはインデックスで拡張された、drbdで必要なメタデータを保持する明示的なデバイスを指定します。

    複数のdrbdリソースに実際のデバイスを使用することもできます。たとえば、最初のリソースに対してメタディスク/dev/sda6[0]の場合、/dev/sda6[1]を2番目のリソースに使用できます。ただし、このディスク上で各リソースについて少なくとも128MBのスペースが必要です。メタデータの固定サイズによって、複製できる最大データサイズが制限されます。

    これらのオプションはすべて、/usr/share/doc/packages/drbd/drbd.confファイルの例とdrbd.conf(5)のマニュアルページで説明されています。

  3. 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/
  4. 各ノードで、次のように入力して、DRBDサービスを両方のシステム上で初期化し、起動します。

    root # drbdadm create-md r0
    root # systemctl start drbd.service
  5. alice上で次のコマンドの入力により、aliceをプライマリノードとして設定します。

    root # drbdsetup /dev/drbd0 primary --overwrite-data-of-peer
  6. 各ノード で、次のコマンドを入力して、DRBDサービスのステータスをチェックします。

    root # systemctl status drbd.service

    続行する前に、両方のノード のブロックデバイスが完全に同期されるまで待機します。systemctl status drbd.serviceコマンドを繰り返して、同期の進捗を追跡します。

  7. 両方のノードのブロックデバイスが完全に同期されたら、希望のファイルシステムで、プライマリノード上のDRBDデバイスをフォーマットします。任意のLinuxファイルシステムを使用できます。/dev/drbd/by-res/RESOURCE名を使用することをお勧めします。

15.4 DRBDサービスのテスト

インストールと設定のプロシージャが予期どおりの結果となった場合は、DRBD機能の基本的なテストを実行できます。このテストは、DRDBソフトウェアの機能を理解する上でも役立ちます。

  1. jupiterでDRBDサービスをテストします。

    1. 端末コンソールを開き、rootとしてログインします。

    2. jupiterにマウントポイント(/srv/r0など)を作成します。

      root # mkdir -p /srv/r0
    3. drbdデバイスをマウントします。

      root # mount -o rw /dev/drbd0 /srv/r0
    4. プライマリノードからファイルを作成します。

      root # touch /srv/r0/from_jupiter
    5. jupiterでディスクをマウント解除します。

      root # umount /srv/r0
    6. jupiterで次のコマンドを入力して、jupiterのDRBDサービスを降格します。

      root # drbdadm secondary
  2. venusでDRBDサービスをテストします。

    1. 端末コンソールを開き、venusでrootとしてログインします。

    2. venusで、DRBDサービスをプライマリに昇格します。

      root # drbdadm primary
    3. venusで、venusがプライマリかどうかチェックします。

      root # systemctl status drbd.service
    4. venusで、/srv/r0mountなどのマウントポイントを作成します。

      root # mkdir /srv/r0mount
    5. venusで、DRBDデバイスをマウントします。

      root # mount -o rw /dev/drbd_r0 /srv/r0mount
    6. jupiterで作成したファイルが存在していることを検証します。

      root # ls /srv/r0

      /srv/r0mount/from_jupiterファイルが一覧表示されるはずです。

  3. サービスが両方のノードで稼動していれば、DRBDの設定は完了です。

  4. 再度、jupiterをプライマリとして設定します。

    1. venusで次のコマンドを入力して、venusのディスクをディスマウントします。

      root # umount /srv/r0
    2. venusで次のコマンドを入力して、venusのDRBDサービスを降格します。

      root # drbdadm secondary
    3. jupiterで、DRBDサービスをプライマリに昇格します。

      root # drbdadm primary
    4. jupiterで、jupiterがプライマリかどうかチェックします。

      root # systemctl status drbd.service
  5. サービスを自動的に起動させ、サーバに問題が発生した場合はフェールオーバーさせるためには、Pacemaker/CorosyncでDRBDを高可用性サービスとして設定できます。SUSE Linux Enterprise 12のインストールと設定については、パートII「設定および管理」.参照してください。

15.5 DRBDのチューニング

DRBDをチューニングするには、いくつかの方法があります。

  1. メタデータ用には外部ディスクを使用します。これは便利ですが、保守作業は煩雑になります。

  2. DRBDデバイスの先読み設定を変更するudevルールを作成します。次の行をファイル/etc/udev/rules.d/82-dm-ra.rulesに保存し、read_ahead_kb値を独自のワークロードに変更します。

    ACTION=="add", KERNEL=="dm-*", ATTR{bdi/read_ahead_kb}="4100"

    このラインはLVMを使用する場合にのみ有効です。

  3. sysctlを介して受信および送信バッファ設定を変更することで、ネットワーク接続を調整します。

  4. DRBD設定でmax-buffersmax-epoch-size、またはその両方を変更します。

  5. IOパターンに応じて、al-extentsの値を増やします。

  6. ハードウェアRAIDコントローラとBBU (「バッテリバックアップユニット」)を併用する場合、no-disk-flushesno-disk-barrier、およびno-md-flushesの設定が有効な場合があります。

  7. ワークロードに従って読み込みバランスを有効にします。詳細については、http://blogs.linbit.com/p/256/read-balancing/を参照してください。

15.6 DRBDのトラブルシュート

DRBDセットアップには、多数の異なるコンポーネントが使用され、別のソースから問題が発生することがあります。以降のセクションでは、一般的なシナリオをいくつか示し、さまざまなソリューションを推奨します。

15.6.1 環境設定

初期のDRBDセットアップが予期どおりに機能しない場合は、おそらく、環境設定に問題があります。

環境設定の情報を取得するには:

  1. 端末コンソールを開き、rootとしてログインします。

  2. drbdadm-dオプションを指定して、環境設定ファイルをテストします。入力次のコマンドを入力します。

    root # drbdadm -d adjust r0

    adjustオプションのドライ実行では、drbdadmは、DRBDリソースの実際の設定を使用中のDRBD環境設定ファイルと比較しますが、コールは実行しません。出力をレビューして、エラーのソースおよび原因を確認してください。

  3. /etc/drbd.d/*ファイルとdrbd.confファイルにエラーがある場合は、そのエラーを修正してから続行してください。

  4. パーティションと設定が正しい場合は、drbdadm-dオプションなしで、再度実行します。

    root # drbdadm adjust r0

    このコマンドは、環境設定ファイルをDRBDリソースに適用します。

15.6.2 ホスト名

DRBDの場合、ホスト名の大文字と小文字が区別され(Node0node0とは異なるホストであるとみなされる)、カーネルに格納されているホスト名と比較されます(uname -n出力を参照)。

複数のネットワークデバイスがあり、専用ネットワークデバイスを使用したい場合、おそらく、ホスト名は使用されたIPアドレスに解決されません。この場合は、パラメータdisable-ip-verificationを使用します。

15.6.3 TCPポート7788

システムがピアに接続できない場合は、ローカルファイアウォールに問題のある可能性があります。DRBDは、デフォルトでは、TCPポート7788を使用して、もう一方のノード にアクセスします。このポートを両方のノード からアクセスできるかどうか確認してください。

15.6.4 DRBDデバイスが再起動後に破損した

DRBDサブシステムが実際のどのデバイスが最新データを保持しているか認識していない場合、スプリットブレイン受験に変更されます。この場合、それぞれのDRBDサブシステムがセカンダリとして機動され、互いに接続しません。この場合、ログ記録データに、次のメッセージが出力されることがあります。

Split-Brain detected, dropping connection!

この状況を解決するには、廃棄するデータを持つノードで、次のコマンドを入力します。

root # drbdadm secondary r0 
root # drbdadm -- --discard-my-data connect r0

最新のデータを持つノードで、次のコマンドを入力します。

root # drbdadm connect r0

このコマンドは、あるノードのデータをピアのデータで上書きすることによって問題を解決するため、両方のノードで一貫したビューが得られます。

15.7 詳細情報

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)に関する最新の通知を参照してください。

このページを印刷