DRBDの設定

2006/08/17

「VineでDRBDを使ってクラスタリング」の目次へ戻る


前提条件

以下では「Primaryサーバ」と「Secondaryサーバ」という表現をしています。

この設定例での条件を以下に示します。
  Primaryサーバ Secondaryサーバ
HDDの領域 /dev/sda3 /dev/hda3
IPアドレス 192.168.0.10 192.168.0.20
ホスト名 primary.tsuttayo.sytes.net secondary.tsuttayo.sytes.net

この例のように、PrimaryとSecondaryとで領域名が違っていてもかまいませんが、領域サイズは同等かまたはSecondaryサーバーのほうを大きめにしておく必要があると思います。

なお、クラスタリング用のIPアドレスは192.168.0.30ということにします。各クライアントからは192.168.0.30へアクセスしてもらうことになります。このとき、物理サーバがどちらになるかはheartbeatが決めます。


DRBDのプロトコル(protocol)について

DRBDはPrimaryサーバとSecondaryサーバとのミラー方式を指定する必要があります。プロトコルには以下の3つがあるようです。

なお、ここの説明ではプロトコル=Cを使うことにして書いています。 もっとも安定しているのはプロトコル=Cであり、クラスタリングが必要な用途では安定感がとても重要だと思うので私のところではプロトコル=Cを利用しています。

プロトコル 動作
A データがディスクに書き込まれ、かつネットワークに送信された時点で書込み操作を完了します。
B 受信肯定応答を受信した時点で、書込み操作を完了します。
C 書き込み肯定応答を受信した時点で、書込み操作を完了します。

DRBDで利用するエリアの確保

以下の作業はすべてrootでログインして行う必要があります。

  1. PrimaryサーバとSecondaryサーバにDRBDのrpmパッケージをインストールしておきます。
  2. Primaryサーバにfdiskで領域を確保します。
    「fdisk /dev/sda」などとして、領域を作ってください。ここでは/dev/sda3に領域を確保したこととしますので、ご自身の環境に合わせて読み替えてください。
  3. Secondaryサーバも同様にして「fdisk /dev/hda」などとして領域を作ってください。ここでは/dev/hda3に領域を確保したこととします。
  4. 次のようにしてPrimaryサーバでDRBDの実行を開始します。
    # insmod drbd
    /dev/drbd0へのアクセスを/dev/sda3に割り付けます。
    # drbdsetup /dev/drbd0 disk /dev/sda3 internal -1
    PrimaryからSecondaryへの通信経路を設定します。
    # drbdsetup /dev/drbd0 net 192.168.0.10 192.168.0.20 C
    PrimaryからSecondaryへの通信速度を600M/Secとします。
    # drbdsetup /dev/drbd0 syncer -r 600m
    Primaryサーバをプライマリとして宣言します。
    # drbdsetup /dev/drbd0 primary --do-what-I-say
  5. 次のようにしてSecondaryサーバでDRBDの実行を開始します。
    # insmod drbd
    /dev/drbd0へのアクセスを/dev/sda3に割り付けます。
    # drbdsetup /dev/drbd0 disk /dev/hda3 internal -1
    PrimaryからSecondaryへの通信経路を設定します。
    # drbdsetup /dev/drbd0 net 192.168.0.20 192.168.0.10 C
    SecondaryからPrimaryへの通信速度を600M/Secとします。
    # drbdsetup /dev/drbd0 syncer -r 600m
  6. 上記までで、ミラーリングされるようになっています。
    /dev/drbd0のデバイスが有効となっているので、ここに領域を確保することにします。
    Primaryサーバでext3の領域を作ります。
    # mkfs -j /dev/drbd0
  7. ミラーリングされているため、mkfs実行中はSecondaryサーバでもmkfsが実行されます。
    # cat /proc/drbd
    これにより、現在のミラーリングの進捗状況が確認できます。完全に終了するまで待ちましょう。

なお、/dev/drbd1もミラーリングするなら、次のようにします(これはPrimary側の例です)。
drbdsetup /dev/drbd1 disk /dev/sda4 internal -1
drbdsetup /dev/drbd1 net 192.168.0.10:7789 192.168.0.20:7789 C
drbdsetup /dev/drbd1 syncer -r 600m
このようにして、ポートを変えるようにしないと「Local address(port) already in use.」というエラーになります。


hostsの変更

/etc/hostsを修正します。DNSもこのサーバでクラスタリングすることになるかもしれないので、クラスタリングする2つのノードはhostsだけで名前解決できるようにしておきましょう。

この例では次のようにしました。
192.168.0.10 primary.tsuttayo.sytes.net
192.168.0.20 secondary.tsuttayo.sytes.net

この設定はPrimaryサーバとSecondaryサーバの両方に行います。内容は同じです。


DRBD用の設定ファイルを変更

  1. Primaryサーバの/etc/drbd.confを修正します。
    すでにひな形がインストールされていますのでこれを変更していきます。
    r1〜r3もひな形が設定されているため、これらは削除するか、「skip r1」などとしてください。
    resource r0 {
      protocol C;
      startup {
        wfc-timeout 1;
        degr-wfc-timeout 1;
      }
      disk {
        on-io-error pass_on;
      }
      syncer {
        rate 60M;
        group 1;
        al-extents 257;
      }
      on primary.tsuttayo.sytes.net {
        device /dev/drbd0;
        disk /dev/sda3;
        address 192.168.0.10:7788;
        meta-disk internal;
      }
      on secondary.tsuttayo.sytes.net {
        device /dev/drbd0;
        disk /dev/hda3;
        address 192.168.0.20:7788;
        meta-disk internal;
      }
    }
  2. Secondaryサーバもまったく同一内容で/etc/drbd.confを修正します。Primaryサーバからftpなどでファイルをコピーしたほうが簡単かもしれません。
  3. ここまで設定したら動作確認を行います。両サーバともシャットダウン/再起動します。
    再起動後、DRBDサービスを起動してみます。
    # /etc/init.d/drbd start
    うまくいっているかを確認します。
    # drbdsetup /dev/drbd0 state
    うまくいっていないようなら、/var/log/messagesを確認することで、エラー原因を調べましょう。
  4. ここまですべてOKならば、サーバ起動時にdrbdデーモンを自動起動するようにしておきます。
    # /sbin/chkconfig drbd on

DRBDの動作確認

DRBDの動作確認は以下のコマンドでおよそわかるようです。ここにまとめておきました。

  • ミラーリングの進捗状況の確認。
    # cat /proc/drbd
  • 現在、PrimaryなのかSecondaryなのかを確認。
    # drbdsetup /dev/drbd0 state
  • 詳細設定の確認。
    # drbdsetup /dev/drbd0 show

/homeをミラーリングさせる

ここまででミラーリングはされていますが、まだマウントしていないので実際のところはどうなのかが不明でしょう。そこで/homeにマウントしてみることにします。

  1. 次のようなスクリプトを /etc/ha.d/resource.d/homemountというような名前で作成する。
    これはPrimary、Secondaryとも必要です。
    #!/bin/sh
    
    RES="$1"
    CMD="$2"
    
    function GetState() {
        retval=`drbdadm state $1 | awk 'BEGIN { FS = "/"} { print $1 }'`
    }
    
    
    case "$CMD" in
        start)
            /etc/ha.d/resource.d/drbddisk $RES $CMD
            drbdadm connect all
            GetState $RES
            if [ $retval == 'Primary' ]; then
                mount /home
            fi
            ;;
        stop)
            GetState $RES
            if [ $retval == 'Primary' ]; then
                umount /home
            fi
            /etc/ha.d/resource.d/drbddisk $RES $CMD
            drbdadm connect all
            ;;
        *)
            exit 0
            ::
    esac
    
    exit 0
  2. Primary側で、現状の/homeをバックアップします。
    # cd /
    # tar cpzf home.tar.gz /home
  3. /etc/fstabを編集します。これはPrimary、Secondaryとも設定してください。
    # 以下の行を追加します。
    /dev/drbd0             /home                    ext3    noauto 0 0
  4. Primary側でマウントします。
    # mount /home
    dfコマンドなどでちゃんとマウントされているかを確認してみましょう。
  5. Primary側でバックアップから復元します。
    # cd /
    # tar zxvf home.tar.gz
  6. 作成しておいたスクリプトの動作確認をしましょう。
    一時的に/homeをumountしてみます。
    # umount /home
    スクリプトを利用してマウントします。
    # /etc/ha.d/resource.d/homemount r0 start
    この後、dfコマンドでうまくマウントされたか確認してみてください。
  7. ここまでOKならば、 /etc/rc.local の一番最後に以下の行を追加しておきましょう。この設定もPrimary、Secondaryとも行ってください。
    /etc/ha.d/resource.d/homemount r0 start
    これでサーバが再起動時、それがPrimaryならば/homeが自動的にマウントされるようになります。
Copyright©2001-2019 釣ったよ! All Right Reserved.    sg@tsuttayo.jpn.org