書き込み操作中に、DRBDは書き込み操作をローカルの下位ブロックデバイスに転送するだけでなく、 ネットワークを介してデータブロックにも送信します。 実用的な目的で、この2つの操作は同時に実行されます。 タイミングがランダムな場合は、書込み操作が完了したが、 ネットワークを介した転送がまだ始まっていないといった状況が発生する可能性があります。
この状況で、アクティブなノードに障害が発生してフェイルオーバが開始すると、 このデータブロックのノード間の同期が失われます。 障害が発生したノードにはクラッシュ前にデータブロックが書き込まれていますが、 レプリケーションは完了していません。 ノードが回復しても、 次に同期が行われるデータセットからこのブロックを削除しなければなりません。 そうでない場合、クラッシュしたノードが生き残ったノードに対して「先書き」となり、 レプリケーションストレージの「すべてか無か」の原則に違反することになります。 これはDRBDに限らず、事実上すべてのレプリケーションストレージ構成で問題となります。 他の多くのストレージソリューションでは(バージョン0.6以前DRBDと同様に)、 アクティブなノードに障害が発生した場合、 回復後にそのノードを改めてフル同期する必要があります。
バージョン0.7以降のDRBDは、これとは異なるアプローチを採用しています。 アクティビティログ(AL)はメタデータ領域に格納され、 「最近」書き込まれたブロックを追跡します。 この領域は、くだけた言い方ではホットエリアと呼ばれます。
アクティブモードだったノードに一時的な障害が発生し、 同期が行われる場合は、デバイス全体ではなくALでハイライトされたホットエリアだけが同期されます。 これによって、アクティブなノードがクラッシュしたときの同期時間を 大幅に短縮できます。
アクティビティログには設定可能なパラメータとして アクティブエクステントの数があります。 各アクティブエクステントによって、 プライマリのクラッシュ後に転送されるデータ量に4MiBが追加されます。 このパラメータは、次に示す2つの相反する状況の妥協策です。
アクティブエクステントが多い場合. 大量のアクティビティログを記録すれば書き込みスループットが向上します。 新しいエクステントがアクティブになるたびに、 古いエクステントが非アクティブにリセットされます。 この移行には、メタデータ領域への書き込み操作が必要です。 アクティブエクステントの数が多い場合は、 古いアクティブエクステントはめったにスワップアウトされないため、 メタデータの書き込み操作が減少し、その結果パフォーマンスが向上します。
アクティブエクステントが少ない場合. アクティビティログが小さい場合は、 アクティブなノードが障害から回復した後の同期時間が短くなります。
エクステントの数は、所定の同期速度における適切な同期時間にもとづいて定義します。 アクティブエクステントの数は次のように計算できます。
RはMB/sの同期速度、
tsyncは秒単位のターゲットの同期時間です。
Eは求めるアクティブエクステントの数です。
この例では、クラスタにスループット速度が90MiByte/sのI/Oサブシステムがあり、
同期速度が30MiByte/sに設定されているとします(R=30)。
ターゲットの同期時間は4分(240秒)を維持する必要があります
(tsync=240)。
正確な計算結果は1800ですが、DRBDのAL実装のハッシュ関数は エクステントの数が素数に設定されている場合に最適に動作します。 したがって、ここでは1801を選択します。