DRBD+GFS2 - ネットワークでミラーリング + 共有ディスク

 DRBDはディスクをネットワークを介してミラーリングすることによりデータの安全性を高める「データミラークラスタ」タイプのソフトウェアです。いわば、ネットワークでRAID-1を実現していることになります。Gigabit Ether でピアネットワークを構築しているならばほとんどローカルと変わらないくらいです。

 DRBD は 8.0.0 より共有ディスク構成(ACT/ACT構成)をとることができるようになりました。今回は、Fedora Core 6 上で CMAN + GFS2 を使用したACT/ACT構成をおこなうことを主眼として構築していきます。

 なお、わたし自身は片方からバックアップがとれればいいかなとおもっているので、両方に書き込み負荷をかけたときの挙動まではみていません (^^;

ダウンロード

公式ホームページからダウンロードしてください。

コンパイル方法

面倒なので RPM を作成します。

# rpmbuild -ta --target=i686 drbd-8.0.1.tar.gz

インストール方法

GFS2 は ClusterManager などに依存するものがありますので、それらも一緒にインストールする必要があります。

# rpm -Uvh cman-2.0.60-1.fc6.i386.rpm
# rpm -Uvh lvm2-2.02.17-1.fc6.i386.rpm
# rpm -Uvh lvm2-cluster-2.02.17-1.fc6.i386.rpm
# rpm -Uvh gfs2-utils-0.1.25-1.fc6.i386.rpm

上記をインストールした後に先ほど作成したRPMをインストールします。

# rpm -Uvh drbd-km-2.6.20_1.2933.fc6-8.0.1-1.i686.rpm
# rpm -Uvh drbd-8.0.1-1.i686.rpm

設定

設定がいっぱいあるので、順を追って説明します。

cman(ClusterManager)の設定

まず、Clusterの設定からおこないます。設定はかなり端折っていますので、くわしくはマニュアルを参照してください。(redhatはGUIからの設定を推奨しているようです)

  • /etc/cluster/cluster.conf
    <?xml version="1.0"?>
    <cluster name="cluster1" config_version="11"> ←ここの名前は重要!
     <clusternodes>
       <clusternode name="node1" votes="1" nodeid="1">
         <fence>
           <method name="single">
             <device name="manual" ipaddr="192.168.35.101"/>
           </method>
         </fence>
       </clusternode>
       <clusternode name="node2" votes="1" nodeid="2">
         <fence>
           <method name="single">
             <device name="manual" ipaddr="192.168.35.102"/>
           </method>
         </fence>
       </clusternode>
     <fencedevices>
       <fencedevice name="manual" agent="fence_manual"/>
     </fencedevices>
     <rm>
       <failoverdomains/>
       <resources/>
     </rm>
    </cluster>
    上記の設定は1台目も2台目も全く同じ設定をおこないます。

また、通常の設定ではタイムアウトがあまりにも長いので、今回は以下をいれてタイムアウト時間を短くします。

  • /etc/sysconfig/cman
    #
    # Setting of Cluster Manager
    #
    CMAN_CLUSTER_TIMEOUT=60
    FENCED_START_TIMEOUT=45

ここで、おもむろに両方のマシンから ClusterManager を起動してみます。最初は2台同時に起動しないと認識せずにタイムアウトするかもしれません。

# service cman start

ちゃんとクラスタ化されているか、ツールを使って確認します。(両方のステータスが'M'になっていればOKです。また、成功していれば fence サービスに全てのノードが接続されています。

# cman_tool nodes
Node  Sts   Inc   Joined               Name
   1   M    456   2007-04-01 14:15:47  node1
   2   M    456   2007-04-01 14:15:47  node2
# cman_tool services
type             level name     id       state       
fence            0     default  00010001 none        
[1 2]

DRBDの設定

 こちらはバージョン0.7のときとそれほど変更はありません。

  • /etc/drbd.conf
    global {
      usage-count yes;
    }
    resource r0 {
      protocol C;
      startup {
        wfc-timeout       60;  ## 60 seconds.
        degr-wfc-timeout  10;  ## 10 seconds.
      }
      disk {
        on-io-error detach;
      }
      net {
        allow-two-primaries;   ## ←ここが重要
    #   after-sb-0pri disconnect; ←このあたりはポリシーで
    #   after-sb-1pri disconnect;
    #   after-sb-2pri disconnect;
    #   rr-conflict disconnect;
      }
      syncer {
        rate 300M;
        al-extents 257;
      }
      on node1 {
        device /dev/drbd0;
        disk /dev/mapper/VolGroup00-LogVol01;
        address 192.168.35.101:7788;
        meta-disk internal;
      }
      on node2 {
        device /dev/drbd0;
        disk /dev/mapper/VolGroup00-LogVol01;
        address 192.168.35.102:7788;
        meta-disk internal;
      }
    }

 ここから、DRBDのコマンドでリンクをおこないます。この手順もv0.7のときと変わりありません。

# insmod drbd
# drbdsetup /dev/drbd0 disk /dev/VolGroup00/LogVol01
# drbdsetup /dev/drbd0 net 192.168.35.101 192.168.65.102 C 
# drbdsetup /dev/drbd0 primary

状態を確認してすべて同期がとれたところで Primary にしてみてください。

# cat /proc/drbd
version: 8.0.1 (api:86/proto:86)
SVN Revision: 2784 build by root@localhost, 2007-03-26 00:49:26
 0: cs:Connected st:Primary/Primary ds:UpToDate/UpToDate C r---
    ns:20 nr:4 dw:24 dr:30340 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
        resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/257 hits:5 misses:0 starving:0 dirty:0 changed:0

LVM Clusterの起動

 ここまできましたら、ようやくLVMクラスタサービスを起動できます。このサービスはGFS2が使用するロック(DLM)サービスを提供してくれますので、かならず起動する必要があります。

# service clvmd start

GFS2 ファイルシステムの作成

 ここまで全て動作して、ようやくGFS2ファイルシステムを使用できます。以下のコマンドは例です。

# mkfs.gfs2 -p lock_dlm -t cluster1:drbd0 -j 2 /dev/drbd0

 順を追って説明します。

-pロックサービスは何を使用するか?(clvmdで起動してるので"lock_dlm")
-tクラスタ名とこのファイルシステムの一意な名前(クラスタは設定した"cluster1")
-jジャーナルの数(=GFSで接続する数:drbdは2台なので"2")

 エラーがでないで作成できたら、Primary/Primaryなことを確認して、おもむろに mount してみてください。両方からマウントできれば成功です。

# mount -t gfs2 /dev/drbd0 /opt

参考資料

追記

意外に、以下の設定に惑わされることが多いので、日本語訳マニュアル(β)から抜粋

  • pri-on-incon-degr-cmd command
    損傷モード(degr-wfc-timeout フラグがセットされている) のノードが起動して、かつその ローカルディスクのデータが不整合状態になっている場合、このオプションに指定した command が実行される。コマンドが正常に終了すると、(heartbeat の) drbddisk はこのDRBD デバイスをプライマリモードにしようとする。
  • on-io-error handler 下位デバイスが入出力エラーを返したときに実行するハンドラを指定する。 handler に指定できる値は、pass_on、call-local-io-error、またはdetach のどれか である。
    pass_on入出力エラーを上位レイヤに報告する。プライマリ側ではファイルシステムにエラーを伝える。セカンダリ側では何も報告しない
    call-local-io-errorハンドラスクリプトlocal-io-error を呼び出して実行する
    detach低レベルデバイスを切り離して、ディスクレスモードで処理を続行する

引用元: http://www.drbd.jp/files/drbd_doc/drbd.conf.pdf

コメント

まだ、ACT/ACTで安定して使えるかどうか分からないので、報告などがありましたらコメントください。

  • 本当は2ノードの場合は、cman_tool join に -2 オプションがあるので、drbdに多く見られる2ノードの場合はそれを指定したほうがいいかも・・・ -- みこ? 2007-04-02 (月) 14:13:38
    <?xml version="1.0"?>
      <cman two_node="1" expected_votes="1">
      </cman>
      <cluster name="cluster1" config_version="11">
        <clusternodes>
    :
    :
  • シャットダウン時は、順番(gfsのumount→drbdのsecoundary→clvmdサービス停止→cmanサービス停止)に気をつけておかないと、Split-Brain(記憶領域の分裂)を起こす可能性があるので、注意が必要。起動スクリプトでなんとかならないのかな? -- みこ? &new{2007-04-02 (月)
  • drbdadm -- --overwrite-data-of-peer primary r0 -- 2009-02-20 (金) 19:30:52

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White
Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes
Last-modified: Fri, 20 Feb 2009 01:30:55 HADT (559d)