世代識別子

DRBDでは世代識別子(GI)を使用してレプリケートされたデータの世代を識別します。これはDRBDの内部メカニズムで、次のような目的で使用されます。

データの世代

DRBDは次のような場合に、新しいデータ世代の開始としてマークを付けます。

  • デバイスの初期フル同期。

  • 切断したリソースがプライマリロールに切り替わる。

  • プライマリロールのリソースが切断する。

つまり、リソースの接続状態がConnectedになり、両方のノードのディスク状態がUpToDate になると、両方のノードの現在のデータ世代が同一になります。逆も同様です。

新規のデータ世代は8バイトのUUID (Universally Unique Identifier)で識別されます。

世代識別子タプル

DRBDでは、現在と履歴のデータ世代について4組の情報がローカルリソースメタデータに格納されます。

  • 現在UUID. これは、ローカルノードからみた最新のデータ世代の世代識別子です。リソースがConnectedになり完全に同期されると、両ノードの現在UUIDが同一になります。

  • ビットマップUUID. これは、オンディスク同期ビットマップにより変更が追跡されている世代のUUIDです。オンディスク同期ビットマップ自体については、切断モードの間のみこの識別子が意味を持ちます。リソースがConnectedの場合は、このUUIDは常に空(ゼロ)です。

  • 2つの履歴UUID. これらは、現在の世代より前の2つのデータ世代識別子です。

上記の4つをまとめて世代識別子タプル、または省略してGIタプルと呼びます。

世代識別子の変化

新規データ世代の開始

ネットワーク障害や手動の介入によりノードが対向ホストとの接続を失うと、DRBDは次のようにローカルの世代識別子を変更します。

図18.1 新規データ世代の開始時に変化するGIタプル

新規データ世代の開始時に変化するGIタプル
注: プライマリノードの変化のみを示しています(セカンダリノードには変更が適用されない)。


  1. 新規データ世代に対して新規UUIDが作成されます。これが、プライマリノードの新しい現在UUIDになります。

  2. 以前のUUIDは、ビットマップが変更を追跡している世代を参照します。したがって、これがプライマリノードの新しいビットマップUUIDになります。

  3. セカンダリノードではGIタプルは変化しません。

再同期の開始

再同期を開始すると、DRBDはローカルの世代識別子に対して次のような変更を行います。

図18.2 再同期開始時のGIタプルの変化

再同期開始時のGIタプルの変化
注: 同期元の変化のみを示しています。


  1. 同期元の現在UUIDは変化しません。

  2. 同期元のビットマップUUIDが循環して、第1の履歴UUIDになります。

  3. 同期元で新規のビットマップUUIDが生成されます。

  4. このUUIDが同期先の新しい現在UUIDになります。

  5. 同期先のビットマップUUIDと履歴UUIDは変化しません。

再同期の完了

再同期が完了すると、次のような変更が行われます。

図18.3 再同期完了時の GI タプルの変化

再同期完了時の GI タプルの変化
注: 同期元の変化のみを示しています。


  1. 同期元の現在UUIDは変化しません。

  2. 同期元のビットマップUUIDが循環して第1の履歴UUIDになり、第1のUUIDが第2の履歴UUIDに移動します。第2の履歴UUIDがすでに存在する場合は破棄されます。

  3. 次に、同期元のビットマップUUIDが空(ゼロ)になります。

  4. 同期先は、同期元からGIタプル全体を取得します。

世代識別子とDRBDの状態

ノード間の接続が確立すると、2つのノードは現在入手可能な世代識別子を交換し、それに従って処理を続行します。結果は次のようにいくつか考えられます。

  1. 両ノードの現在UUIDが空の場合. 新規に構成されて初期フル同期が開始していないリソース状態です。同期が開始していないため、手動で開始する必要があります。

  2. 1つのノードの現在UUIDが空の場合. ローカルノードの現在UUIDが空でなくリモートノードの現在UUIDが空になっている状態です。これは、ローカルノードを同期元とした初期フル同期が進行中であることを表します。初期フル同期の開始時に、ローカルノードのDRBDはディスク上の同期ビットマップのすべてのビットを1にして、ディスク全体が非同期だとマークします。その後ローカルノードを同期元とした同期が始まります。

    逆の組み合わせの場合、リモートノードが同期元になります。

  3. 現在UUIDが等しい場合. 両ノードの現在UUIDが空でなく、同じ値を持っている状態。両ノードがともにセカンダリで、通信切断中にどのノードもプライマリにならなかったことを表します。この状態では同期は必要ありません。

  4. ビットマップUUIDがリモートノードの現在UUIDと一致する場合. ローカルノードのビットマップUUIDがリモートノードの現在UUIDと一致し、リモートノードのビットマップUUIDが空である状態。これは、ローカルノードがプライマリで動作している間にセカンダリノードが停止して再起動したときに生じる正常な状態です。これは、リモートノードは決してプライマリにならず、ずっと同じデータ世代にもとづいて動作していたことを意味します。この場合、ローカルノードを同期元とする通常のバックグラウンド再同期が開始します。

    逆に、ローカルノードのビットマップUUIDが空で、リモートノードのビットマップUUIDがローカルノードの現在UUIDと一致する状態は、ローカルノードの再起動に伴う正常な状態です。この場合、ローカルノードを同期先とする通常のバックグラウンド再同期が開始します。

  5. 現在UUIDがリモートノードの履歴UUIDと一致する場合. ローカルノードの現在UUIDがリモートノードの2つの履歴UUIDのどちらかと一致する状態です。過去のどこかで同じデータを持っていたが、現在はローカルノードのデータが最新になっていること、しかもローカルノードのビットマップは古くて信用できないことを表します。通常の部分同期では不十分なため、ローカルノードを同期元とするフル同期が開始します。

    逆の場合(ローカルノードの履歴UUIDがリモートノードの現在UUIDと一致する場合)にも、DRBDが同様の同期を行いますが、ローカルノードが同期先になります。

  6. ビットマップUUIDが一致し、現在UUIDが一致しない場合.  ローカルノードの現在UUIDがリモートノードの現在UUIDと異なるが、ビットマップUUIDは一致する状態はスプリットブレインです。ただし、データ世代は同じ親を持っています。この場合、設定されていればDRBDがスプリットブレイン自動回復ストラテジが実行されます。設定されていない場合、DRBDはノード間の通信を切断し、手動でスプリットブレインが解決されるまで待機します。

  7. 現在UUIDもビットマップUUIDも一致しない場合. ローカルノードの現在UUIDがリモートノードの現在UUIDと異なり、ビットマップUUIDも一致しない状態もスプリットブレインで、しかも過去に同一のデータ状態であったという保証もありません。したがって、自動回復ストラテジが構成されていても役に立ちません。DRBDはノード間通信を切断し、手動でスプリットブレインが解決されるまで待機します。

  8. いずれのUUIDも一致しない場合. 最後は、DRBDが2 つのノードのGIタプルの中に一致するものを1つも検出できない場合です。この場合は、関連のないデータと切断に関する警告がログに記録されます。これは、相互にまったく関連のない2つのクラスタノードが誤って接続された場合に備えるDRBDの機能です。