手動リペア: アンチエントロピー・リペア

一部のnodetool repairパラメーターを使用するためのガイダンス。

手動リペアは、nodetool repairを使用して実行されます。このツールには、リペアを構成するための多くのオプションが含まれています。このトピックでは、特定のパラメーターを選択するためのガイダンスを提供します。

パーティショナー範囲(-pr)

クラスター内では、データベースは、特定の範囲のデータを複数のノードに格納します。ノードごとにnodetool repairを実行すると、データベースは同じ範囲のデータを複数回リペアする可能性があります(キースペースで使用されるレプリケーション係数によって異なる)。パーティショナー範囲オプションを使用すると、nodetool repair -prは、リペア操作を繰り返すことなく、特定の範囲のデータが1回のみリペアされます。このオプションを使用すると、nodetool repair -prによって各レプリカのMerkleツリーが構築されますが、ネットワーク・リソースへの負担は減ります。

DataStaxでは、特定の範囲のオプションとインクリメンタル・リペアを併用できますが、インクリメンタル・リペアは、データをリペア済みとマークすることでデータの再リペアを避けているため、推奨されません。インクリメンタル・リペアを実行するための最も効率的な方法は、-prパラメーターを使用しないことです。これによって、SSTable全体がリペア済みとしてマークされ、アンチコンパクションがスキップされます。
注: このオプションを使用する場合は、すべてのデータがリペア対象であるクラスター内のすべてのノードに対してリペアを実行してください。これを行わないと、一部の範囲のデータがリペアされません。
DataStaxでは、日常的な保守中にフル・リペアを実行する場合、特定の範囲のパラメーターを使用することを推奨しています。ダウンしたノードには使用しないでください。
重要: DSE 5.1.3リリースでは、デフォルトのリペアの種類がフルに変更されました(変更前はインクリメンタル)。パーティション範囲別にフル・リペアを実行するには:
  • DSE 5.1.3以降では、nodetool repair -prを使用します
  • DSE 5.1.0-5.1.2では、nodetool repair -full -prを使用します

ローカル(-local)、データ・センター(-dc)、およびクラスター全体リペア

ローカル・データ・センター内ではなくデータ・センター全体でnodetool repairを使用する前に、慎重に検討してください。-localまたは--in-local-dcを使用してノード上でローカルでリペアを実行すると、コマンドは、これを実行するノードと同じデータ・センター内のノードに対してのみ実行されます。それ以外の場合は、異なるデータ・センター内のノードであっても、レプリカが含まれているすべてのノードに対してクラスター全体のリペア・プロセスを実行します。たとえば、DC1およびDC2という2つのデータ・センターでnodetool repairを開始し、それぞれのレプリケーション係数が3である場合は、repairによって6つのノードに対してMerkleテーブルが構築されます。Merkleツリーの数は、データ・センターを追加すると、この数は直線的に増加します。また、クラスター全体のリペアでは、データ・センター間のネットワーク・トラフィックは、膨大な数に増え、クラスターの問題を引き起こす可能性があります。

ローカル・オプションが非常に制限されている場合は、-dcまたは--in-dcを使用して、リペアを特定のデータ・センターに制限します。これによって、他のデータ・センターのノードのレプリカはリペアされなくなりますが、ローカル・オプションより多くのノードをリペアできるうえに、ネットワーク・トラフィックを減らすことができます。

nodetool repair -prオプションは、複数のデータ・センターにまたがるリペアに適しています。

nodetool repairオプションの追加のガイダンス:
  • データ・センターのノードにすべての範囲のすべてのデータが含まれていない限り、-local-prオプションの併用はサポートされません。
  • -local-inc(インクリメンタル・リペア)の併用はサポートされません。
注: DataStax Enterprise 5.0以降の場合、データ・センター全体のリペアに推奨されるオプションがあります。-dcparまたは--dc-parallelを使用して、データ・センターのリペアを並列処理で行います。

リモート・ノードからの一方向を対象としたリペア(--pull、--hosts、-st、-et)

同じトークンの範囲にレプリカを持つ別のノードから直接レプリカを実行します。このオプションを使用すると、データ・センター全体のリペアが必要な場合のパフォーマンスの影響が最小化されます。
nodetool repair --pull -hosts target,remote keyspace_name

エンドポイント範囲リペアとサブ範囲リペア(-st、-et)

-stおよび-et(または、-start-tokenおよび-end-token)オプションを使用してサブ範囲リペアを実行しない限り、リペア操作は、ノードのすべてのパーティション範囲またはエンドポイント範囲で実行されます。開始トークンと終了トークンを指定すると、nodetool repairはこれらのトークン間で機能し、これらのパーティション範囲でのみリペアを行います。

サブ範囲リペアは、生成されたトークン範囲を必要とするため、適切なストラテジではありません。ただし、エラーが発生したパーティションがわかる場合は、そのパーティション範囲を正確にリペア対象に指定できます。この方法によって、繰り返し範囲のリペアを送信することでリソースを拘束する可能性がある、過剰ストリーミングと呼ばれる問題が軽減される場合があります。

サブ範囲リペアは、単なるnodetool repairコマンドより多くの範囲を対象にします。32Kのパーティションを含むスプリットを取得する、Javaのdescribe_splits呼び出しを範囲全体にシーケンシャルまたは並列に繰り返すことで、過剰ストリーミングの動作を排除できます。スプリットのトークンが生成されると、これらのトークンはnodetool repair -st start_token -et end_tokenに渡されます。-localオプションを使用して、ローカルのデータ・センター内でのみリペアして、データ・センター間の転送を減らすことができます。

フル・リペアとインクリメンタル・リペア(-fullと-inc)

フル・リペアはフルMerkleツリーを構築し、そのデータと他のノードのデータを比較します。フル・リペアの詳細については、「アンチエントロピー・リペアの仕組み」を参照してください。

インクリメンタル・リペアは、ノード上のすべてのSSTableを比較し、必要なリペアを行います。インクリメンタル・リペアでは、既にリペア済みのデータは保持され、未リペアのSSTableに対してのみMerkleツリーが構築されます。SSTableの行には、リペア済みまたは未リペアを示すマークが付けられます。

図: インクリメンタル・リペアとフル・リペアのMerkleツリー

インクリメンタル・リペアは、フル・リペアの機能と同様に、開始ノードを使用して同じリペアされていないデータを持つピア・ノードからMerkleツリーを要求し、Merkleツリーを比較して不整合を検出します。データの不整合が解消され、新しいSSTableが構築されると、開始ノードはアンチコンパクション・コマンドを発行します。アンチコンパクションは、SSTable全体がリペア済み範囲内にある場合を除き、リペア済みの範囲と未リペアの範囲を別々のSSTableに分離するプロセスです。後者の場合、SSTableメタデータrepairedAtはそのリペア済みのステータスを反映して更新されます。

アンチコンパクションは、データに割り当てられているコンパクション・ストラテジによって処理が異なります。
  • サイズ階層化コンパクション(STCS)では、リペア済みのデータと未リペアのデータを別々のコンパクション用プールに分離します。メジャー・コンパクションでは、データの各プールに1つずつ、合わせて2つのSSTableを生成します。
  • レベル化コンパクション(LCS)では、未リペアのデータでサイズ階層化コンパクションを実行します。リペアが完了すると、Casandraは未リペアのSSTableセットをL0に移動します。
  • 日付階層化コンパクション(DTCS)では、リペア済みのデータと未リペアのデータを別々のコンパクション用プールに分離します。メジャー・コンパクションでは、データの各プールに1つずつ、合わせて2つのSSTableを生成します。インクリメンタル・リペアには、DTCSコンパクションを使用しないでください。

パラレル・リペアとシーケンシャル・リペア(デフォルト、-seq、-dc-par)

パラレルでは、同じレプリカ・データを持つすべてのノード上でリペアを同時に実行します。(DataStax Enterprise 5.0以降のデフォルト動作)シーケンシャル(-seq、--sequential)では、1つのノードずつ順番にリペアを実行します。(DataStax Enterprise .4.8以降のデフォルト動作)データ・センター・パラレル(-dcpar、--dc-parallelは、すべてのデータ・センターでシーケンシャル・リペアを同時に実行することにより、シーケンシャルとパラレルを併用しています。各データ・センター内の単一ノードでは、リペアが完了するまで、1つずつリペアが実行されます。

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

パラレル・リペアは、ノードA、B、およびC上で同時に機能します。パラレル・リペアの実行中、動的スニッチは、リペア中ではないスナップショットのレプリカを使用してこのテーブルのクエリーを処理します。

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