プロジェクト

全般

プロフィール

DRBDのインストール

DRBDとは

DRBDとは、2台以上のサーバを用いて、特定ストレージのパーティションをブロックレベルで同期する
といったソフトウェアのこと。Linuxベースのレプリケーションとしてよく用いられる。ファイルレベル
ではないため、ファイルのロック状況などに引きずられることがない。

プライマリサーバとセカンダリサーバをクロスケーブルなどで直結し、それをもとに2台のディスク同期
を行う。同期体系としてはアクティブスタンバイ方式であり、切替には手動オペレーションが必要となる。

セカンダリとなっているサーバはマウントすることが出来ないが、スナップショットを取ることが可能。
プライマリでサービスを継続しつつ、ミラーリングのフルバックアップを取ることが出来る。

レプリケーション領域を利用してデータベースやWebアプリケーション、ファイル共有などを動作させる
ことが主な用途となる。Heartbeat/Pacemakerを組み合わせ、IPアドレスやアプリケーションの起動など
を含めてアクティブスタンバイの自動切り替えを行うクラスタリング構成を取ることが多い。
(これについてはHeartbeat/Pacemaker別記とする

構成情報

今回は2ノード(サーバ2台)によるアクティブスタンバイで1パーティションを同期する構成を記載する。
サーバはNICを2つ持ち、片方をサービスLANとしてネットワークに通常接続し、もう一方をクロスケーブル
でレプリケーションを行うサーバと直結する。

インストール手順

  • リポジトリの追加
    # rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
    
  • パッケージのインストールと有効化
    # yum install drbd84* kmod-drbd84*
    
    # chkconfig drbd on
    or
    # systemctl enable drbd
    

設定ファイルの編集

  • /etc/drbd.d/r0.res
    • resource 任意のリソース名
    • protocol プロトコル種別。一般的にはC
      • A 非同期
      • B 半非同期(メモリ同期)
      • C 同期
    • device 任意のデバイス名。このデバイス名で動作する
    • meta-disk メタデータ格納先。ノード4台とかになるとexternalもあり得る
    • on "uname -n"で出力されるホスト名(登録ノード分すべて記載する)
      • 同期対象のIPアドレス(今回はクロス接続のもの)
      • disk 同期対象のパーティション
  • 構成例
    resource r0 {
      protocol C;
      device /dev/drbd0;
      meta-disk internal;
      on node1.local {
        address 192.168.0.1:7788;
        disk /dev/sda5;
      }
      on node2.local {
        address 192.168.0.2:7788;
        disk /dev/sda5;
      }
    }
    

初期設定

  • ホスト名の疎通確認
    設定ファイルの「on 〜」で記載した名称が名前確認できることを確認する。
    DNS登録が無い場合は、プライマリセカンダリのhostsファイルに記載すること。
  • /etc/hosts
    192.168.0.1   node1 node1.local
    192.168.0.2   node2 node2.local
    
  • 同期対象のパーティションのファイルシステムを破棄する
    ext4などのファイルシステムが存在する場合、初期化を受け付けないのでブランクディスク扱いにする。
    「/etc/fstab」などに登録がある場合も削除しておくこと。
    # umount /dev/sda5
    # dd if=/dev/zero of=/dev/sda5 bs=512 count=1024
    
  • DRBD領域を初期化する
    # drbdadm create-md r0
    
  • こんな感じで作成できること
    initializing activity log
    NOT initializing bitmap
    Writing meta data...
    New drbd meta data block successfully created.
    success
    
    • ホスト名などが間違っていても、リソース名 r0 に誤りがあるとしか言われないので注意。
  • 両系統でここまで完了してからサービス開始
    # systemctl start drbd
    or
    # service drbd start
    
    WARN: nothing stacked for this host (node1.local), nothing to do in stacked mode!
    このメッセージは2ノード以下でサービスを手動起動すると表示される。
    
  • プライマリの有効化(プライマリ側で実施)
    確認コマンドで左側がPrimaryかつUpToDateとなっていること。
    # drbdadm -- --overwrite-data-of-peer primary r0
    
    # drbd-overview 
     0:r0/0  Connected Secondary/Secondary Inconsistent/Inconsistent 
    
  • 初期同期が終わるまでしばらく待つ
    当然だが初回は全ブロック参照するので、ディスクサイズ次第で尋常じゃない時間がかかるので注意。
    # drbd-overview
     0:r0/0  SyncSource Primary/Secondary UpToDate/Inconsistent /data ext4 990M 1.3M 938M 1%
            [===============>....] sync'ed: 80.1% (209628/1046144)K
    
    • 「watch -n 1 cat /proc/drbd」などで常時モニタすることも出来る
    • StandAloneとなっている場合はスプリットブレイン(異常非同期)になっているため手動復旧が必要。
      これ自体は「よく起きること」くらいの想定はしていた方が良い。しかも非常にクリティカルな事象なので。

基本動作

  • ファイルシステムの作成とマウント(プライマリ側で操作)
    # drbdadm primary r0
    # mkfs.ext4 /dev/drbd0
    # mount /dev/drbd0 /path/to
    
    • プライマリ側でのみマウントおよび操作を行い、セカンダリ側はマウントしないこと。
  • アクティブノードの切替(プライマリ側で操作)
    # umount /dev/drbd0
    # drbdadm secondary r0
    # drbd-overview
     0:r0/0  WFConnection Secondary/Unknown UpToDate/DUnknown 
    (例ではコネクションが切れているので注意)
    
    • あとはセカンダリ側でマウントするなど
    • セカンダリ側でprimary指定を発行してもいい(その機会の方がおそらく多い