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-ahead
と congestion-fill
です。以下に設定例を紹介します。
net {
protocol A;
on-congestion pull-ahead;
congestion-fill 131072; #128M;
}
on-congestion pull-ahead を利用するためにはプロトコルをAに設定する必要があります。一方、congestion-fill は通信バッファの閾値となります。この値はシステムの構成により値は変わりますが、初期設定として128
M を指定して、テストを通じて適切な値を決めることを薦めます。
テスト方法
ディスクベンチマークなどを実行しながら、/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状態になると同期が一時的に停止しデータの冗長性が失われるため、この点には注意が必要です。