手動リペア: アンチエントロピー・リペア
一部のnodetool repairパラメーターを使用するためのガイダンス。
手動リペアは、nodetool repairを使用して実行されます。このツールには、リペアを構成するための多くのオプションが含まれています。このトピックでは、特定のパラメーターを選択するためのガイダンスを提供します。
パーティショナー範囲(-pr)
クラスター内では、データベースは、特定の範囲のデータを複数のノードに格納します。ノードごとにnodetool repair
を実行すると、データベースは同じ範囲のデータを複数回リペアする可能性があります(キースペースで使用されるレプリケーション係数によって異なる)。パーティショナー範囲オプションを使用すると、nodetool repair -pr
は、リペア操作を繰り返すことなく、特定の範囲のデータが1回のみリペアされます。このオプションを使用すると、nodetool repair -pr
によって各レプリカのMerkleツリーが構築されますが、ネットワーク・リソースへの負担は減ります。
- 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
(インクリメンタル・リペア)の併用はサポートされません。
-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ツリーを比較して不整合を検出します。データの不整合が解消され、新しい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以降では、パラレル・リペアがデフォルトです。