DR環境でパフォーマンスの維持する

DRBDは相手のノードとデータの同期を取りつつ動作します。そのため、相手のノードからの応答が遅いと、アクティブノード(Primaryノード)のパフォーマンスも低下します。そうした問題を防止するためのDRBDの一時的同期停止機能について、今回のブログで解説します。

DR環境での速度低下の原因

DR環境ではDRBDの通信がWAN経由になるため、ネットワークの遅延が発生してDRBD同士の通信も遅くなります。この影響を防ぐために、非同期の通信をDRBDはサポートしています。そのパラメータが通信プロトコルと呼ばれるものです。

DRBDの通信プロトコルは、「A」、「B」、「C」の3つが存在します。

  • A:DRBDから相手のノードにデータを送信したら、次のデータの処理を開始(非同期)
  • B:DRBDから相手のノードにデータが届いたら、次のデータの処理を開始(非同期)
  • C:DRBDから相手のDRBDにデータが届いたら、次のデータの処理を開始

LAN接続されたDRBD同士の通信はほぼ遅延が発生しないため、プロトコルCの利用が推奨されます。一方、遅延の多いWAN環境での接続では、プロトコルAが推奨されます。

しかし、プロトコルAの通信でも相手のノードとの間の通信が詰まってしまうと、次のデータを処理できず、アプリケーションから見るとストレージへのアクセスが極端に遅くなるように感じます。

解決方法

DRBDには設定した閾値を超えると、DRBDはスタンバイノードとの通信を一時的に切断する機能があります。これにより、アクティブノードは単独で動作することができ、書き込み速度の低下を解消できます。

データの書き込みが終了した後、ノード間の通信を回復すると、DRBDは再同期を開始します。そして、通信が切れていた間に更新されたアクティブノード側のデータをスタンバイ側に同期します。

これを自動で行う設定が on-congestion pull-aheadcongestion-fill です。以下に設定例を紹介します。

net {
    protocol A;
    on-congestion pull-ahead;
    congestion-fill 131072; #128M;
}

on-congestion pull-ahead を利用するためにはプロトコルをAに設定する必要があります。一方、congestion-fill は通信バッファの閾値となります。この値はシステムの構成により値は変わりますが、初期設定として128M を指定して、テストを通じて適切な値を決めることを薦めます。

テスト方法

ディスクベンチマークなどを実行しながら、/var/log/messagesのDRBDのログを監視します。以下のログはアクティブノードのデータの更新がCongestion-fillの閾値を超えたため、DRBDがスタンバイノード(node2)との通信を一時的に切った場合の出力例になります

Aug 30 10:24:09 node1 kernel: drbd r0/0 drbd0: Congestion-fill threshold reached (149536 >= 131072)
Aug 30 10:24:09 node1 kernel: drbd r0/0 drbd0 node2: pdsk( UpToDate -> Consistent ) repl( Established -> Ahead ) [congestion]
Aug 30 10:24:09 node1 kernel: drbd r0/0 drbd0 node2: pdsk( Consistent -> Outdated ) [peer-state]

その後、アクティブ側の処理が終わると、スタンバイノードとの同期を再開します。

Aug 30 10:24:27 node1 kernel: drbd r0/0 drbd0 node2: repl( Ahead -> SyncSource ) [postponed-resync]
Aug 30 10:24:27 node1 kernel: drbd r0/0 drbd0 node2: Began resync as SyncSource (will sync 623072 KB [155768 bits set]).
Aug 30 10:26:36 node1 kernel: drbd r0/0 drbd0 node2: updated UUIDs 43E82B53DAEFFFD9:0000000000000000:CFF77B8FDC217980:7093171FC13E1C12
Aug 30 10:26:36 node1 kernel: drbd r0/0 drbd0 node2: Resync done (total 128 sec; paused 0 sec; 4864 K/sec)
Aug 30 10:26:36 node1 kernel: drbd r0/0 drbd0 node2: pdsk( Inconsistent -> UpToDate ) repl( SyncSource -> Established ) [resync-finished]

まとめ

DRBDの on-congestion 設定を使用すると、WAN回線などの通信の品質が悪い場合や、スタンバイノードのディスクアクセスが遅い場合でも、アクティブノードのパフォーマンス低下を防ぐことが可能です。ただし、Ahead状態になると同期が一時的に停止しデータの冗長性が失われるため、この点には注意が必要です。