がらくたネット


DRBD

DRBD

drbdはOSSなディスクミラーリングソフト

  • ネットワーク越しにブロックデバイスをミラーリングできる
  • Primary/Secondary構成(HA用FileSystemを利用するとPrimary/Primaryが出来るそうだ!)

覚書

DRBD関連の覚書

セカンダリからプライマリへの切替をプロモーション(promotion)、プライマリからセカンダリへの切替をデモーション(demotion)と呼ぶ。
pacemakerのcrmコマンドのresourceディレクティブでも出てくる。テストに出ます。(笑

状態確認

drbd-overview 設定されているDRBDリソース全てが一覧表示される

drbd-overview
  0:home                 Connected Primary/Secondary   UpToDate/UpToDate C r--- /home        xfs  200G 158G 43G  79%
  1:data                 Connected Primary/Secondary   UpToDate/UpToDate C r--- /mnt/ha1     ext3 9.9G 618M 8.8G 7%
  2:nfs-root             Connected Primary/Secondary   UpToDate/UpToDate C r--- /mnt/netboot ext3 79G  57G  19G  76%

/proc/drbdの確認

cat /proc/drbd

  • cs (接続状態). ネットワーク接続の状態。
  • ro (ロール). ノードのロール。 最初にローカルノードのロールが表示され、 スラッシュの後に対向ノードのロールが表示されます。
  • ds (ディスク状態). ハードディスクの状態。 スラッシュの前にローカルノードの状態、 スラッシュの後に対向ノードのハードディスクの状態が表示されます。
  • ns (ネットワーク送信). ネットワーク接続を介して対向ノードに送信された 正味データの量(単位はKibyte)。
  • nr (ネットワーク受信). ネットワーク接続を介して対向ノードが受信した 正味データの量(単位はKibyte)。
  • dw (ディスク書き込み). ローカルハードディスクに書き込まれた 正味データ(単位はKibyte)。
  • dr (ディスク読み取り). ローカルハードディスクから読み取った 正味データ(単位はKibyte)。
  • al (アクティビティログ). メタデータのアクティビティログ領域の更新の数。
  • bm (ビットマップ). メタデータのビットマップ領域の更新の数。
  • lo (ローカルカウント). DRBDが発行したローカルI/Oサブシステムに対するオープン要求の数。
  • pe (保留). 対向ノードに送信されたが、対向ノードから応答がない要求の数。
  • ua (未確認). ネットワーク接続を介して対向ノードが受信したが、応答がない要求の数。
  • ap (アプリケーション保留). DRBDに転送されたが、DRBDが応答していないブロックI/O要求の数。
  • ep (エポック). エポックオブジェクトの数。 通常は 1。 barrierまたはnone 書き込み順序付けメソッドを使用する場合は、 I/O負荷により増加する可能性があります。 8.2.7以降。
  • wo (書き込み順序付け). 現在使用されている書き込み順序付けメソッド。 b (バリア)、f (フラッシュ)、 d (ドレイン)またはn (なし)。 8.2.7 以降。
  • oos (非同期). 現在、同期していないストレージの量(単位は Kibibyte)。 8.2.6 以降。

ディスク状態の確認

drbdadm dstate

  • Diskless. DRBDドライバにローカルブロックデバイスが割り当てられていません。 原因として、リソースが下位デバイスに接続されなかった、 drbdadm detachを使用して手動でリソースを切り離した、 または下位レベルのI/Oエラーにより自動的に切り離されたことが考えられます。
  • Attaching. メタデータ読み取り中の一時的な状態です。
  • Failed. ローカルブロックデバイスがI/O障害を報告した後の一時的な状態です。 次の状態はDisklessです。
  • Negotiating. すでに接続されているDRBDデバイスで接続が実行された場合の一時的状態です。
  • Inconsistent. データが一致しません。 新規リソースを作成した直後に(初期フル同期の前に)両方のノードがこの状態になります。 また、同期中には片方のノード(同期先)がこの状態になります。
  • Outdated. リソースデータは一致していますが、期限切れです。.
  • DUnknown. ネットワーク接続を使用できない場合に、 対向ノードディスクにこの状態が使用されます。
  • Consistent. 接続していない状態でノードのデータが一致しています。 接続が確立すると、データがUpToDateかOutdatedか判断されます。
  • UpToDate. データが一致していて、最新の状態です。 これが正常な状態です。

リソースのロール確認

drbdadm role resource name

  • Primary. 現在、リソースはプライマリロールで読み書き可能です。 2つのノードの一方だけがこのロールになることができます。 ただし、デュアルプライマリモードが 有効な場合は例外です。
  • Secondary. 現在、リソースがセカンダリロールです。 対向ノードから正常に更新を受け取ることができますが(切断モード以外の場合)、 このリソースに対して読み書きは実行できません。 1つのノードまたは両方のノードがこのロールになることができます。
  • Unknown. 現在、リソースのロールが不明です。 ローカルリソースロールがこの状態になることはありません。 これは、切断モードの場合にのみ、 対向ノードのリソースロールだけに表示されます。

リソースの接続状態確認

drbdadm cstate resource name

  • StandAlone. ネットワーク構成は使用できません。 リソースがまだ接続されていない、 管理上の理由で切断されている(drbdadm disconnectを使用)、 認証の失敗またはスプリットブレインにより接続が解除された、 のいずれかが考えられます。
  • Disconnecting. 切断中の一時的な状態です。次の状態はStandAloneです。
  • Unconnected. 接続を試行する前の一時的な状態です。 次に考えられる状態は、WFConnectionおよびWFReportParamsです。
  • Timeout. 対向ノードとの通信のタイムアウト後の一時的な状態です。 次の状態はUnconnectedです。
  • BrokenPipe. 対向ノードとの接続が失われた後の一時的な状態です。 次の状態はUnconnectedです。
  • NetworkFailure. 対向ノードとの接続が失われた後の一時的な状態です。 次の状態はUnconnectedです。
  • ProtocolError. 対向ノードとの接続が失われた後の一時的な状態です。 次の状態はUnconnectedです。
  • TearDown. 一時的な状態です。対向ノードが接続を閉じました。 次の状態はUnconnectedです。
  • WFConnection. 対向ノードノードがネットワーク上で可視になるまでノードが待機します。
  • WFReportParams. TCP (伝送制御プロトコル)接続が確立され、 ノードが対向ノードからの最初のネットワークパケットを待っています。
  • Connected. DRBDの接続が確立され、データミラー化がアクティブになっています。 これが正常な状態です。
  • StartingSyncS. 管理者が開始するフル同期が開始しました。 次に考えられる状態はSyncSourceまたはPausedSyncSです。
  • StartingSyncT. 管理者が開始するフル同期が開始しました。 次の状態はWFSyncUUIDです。
  • WFBitMapS. 部分同期を開始しました。 次に考えられる状態はSyncSourceまたはPausedSyncSです。
  • WFBitMapT. 部分同期を開始しました。 次に考えられる状態はWFSyncUUIDです。
  • WFSyncUUID. すぐに同期を開始します。 次に考えられる状態はSyncTargetまたはPausedSyncTです。
  • SyncSource. 現在、ローカルノードを同期元にして同期を実行中です。
  • SyncTarget. 現在、ローカルノードを同期先にして同期を実行中です。
  • PausedSyncS. ローカルノードが進行中の同期の同期元ですが、 現在は同期が一時停止しています。 原因として、別の同期プロセスの完了との依存関係、 またはdrbdadm pause-syncを使用して 手動で同期が中断されたことが考えられます。
  • PausedSyncT. ローカルノードが進行中の同期の同期先ですが、 現在は同期が一時停止しています。 原因として、別の同期プロセスの完了との依存関係、 またはdrbdadm pause-syncを使用して 手動で同期が中断されたことが考えられます。
  • VerifyS. 現在、ローカルノードを照合元にして、 オンラインデバイスの照合を実行中です。
  • VerifyT. 現在、ローカルノードを照合先にして、 オンラインデバイスの照合を実行中です。

スプリットブレインからの回復

Split-Brain detected, dropping connection! がーん。
シスログにこれが出たらスプリットブレインです。回復処理しましょ。

1つのノードはStandAloneになる。他方はStandAlone(同時にスプリットブレインを検出した場合)かWFConnection(スプリットブレイン検出前に対抗ノードが切断した場合)になる。

内容を破棄する側のノード上で
drbdadm secondary resource 
drbdadm -- --discard-my-data connect resource
 
残す方で
drbdadm connect resource
 
破棄側ノード(犠牲ノードと呼ぶ)の接続状態がSyncTargetになって同期される

インストール

CentOS 5.2でのインストール
簡単にyumでやってしまった

# yum install -y drbd82 kmod-drbd82

drbd用のディスクを用意する
ここではsdbを追加した

  • fdisk /dev/sdbで基本パーティション1を作成、全領域を確保
  • 領域タイプをLinux LVM(8e)に変更

/etc/drbd.confを設定する

resource r0 {
        protocol A;
        on test03 {
                device  /dev/drbd0;
                disk    /dev/sdb1;
                address 192.168.1.3:7789;
                meta-disk       internal;
        }
        on test04 {
                device  /dev/drbd0;
                disk    /dev/sdb1;
                address 192.168.1.4:7789;
                meta-disk       internal;
        }
}

  1. on <ホスト名>箇所はuname -nで表示されるホスト名に合わせる必要あり
  2. protocolは条件により修正する

drbdadmでmeta-disk情報を書き込み

# drbdadm create-md r0

drbdサービス起動

# /etc/init.d/drbd start
Primary側を起動するとSecondary側のレスポンスを待つのでyesで答えて終了しておく

Primary側のdrbdディスクをPrimaryとして設定
起動直後はSecondaryとして設定されるため

# drbdadm -- -o primary r0

ファイルシステムの作成とかマウントとか

# mke2fs -j /dev/drbd0
# mkdir /mnt/drbd0
# mount /dev/drbd0 /mnt/drbd0

テスト

drbdadm primary <リソース名>リソース名をプライマリに変更
drbdadm secondary <リソース名>リソース名をセカンダリに変更

切り替わりのテストをする

だいたいnfsとかで利用していると思うのでnfs利用シーンを想定
mountしていると具合が悪くなるのでunmountする
そしてPrimaryをSecondaryに降格させ、Secondary側をPrimaryにする
Secondary側でmountしてデータ更新してから元に戻す

HA

DRBD8.0以降+OCFS2インストール
DRBDは既にインストール済みとする

# rpm -ihv ocfs2-tools-1.4.1-1.el5.i386.rpm
# rpm -ihv ocfs2-2.6.18-92.1.18.el5-1.4.1-1.el5.i686.rpm
# rpm -ihv ocfs2console-1.4.1-1.el5.i386.rpm
ocfs2consoleにはvteパッケージが必要!
GUIを利用しないのであれば、ocfs2consoleは不要だな…

disk追加、今回は/dev/sdcとする
今回はLVM2で作成するとする

# pvcreate /dev/sdc
# vgcreate <VG名> /dev/sdc
# vgdisplayで作成されている事を確認、PE数を確認
# lvcreate -l 割当PE数 -n <LV名> <VG名>
# lvdisplayで作成されている事を確認
# ls /dev/<VG名>でデバイスファイルが作成されている事を確認する

今回はデバイスファイルを/dev/VG/OCFS2とし、resource名をr1とした

drbd.confに以下を追加!

resource r1 {
        protocol C; ←これ味噌!allow-two-primariesでは必須!
        net {
                allow-two-primaries; ←これが味噌!
        }
        on test-vm03.hyperdc.net {
                device  /dev/drbd1;
                disk    /dev/VG/OCFS2;
                address 122.213.181.233:7790; ←既に7789でresorceを定義しているので変えちゃった!
                meta-disk       internal;
        }
        on test-vm04.hyperdc.net {
                device  /dev/drbd1;
                disk    /dev/VG/OCFS2;
                address 122.213.181.234:7790; ←既に7789でresorceを定義しているので変えちゃった!
                meta-disk       internal;
        }
}

メタデータを作成

# drbdadm create-md r1
v08 Magic number not found
v07 Magic number not found
v07 Magic number not found
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.

                --== Creating metadata ==--
As with nodes, we count the total number of devices mirrored by DRBD at
at http://usage.drbd.org.

The counter works anonymously. It creates a random number to identify
the device and sends that random number, along with
DRBD's version number, to usage.drbd.org.

http://usage.drbd.org/cgi-bin/insert_usage.pl?nu=13290440062039590897&ru=6760633064383941882&rs=2143289344

* If you wish to opt out entirely, simply enter 'no'.
* To continue, just press [RETURN]

success

  1. drbdを再起動
  2. procのdrbdを表示させて状態を確認する
  3. primaryにして同期完了を待つ

# service drbd restart
# cat /proc/drbd
# drbdadm adjust r1
# drbdadm primary r1 -o

同期が完了したら他方でも
# drbdadm primary r0
を実行する、両Primaryが完成

drbdadm primaryを実行すると
/dev/drbd0: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk
Command 'drbdsetup /dev/drbd0 primary' terminated with exit code 17
って怒られる件

強制的にprimaryにするおまじない!
# drbdadm -- --overwrite-data-of-peer primary all
これで同期が始まる
# cat /proc/drbd
# drbdadm cstate r0
# drbdadm state r0
とかね

# mkdir /etc/ocfs2
# cd /etc/ocfs2
# vi cluster.conf

# service o2cb load
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading filesystem "ocfs2_dlmfs": OK
Creating directory '/dlm': OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK

# service o2cb online ocfs2
Starting O2CB cluster ocfs2: OK

cluster.conf

node:
各ノードの情報を設定します。
‐ip_port: 通信するポート
‐ip_address: ノードのIPアドレス
‐number: 0からの通番。ノード毎に加算。
‐name: ノードのホスト名
‐cluster: クラスタ名

cluster:
クラスタで共通の情報を設定します。
‐node_count : ノード数
‐name: クラスタ名。node: で指定しているclusterと同一です。


node:
 ip_port = 7777
 ip_address = 192.168.222.3
 number = 0
 name = o2host1
 cluster = ocfs2

node:
 ip_port = 7777
 ip_address = 192.168.222.4
 number = 1
 name = o2host2
 cluster = ocfs2

cluster:
 node_count = 2
 name = ocfs2

もう片方も同じように実施

drbd1デバイスをOCFS2でフォーマットする
フォーマットはDRBDで同期されているので片側のみでOK
マウント時はファイルタイプをocfs2とする
マウントは両サーバーで実施

# mkfs.ocfs2 /dev/drbd1
mkfs.ocfs2 1.4.1
Cluster stack: classic o2cb
Filesystem label=
Block size=4096 (bits=12)
Cluster size=4096 (bits=12)
Volume size=2143186944 (523239 clusters) (523239 blocks)
17 cluster groups (tail covers 7143 clusters, rest cover 32256 clusters)
Journal size=67108864
Initial number of node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 1 block(s)
Formatting Journals: done
Formatting slot map: done
Writing lost+found: done
mkfs.ocfs2 successful
 
# mount -t ocfs2 /dev/drbd1 <マウントポイント>