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

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

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

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

DataStax Enterpriseでは、DynamoやRiakと同様に、Merkleツリーを使用してアンチエントロピー・リペアを実現します。アンチエントロピーは、すべてのレプリカのデータを比較し、各レプリカを新しいバージョンに更新するプロセスです。DataStax Enterpriseは、次の2つのフェーズを処理します。
  1. レプリカごとにMerkleツリーを構築する
  2. Merkleツリーを比較して差異を探索する

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

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

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

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

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

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

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

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

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

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

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