DRBD を CentOS 6 系でインストールして設定する方法
概要(1行定義)
DRBD: ネットワーク経由でブロックデバイスをレプリケーションするソフトウェア(共有ディスク不要のミラーリング)。
重要: 本手順は CentOS/Red Hat/Oracle Linux 6 系向けです。DRBD のバージョンやカーネルに依存するため、別バージョンでは一部コマンドやパッケージ名が異なる場合があります。
目的と前提
- 目的: サーバ A(OEL641)上で作成したファイルをサーバ B(OEL642)へ DRBD でミラーする。最終的に片方を Primary、もう片方を Secondary に切り替えてマウントして動作確認する。
- 前提: 各サーバに空きのブロックデバイス(例: /dev/sdb)があること。root 権限で操作できること。両ノード間で TCP 接続(ポート 7799 を使用)が可能であること。
目次
- 1 事前メモ
- 2 インストール手順
- 3 検証(モジュールの読み込み、ホスト名確認)
- 4 パーティション作成
- 5 DRBD 設定ファイル作成と初期化
- 6 テスト(フォーマット・同期・切替)
- トラブルシュートと注意点
- 代替アプローチと運用ヒント
- ロール別チェックリスト、簡易ランブック
- 用語集(1行)
- 要約
1 事前メモ
- 本チュートリアルの実行環境は CentOS 6.4(32ビット)を例にしていますが、基本概念は同系 OS 全般に適用できます。
- DRBD の公式サイト: http://www.linbit.com/ (参照用)
- ネットワークアドレス例: OEL641 = 192.168.43.101、OEL642 = 192.168.43.102
- 使用ブロックデバイス: /dev/sdb → /dev/sdb1 を DRBD 用に使用
2 インストールフェーズ
まずはシステムを更新し、ビルドに必要な依存パッケージを両方のサーバでインストールします。ここでは yum を使用しています。
yum -y update
yum -y install gcc make automake autoconf libxslt libxslt-devel flex rpm-build kernel-devel
出力例(パッケージが既に最新の場合):
Setting up Install Process
Package gcc-4.4.7-3.el6.i686 already installed and latest version
Package 1:make-3.81-20.el6.i686 already installed and latest version
Package automake-1.11.1-4.el6.noarch already installed and latest version
Package autoconf-2.63-5.1.el6.noarch already installed and latest version
Package libxslt-1.1.26-2.0.2.el6_3.1.i686 already installed and latest version
Package libxslt-devel-1.1.26-2.0.2.el6_3.1.i686 already installed and latest version
Package flex-2.5.35-8.el6.i686 already installed and latest version
Package rpm-build-4.8.0-32.el6.i686 already installed and latest version
Package kernel-devel-2.6.32-358.el6.i686 already installed and latest version
このステップは両ノードで実行します。
次に DRBD をソースからビルドします。ビルド用の RPM ディレクトリを作成します。
mkdir -p /root/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
DRBD のソースパッケージをダウンロードします(例: drbd-8.4.7 と drbd-utils)。
wget http://oss.linbit.com/drbd/drbd-utils-latest.tar.gz http://oss.linbit.com/drbd/8.4/drbd-8.4.7-1.tar.gz
展開してビルドします(例示はバージョン番号に依存します)。
tar -zxvf drbd-8.4.7-1.tar.gz
tar -zxvf drbd-utils-latest.tar.gz
cd drbd-8.4.7-1
# カーネルモジュールの RPM を作成
make km-rpm
出力により /root/rpmbuild/RPMS/i686 以下に drbd-km 系の RPM が生成されます。
続いて drbd-utils 側をビルドします。
cd ..
cd drbd-utils-8.9.6
./configure
make rpm
ビルド完了後、生成された RPM をまとめてインストールします。
cd /root/rpmbuild/RPMS/i686
rpm -Uvh drbd-xen* drbd-udev* drbd-pacemaker* drbd-bash-completion* drbd-utils-*.rpm drbd-km-*.rpm drbd-8*
出力例:
Preparing... ########################################### [100%]
1:drbd-utils ########################################### [ 13%]
2:drbd-xen ########################################### [ 25%]
3:drbd-udev ########################################### [ 38%]
4:drbd-pacemaker ########################################### [ 50%]
5:drbd-bash-completion ########################################### [ 63%]
6:drbd ########################################### [ 75%]
7:drbd-km-2.6.32_358.el6.########################################### [ 88%]
8:drbd-km-debuginfo ########################################### [100%]
この一連の手順を両方のサーバで行ってください。まずは OEL641 にて実施し、その後 OEL642 に対して同様に準備します。
3 検証フェーズ
まずはホスト名を確認します。DRBD の設定ファイルではホスト名が使われます。
uname -n
期待値(例):
OEL641
DRBD カーネルモジュールを読み込み、lsmod で確認します。
modprobe drbd
lsmod | grep drbd
出力例:
drbd 341783 0
libcrc32c 841 1 drbd
4 パーティション作成
ここでは /dev/sdb をパーティション化して /dev/sdb1 を作ります(両ノードで同様の構成である必要があります)。
fdisk -l
fdisk を使って /dev/sdb にパーティションを作成します。
fdisk /dev/sdb
# 対話で: n -> p -> 1 -> デフォルト開始 -> デフォルト終了 -> w
出力例:
Device Boot Start End Blocks Id System
/dev/sdb1 1 130 1044193+ 83 Linux
パーティションテーブルをリロードし、/dev/sdb1 が存在することを確認します。
これを OEL642 側でも繰り返してください。
5 DRBD 設定
DRBD のリソース定義ファイルを /etc/drbd.d/ に作成します。両ノードで同一の s1.res を持つようにします。
cd /etc/drbd.d/
vi s1.res
s1.res の中身(例):
resource s1 {
on OEL641 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.43.101:7799;
meta-disk internal;
}
on OEL642 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.43.102:7799;
meta-disk internal;
}
}
作成した s1.res を第二ノードへ転送します:
scp /etc/drbd.d/s1.res root@OEL642:/etc/drbd.d/s1.res
次にメタデータを作成します(両ノードで実行)。
drbdadm create-md s1
出力例:
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success
どちらのノードでも上記が正常に出れば OK です。
6 DRBD 起動と初期同期
まず一方(OEL641)で DRBD を起動してみます。起動スクリプトはリモートノードの応答を待つ設定になっていることがあります。
/etc/init.d/drbd status
/etc/init.d/drbd start
出力には「待機(wait for connection)」やリソース作成メッセージが表示されます。もし待機状態で止まる場合は、もう一方のノード(OEL642)でも同様に /etc/init.d/drbd start を実行してください。両方起動すると接続が確立します。
DRBD の状態確認:
/etc/init.d/drbd status
接続状態の例:
1:s1 Connected Secondary/Secondary Inconsistent/Inconsistent C
次に初期プライマリを OEL641 にして同期を開始します(すべてのデータを OEL641 のものに上書きする意図)。
drbdadm -- --overwrite-data-of-peer primary s1
/etc/init.d/drbd status
状態表示例(同期中):
... sync'ed: 0.8% (1037872/1044124)K
1:s1 SyncSource Primary/Secondary UpToDate/Inconsistent C
OEL642 側を確認すると SyncTarget(受信側)になっているはずです。
7 テストフェーズ(フォーマット、マウント、データ同期確認)
以降の手順はまず OEL641(Primary)で実施します。
- DRBD デバイスをファイルシステムでフォーマット
mkfs.ext3 /dev/drbd1
- マウントポイントを作成してマウント
mkdir /folderA
mount /dev/drbd1 /folderA
df -h
- フォルダ内に 30MB のテストファイルを作成
cd /folderA/
dd if=/dev/zero of=/folderA/testfile bs=1M count=30
ls -lh
- /folderA を umount して OEL641 を Secondary に切替
umount /folderA
drbdadm secondary s1
/etc/init.d/drbd status
- OEL642 を Primary にしてマウント
# OEL642 で実行
mkdir /folderB
drbdadm primary s1
mount /dev/drbd1 /folderB
df -h
ls -lh /folderB/
期待結果: /folderB に OEL641 で作成した testfile が存在すること。
成功すれば、DRBD によるブロックレベルの複製が動作していることを確認できます。
トラブルシュート(よくある問題と確認手順)
重要: 操作は必ず双方向で行ったこと、またバックアップがない場合は –overwrite-data-of-peer を軽率に使わないでください。
- 接続が確立しない(Connected にならない)
- ネットワーク疎通を確認: ping、telnet 192.168.43.102 7799(ポート到達性)
- ファイアウォール: iptables や firewalld がポート 7799 を遮断していないか
- s1.res のホスト名と uname -n の一致を確認
- drbdadm create-md が失敗する
- 指定した disk (/dev/sdb1) が存在するか、パーティションが正しいか
- 既存のメタデータやパーティションスキームが残っていないか(必要なら wipe)
- 起動時に “wait for connection” で永遠に待つ
- 片方が既に degraded(切断)状態ではないか。双方で /etc/init.d/drbd status を確認
- タイムアウト設定(degr-wfc-timeout, wfc-timeout)を確認・調整
- 同期が非常に遅い
- ネットワーク帯域、MTU、NIC エラーを確認
- disk IO がボトルネックか確認(iostat, vmstat)
失敗時の安全な切り戻し手順(簡易)
- 片側を誤って primary にした場合: 直ちにマウント解除して secondary に戻す
- 両ノードで状態が不整合な場合: 片方を –overwrite-data-of-peer オプションで primary にして同期を強制する(データ上書きの危険あり)。運用ガイドラインに基づき実行すること。
代替アプローチと拡張
- 最新のディストリビューションやカーネルを使う場合: DRBD の配布バージョンが異なるため、公式パッケージ(epel/linbit リポジトリ)やカーネルモジュールの互換性を優先してください。
- 高可用性クラスタとして使う場合: Pacemaker と組み合わせてフェイルオーバーを自動化する。drbd-pacemaker パッケージを利用する。
- ブロックデバイスではなくファイル単位でのレプリケーションが目的であれば、rsync や GlusterFS、Ceph など別ソリューションを検討してください。
運用のためのメンタルモデル(ヒューリスティック)
- DRBD は「ブロックレベルのリアルタイムミラーリング」。アプリケーションレベルの整合性は上位層(ファイルシステム、DB のレプリケーション)で担保する。
- Primary は I/O を受け付けて変更を発生させるノード。Secondary はあくまで複製受け取り側。
- ネットワーク切断時は双方が secondary になり得る(split-brain に注意)。
ロール別チェックリスト
管理者(インストール前)
- OS バージョン、カーネルバージョンを記録
- 空きブロックデバイスの確保
- ネットワーク設計(固定 IP、ルーティング、ファイアウォール)確定
運用担当(導入時)
- s1.res を両ノードに配置し整合性を確認
- drbdadm create-md を両ノードで実行
- 起動・同期のログを監視(/var/log/messages 等)
運用担当(フェイルオーバー/スイッチ)
- 切り替え前は必ず umount してから drbdadm primary/secondary を実行
- 自動化する場合は Pacemaker 等でフェイルオーバー手順を検証
簡易インシデントランブック(手順)
- 発見: DRBD 接続が切れた / I/O エラーを検知
- 確認: /etc/init.d/drbd status、dmesg、ネットワーク疎通
- 修復: ネットワーク修復、必要なら両ノードで再度 create-md(最終手段)
- 同期: 状態が戻ったら同期を確認してサービスを復旧
意思決定フローチャート(簡易)
flowchart TD
A[DRBD 状態異常を検知] --> B{ネットワーク到達可能か}
B -- yes --> C{drbd status が Connected か}
B -- no --> D[ネットワーク設定とファイアウォールを修正]
C -- yes --> E[ログを確認し I/O エラーを解析]
C -- no --> F[両ノードで /etc/init.d/drbd start を試す]
F --> G{still not Connected}
G -- yes --> H[詳細ログでエラー原因を特定]
G -- no --> I[同期を監視して運用復旧]
1行用語集
- DRBD: ネットワーク越しにブロックデバイスを複製するソフトウェア。
- Primary/Secondary: ブロックデバイスへの書き込みを許可する側が Primary。
- drbdadm: DRBD の管理コマンド。
- s1.res: リソース定義ファイルの例名称。
注意点とベストプラクティス
- 実運用では DRBD のバージョンとカーネルの互換性を事前に検証してください。
- split-brain を避けるために quorum や fencing(フェンシング)戦略を検討すること。
- 重要データは常にバックアップを残すこと。DRBD はミラーリングを提供するが代替のバックアップにはならない。
要約
- 本ガイドは CentOS/Red Hat/Oracle Linux 6 系で DRBD をソースからビルドし、2ノード間でブロックデバイスを複製する手順を示しました。
- 主な流れ: 依存パッケージのインストール → DRBD のビルドと RPM インストール → パーティション作成 → s1.res の作成 → drbdadm create-md → 起動と同期 → フォーマット、マウント、データ同期の検証。
- トラブルシュート、代替案、運用チェックリスト、簡易ランブック、意思決定フローを付録として提供しました。
重要: 本手順を本番環境で適用する前に、テスト環境で十分な検証を行ってください。運用ポリシーに従い、バックアップとフェイルオーバー計画を策定してください。
追加参照(公式)
- LINBIT (DRBD) 公式サイト: http://www.linbit.com/