drbdを復旧(再同期)させるメモ

※ 整理した情報ではなく、ad hocに試したことをメモ書き。なので結構怪しいです。

  • version: 0.7.25 (api:79/proto:74)


slave側が落ちて、heartbeat、drbdを再起動してもstatusが戻らない状態からの復旧メモ。以下"all"となっているresourceは各自の環境ごとにr0,drbd0 などに読み替える。resourceが1つならallでもいいけど。

とりあえずやってみる

slave側で。

## status再確認  cat /proc/drbdでもいい
drbdadm state all
drbdadm cstate all

## drbd 切断/接続
drbdadm down all
drbdadm up all

## status再確認
drbdadm state all
drbdadm cstate all

cstateがConnection、stateがSecondary/PrimaryになってたらOK。単にsecondary側のサーバが死んでただけ(standaloneになって書き込みしてないとか)の場合、これだけで復旧するかも。
(起動スクリプトでdrbdが起動した時点で直ってる可能性も十分あり)

drbdのstatusについて

cat /proc/drbdかdrbdadm state、drbdadm cstateなどで確認する。

drbdadm state all
  • 正常:
    • Secondary/Primary
    • Primary/Secondary
  • 異常:
    • Secondary/Secondary
    • Primary/Unknown
    • Secondary/Unknown
drbdadm cstate all
  • 正常:
    • Connected
  • 異常:
    • StandAlone
  • 待機状態
    • WFConnection
    • 一度何かで切断された状態?おそらくdrbdadm connect allとかで直るはず

drbd 復旧

secondary側で

drbdadm invalidateはdrbdが非同期になったことを判断させるコマンド。
(drbdadm attach allは不要かも)

drbdadm down all
drbdadm attach all
drbdadm invalidate all
drbdadm up all
drbdadm connect all
primary側で
  • status確認
drbdadm cstate all
  • 再接続
drbdadm connect all

SyncSourceになって同期が始まればOK。
こんな感じ?

同期する速度が遅い問題

drbd.conf にsyncer を

syncer {
  rate 100M;
}

こんな風に設定していても、再同期の速度が ひどく遅いときがある。どうも再同期している時に(?) syncer の設定を読んでなくて、default の設定で同期されているようなので設定を反映させる。primary、secondary 両方で以下のコマンド実行。

drbdadm adjust all

20091228 追記

適当にメモった割には、参考にしてくださっている人がいて大変恐縮です。(記憶が定かではないですが)このエントリを書いた経緯は実際に障害が起きたときのメモではなく、構築中のサーバで意図的にdual masterな状態を発生させて、その後どうやって直せばいいのかを確認してなんとなく書いてたような気がします。ですが、参考になったとコメント頂いてるので、この方法で概ね問題はないかなーと思ってます。

あと、DRBDユーザーズガイドにもスプリットブレイン(両ノードがプライマリになってしまう)からの回復手順が書いてあるので、ここも参考になるかと思います。

DRBDユーザーズガイド: スプリットブレインからの手動回復

  • 変更データを破棄したいサーバ (セカンダリにしたいサーバ)
drbdadm secondary resource 
drbdadm -- --discard-my-data connect resource
  • 生存ノード (プライマリにしたいサーバ)
drbdadm connect resource