アンチエントロピー・リペア

アンチエントロピー・リペアの仕組みの説明。

すべてのDataStax Enterprise(DSE)クラスターにとってアンチエントロピー・ノード・リペアは重要です。頻繁にデータを削除することやダウンしたノードは、データの不整合を引き起こす一般的な原因です。日常的なメンテナンスを実行する場合や、nodetool repairを実行してクラスターを修正する必要がある場合に、アンチエントロピー・リペアを使用します。連続的なバックグラウンド・リペアでは、NodeSync:連続的なバックグラウンド・リペアを使用します。

アンチエントロピー・リペアの仕組み

DSEはMerkleツリーを使用してアンチエントロピー・リペアを行います。これはリーフが個々のキー値のハッシュであるバイナリー・ハッシュ・ツリーです(DynamoとRiakに類似)。アンチエントロピーは、すべてのレプリカのデータを比較し、各レプリカを新しいバージョンに更新するプロセスです。DSEは、次の2つのフェーズを処理します。
  1. レプリカごとにMerkleツリーを構築する
  2. Merkleツリーを比較して差異を探索する

DSE Merkleツリーのリーフは、行の値のハッシュです。ツリー内でより上位の親ノードは、それぞれの子のハッシュになります。Merkleツリー内ではより上位ノードが、ツリーのさらに下位のデータを表すため、Casandraは、データ・セット全体のダウンロードにコーディネーター・ノードを必要とせずに、各ブランチを個別にチェックできます。アンチエントロピー・リペアでは、DSEは深さ15(215 = 32Kリーフ・ノード)のコンパクト・ツリー・バージョンを使用します。たとえば、100万個のパーティションを含むノードに破損したパーティションが1つある場合は、約30個のパーティションがストリームされます。これは、ツリーの各リーフに相当する数です。DSEは、より小さいMerkleツリーで動作します。これは、必要なストレージ・メモリーが少なくて済み、比較プロセス中に他のノードに素早く転送できるためです。

開始ノードが参加しているピア・ノードからMerkleツリーを受け取った後、開始ノードは各ツリーをその他すべてのツリーと比較します。不整合が見つかった場合、不整合ノードは整合性のない範囲のデータとSSTableに書き込まれた新しいデータを交換します。比較は、Merkleツリーの最上位のノードから開始されます。差異が検出されない場合、データのリペアは不要です。差異が検出された場合、プロセスは左側の子ノードを処理して比較してから右側の子ノードを処理します。ノードに不整合が見つかった場合、そのノードに関連する範囲には整合性のないデータが存在します。Merkleツリー・ノードの下にあるリーフに対応するすべてのデータは、新しいデータに置き換えられます。指定されたレプリカ・セットに対して、DSEは、1度に1つのレプリカでのみ検証コンパクションを実行します。

Merkleツリーの構築は、多くのリソースを必要とし、ディスクI/Oに対する負荷やメモリの消費を伴います。以下に示すいくつかのオプションを使用すると、クラスターのパフォーマンスへの影響を軽減させることができます。

指定されたノード上で、またはノードが指定されていない場合はすべてのノード上で、nodetool repairコマンドを実行します。リペアを開始するノードは、この操作のコーディネーター・ノードになります。Merkleツリーを構築するため、コーディネーター・ノードはデータの一致範囲にあるピア・ノードを決定します。メジャー・コンパクションまたは検証コンパクションは、ピア・ノード上でトリガーされます。検証コンパクションは、格納されたカラム・ファミリー内の各行のハッシュの読み取りと生成を行い、Merkleツリーに結果を追加して、ツリーを開始ノードに返します。一般的に、ハッシュはデータ自体より少ないため、Merkleツリーはデータのハッシュを使用します。このプロセスの詳細については、「Cassandraでのリペア」ブログを参照してください。

注: インクリメンタル・リペアからフル・リペアに切り替えるには、「リペア・ストラテジの変更」を参照してください。

シーケンシャル・リペアとパラレル・リペア

シーケンシャル・リペアは、1つのノードずつ順番に実行されます。パラレル・リペアでは、同じレプリカ・データを持つすべてのノードを同時にリペアします。データ・センター・パラレル(-dc-par)は、すべてのデータ・センターでシーケンシャル・リペアを同時に実行することにより、シーケンシャル・リペアとパラレル・リペアを組み合わせています。リペアが完了するまで、各データ・センター内の1つのノードがリペアを実行します。

シーケンシャル・リペアは、各レプリカのスナップショットを取得します。スナップショットは、既存のSSTableに対するハードリンクです。スナップショットは不変であり、ディスク領域をほとんど必要としません。スナップショットは、リペアの進行中はアクティブで、その後データベースから削除されます。コーディネーター・ノードは、Merkleツリー内に矛盾を見つけると、スナップショットから必要なリペアを行います。たとえば、レプリケーション係数が3(RF=3)で、A、B、およびCが3つのレプリカを表すキースペース内のテーブルの場合、repairコマンドは、各レプリカのスナップショットをただちに取得した後、各レプリカをスナップショットからシーケンシャルにリペアしていきます(スナップショットAを使用してレプリカBをリペアし、その後スナップショットAを使用してレプリカCをリペアし、その後スナップショットBを使用してレプリカCをリペアします)。

パラレル・リペアは、すべてのデータ・センターのすべてのノードのMerkleテーブルを同時に構築します。ノードA、B、Cで同時に動作します。パラレル・リペアの実行中、動的スニッチは、リペア中ではないスナップショットのレプリカを使用してこのテーブルのクエリーを処理します。パラレル・リペアは、リペアをすばやく完了したい場合や、リペア中にリソースを完全に消費できる実稼働ダウンタイムがある場合に使用します。

データ・センター・パラレル・リペアは、シーケンシャル・リペアとは異なり、すべてのデータ・センターのMerkleテーブルを同時に構築します。このため、スナップショットは不要です(生成されません)。

DSE 4.8以前では、シーケンシャル・リペアがデフォルトです。DSE 5.0以降では、パラレル・リペアがデフォルトです。