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

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

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

重要: NodeSyncが有効になっているテーブルは、すべてまたは一部のキースペースについて、リペア操作がスキップされます。個別のテーブルについては、NodeSyncが有効になっている場合、repairコマンドが拒否されます。

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

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

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

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

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

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

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

nodetool repairオプションの追加のガイダンス:
  • データ・センターのノードにすべての範囲のすべてのデータが含まれていない限り、-local-prオプションの併用はサポートされません。
  • -local-inc(インクリメンタル・リペア)の併用はサポートされません。
注: データ・センター全体のリペアについては、-dcparオプションを使用してデータ・センターを並列にリペアします。

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

同じトークンの範囲にレプリカを持つ別のノードから直接レプリカを実行します。このオプションを使用すると、データ・センター全体のリペアが必要な場合のパフォーマンスの影響が最小化されます。
nodetool repair --pull -hosts local_ip_address,remote_ip_address 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の行には、リペア済みまたは未リペアを示すマークが付けられます。

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

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

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

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

デフォルト・モードでは、同じレプリカ・データを持つすべてのノード上でリペアが同時に実行されます。シーケンシャル(-seq)では、1つのノードずつ順番にリペアが実行されます。データ・センター・パラレル(-dcpar)は、すべてのデータ・センターでシーケンシャル・リペアを同時に実行することにより、シーケンシャルとパラレルを併用しています。各データ・センター内の単一ノードでは、リペアが完了するまで、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以降では、パラレル・リペアがデフォルトです。