LinuxでDRBDを設定する:KVM仮想マシン向け高可用性ストレージの構築

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

クイックスタート:5分で基本的なDRBDを設定する

午前3時、本番サーバーがディスク障害を報告した。チーム全員にアラートが届いた。幸いなことに、2週間前にDRBDを設定していたおかげで、自動フェイルオーバーが作動し、VMは稼働し続け、データも失わずに済んだ。この記事では、実際に行ったことをそのまま書き留める。

私はProxmox VEで12台のVMとコンテナを管理するホームラボを運用している。ここは本番環境に導入する前にあらゆるものをテストするための実験場だ。DRBDは本番環境に触れる前に最も念入りにテストしたものだ。

ラボ環境

  • node1: 192.168.1.10 (primary) — Ubuntu 22.04
  • node2: 192.168.1.11 (secondary) — Ubuntu 22.04
  • 各ノードにDRBD専用の20GBディスク/dev/sdbを追加

ステップ1:両方のノードにDRBDをインストール

# 両方のノードで実行
sudo apt update
sudo apt install drbd-utils -y

# カーネルモジュールをロード
sudo modprobe drbd
echo "drbd" | sudo tee -a /etc/modules

ステップ2:リソース設定ファイルを作成

両方のノードで同じ内容の/etc/drbd.d/kvm-storage.resファイルを作成する:

resource kvm-storage {
  protocol C;

  on node1 {
    device    /dev/drbd0;
    disk      /dev/sdb;
    address   192.168.1.10:7789;
    meta-disk internal;
  }

  on node2 {
    device    /dev/drbd0;
    disk      /dev/sdb;
    address   192.168.1.11:7789;
    meta-disk internal;
  }
}

ステップ3:DRBDの初期化と起動

# 両方のノードで実行
sudo drbdadm create-md kvm-storage
sudo drbdadm up kvm-storage

# NODE1のみで実行 — このステップは重要。ノードを間違えるとデータが失われる
sudo drbdadm primary --force kvm-storage

# 同期プロセスを監視
watch cat /proc/drbd

同期が完了すると、node1の/dev/drbd0がKVMのストレージとして使用可能になる。通常のディスクと同様にフォーマットしてマウントする:

# NODE1のみで実行
sudo mkfs.ext4 /dev/drbd0
sudo mkdir -p /var/lib/libvirt/images/drbd
sudo mount /dev/drbd0 /var/lib/libvirt/images/drbd

詳細解説:DRBDの仕組み

DRBD(Distributed Replicated Block Device)はカーネルレベルで動作し、仮想ブロックデバイス(/dev/drbd0)を作成して、すべての書き込み操作をTCPネットワーク経由で自動的に他のノードにミラーリングする。

rsyncやGlusterFSのようなファイルシステムレベルの同期と異なる点は、DRBDがファイルシステムへの書き込み前にブロックレベルでミラーリングすることだ。つまり、VMが書き込む内容は、raw disk I/Oも含めてすべて即座にレプリケートされる。

3つの同期プロトコル — 正しい選択が重要

  • プロトコルA(非同期):プライマリはローカルへの書き込み直後に確認を返し、セカンダリを待たない。最速だが、プライマリが突然クラッシュするとデータを失う可能性がある。
  • プロトコルB(半同期):プライマリはデータがセカンダリのバッファに到達してから確認を返す。パフォーマンスと安全性のバランスが取れている。
  • プロトコルC(同期):プライマリはセカンダリのディスク書き込みが完了してから確認を返す。最も安全で、私は本番環境でこれを使用している。多少のレイテンシの増加は受け入れている。

DRBDストレージを使用するVMの作成

sudo virt-install \
  --name ha-vm01 \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/drbd/ha-vm01.qcow2,size=15 \
  --os-variant ubuntu22.04 \
  --cdrom /tmp/ubuntu-22.04-server.iso \
  --network bridge=virbr0

応用編:Pacemakerによる自動フェイルオーバー

DRBDを単独で使用するだけでは「ウォームスタンバイ」に過ぎない——node1が落ちたら手動でnode2に切り替える必要がある。完全に自動化するには、Pacemaker + Corosyncとの組み合わせが必要だ。

PacemakerとCorosyncのインストール

# 両方のノード
sudo apt install pacemaker corosync pcs -y

# haclusterユーザーのパスワードを設定
sudo passwd hacluster

# NODE1のみ
sudo pcs host auth node1 node2 -u hacluster
sudo pcs cluster setup ha-kvm-cluster node1 node2
sudo pcs cluster start --all
sudo pcs cluster enable --all

PacemakerにDRBDリソースを設定

# ラボではSTONITHを無効化(本番環境では有効化してハードウェアフェンシングを設定する必要がある)
sudo pcs property set stonith-enabled=false

# DRBDリソースを作成
sudo pcs resource create drbd_res ocf:linbit:drbd \
  drbd_resource=kvm-storage \
  op monitor interval=30s

# プロモータブル設定(primary/secondary)
sudo pcs resource promotable drbd_res \
  master-max=1 master-node-max=1 \
  clone-max=2 clone-node-max=1 \
  notify=true

# ファイルシステムリソースを作成
sudo pcs resource create fs_res Filesystem \
  device=/dev/drbd0 \
  directory=/var/lib/libvirt/images/drbd \
  fstype=ext4

# 制約:fs_resはDRBDプライマリのノードのみで実行
sudo pcs constraint colocation add fs_res with Master drbd_res-clone
sudo pcs constraint order promote drbd_res-clone then start fs_res

設定完了後、node1がダウンした場合:Pacemakerが自動的にnode1のDRBDをデモートし、node2をプライマリに昇格させ、ファイルシステムをマウントしてVMを再起動する。全プロセスは通常30秒以内に完了する。

本番環境からの実践的なヒント

1. スプリットブレインの対処 — 最もストレスのある状況

スプリットブレインは、2つのノード間の接続が切れ、両方が自分をプライマリだと思い込む状況で発生する。初めてこれに遭遇したのは午前2時だった——本当に心臓がドキドキした。

# 状態を確認 — "StandAlone"または"SplitBrain"が表示されていれば問題あり
cat /proc/drbd

# 最新データを保持するノードを決定する。例:node1を保持
# NODE2(破棄するノード):
sudo drbdadm secondary kvm-storage
sudo drbdadm disconnect kvm-storage
sudo drbdadm -- --discard-my-data connect kvm-storage

# NODE1(保持するノード):
sudo drbdadm connect kvm-storage

警告--discard-my-dataはそのノードのすべてのデータを削除し、もう一方のノードから再同期する。このコマンドを実行する前に、確実に正しいノードを破棄していることを確認すること。

2. リアルタイムで状態を監視

# リアルタイムで状態を確認
watch -n2 drbdadm status

# すべて正常な場合の出力:
# kvm-storage role:Primary
#   disk:UpToDate
#   node2 role:Secondary
#     replication:Established peer-disk:UpToDate

# "Inconsistent"または"Outdated"が表示されている場合 — 同期中またはエラーあり
cat /proc/drbd

3. メンテナンス後の再同期を高速化

デフォルトでは、DRBDは本番I/Oへの影響を避けるために再同期帯域幅を制限している。メンテナンスウィンドウ後は、より速く同期するために帯域幅を増加させることが多い:

# 再同期速度を一時的に512MB/sに増加
sudo drbdadm disk-options --resync-rate=512M kvm-storage

# または/etc/drbd.d/global_common.confに固定設定
# disk {
#   resync-rate 512M;
# }

4. ファイアウォールルール — 忘れずに

# 2つのDRBDノード間の通信のみを許可
# node1で:
sudo ufw allow from 192.168.1.11 to any port 7789

# node2で:
sudo ufw allow from 192.168.1.10 to any port 7789

5. Proxmox Backup Serverとの組み合わせ

DRBDはハードウェア障害からは保護できるが、ヒューマンエラーからは守れない——VM内でファイルを誤削除すると、両方のノードで失われてしまう。私はDRBDとPBS(Proxmox Backup Server)を組み合わせることで、リアルタイムレプリケーションとポイントインタイムバックアップという2層の保護を実現している。このコンボのおかげでぐっすり眠れるようになった。

Share: