ヒンテッド・ハンドオフ:書き込みパス中のリペア

ヒンテッド・ハンドオフ、書き込みパス中のリペア。

データの書き込み中、ノードが応答しないことがあります。応答しない理由として、ハードウェアの問題、ネットワークの問題、またはガーベージ・コレクション(GC)の一時停止が長い時間発生したノードの過負荷が挙げられます。本来の設計上、ヒンテッド・ハンドオフにより、Cassandraは処理能力の低下した状態でクラスターが動作していても、同じ数の書き込みを引き続き実行できます。

障害検知機能によってノードが停止しているとマークされると、ヒンテッド・ハンドオフcassandra.yamlファイルで有効になっていれば、取りこぼしのあった書き込みは一定期間、コーディネーターによって格納されます。Cassandra 3.0以降では、リプレイを改善するため、ヒントはローカルのhintsディレクトリーに格納されます。ヒントは、ダウンしているノードのターゲットID、データの時間UUIDであるヒントID、Cassandraバージョンおよびデータ自体をblobとして特定するメッセージIDで構成されます。ヒントは10秒ごとにディスクにフラッシュされるため、ヒントの陳腐化が軽減されます。ヒントはリプレイされ、リプレイが成功すると、ファイルが削除されます。ヒントの格納時間がその最大時間を超えていない場合、ゴシップは、ノードがオンラインに戻るタイミングを検出します。コーディネーターは、ヒントを使用して新たに返されたノードにデータを書き込みます。ノードがmax_hint_window_in_ms(デフォルトでは3時間)より長くダウンしている場合、コーディネーター・ノードは、格納されているヒントを破棄します。

また、コーディネーターは、障害検知機能がゴシップを通じて検知するには短すぎた停止時間の間にタイムアウトになった書き込みに対応するヒントがあるかどうかを10分間隔で確認します。レプリカ・ノードが過負荷になるか使用できなくなり、障害検知機能によって当該ノードがダウンしているというマークが付けられていなければ、write_request_timeout_in_msによって発動されたタイムアウト(デフォルトは10秒)の後、そのノードへの書き込みのほとんど、またはすべてが失敗することが予想されます。いくつかのノードが同時に停止した場合、コーディネーターへのメモリーの負荷が過剰になる可能性があります。コーディネーターは現在書き込み中のヒントの数を追跡し、この数が増えすぎると、書き込みを拒否し、withOverloadedExceptionで例外をスローします。

書き込み要求の整合性レベルは、ヒントが書き込まれるかどうかに影響し、その後、書き込み要求が失敗するかどうかにも影響します。2つのノード、AとBで構成されるクラスターがあり、レプリケーション係数が1である場合は、各行が1つのノードのみに格納されているとします。整合性レベルを1として行KがノードAに書き込まれる際に、ノードAがダウンしたとします。この場合は、指定した整合性レベルを満たすことができないだけでなく、ノードAはコーディネーターであるためヒントを格納できません。ノードBはコーディネーターであるためヒントを格納していないため、データを受け取っていません。そのため、ノードBはデータを書き込むことができません。この場合、書き込み要求は失敗します。

一般的に、書き込み要求の失敗を回避するには、クラスター内に十分な数のノードを確保し、レプリケーション係数を十分な値にすることが推奨されます。たとえば、A、B、Cの3つのノードで構成されるクラスタがあり、レプリケーション係数が2であるとします。行Kをコーディネーター(この場合は、ノードA)に書き込むと、ノードCがダウンしている場合でも、ONEまたはQUORUMの整合性レベルを満たすことができます。なぜなら、AとBの両方のノードがデータを受け取るため、整合性レベルの要件が満たされます。ヒントはノードCに格納され、ノードCが稼働すると書き込まれます。

lmmsvi

通常のレプリカがすべてダウンしており、整合性レベルONEを満たすことができない場合、Cassandraに書き込みが受け入れられる必要があるアプリケーションのために、整合性レベルANYが用意されています。ANYでは、書き込みの永続性が確保され、該当するレプリカ対象が使用可能になってヒントのリプレイを受け取ったときに読み取り可能になることが保証されます。

どのノードもコーディネーターになることができるため、停止したノードは未配信のヒントを格納している場合があります。また、停止したノード上にあるデータも、長い間ダウン時間が続くと、陳腐化します。長期にわたってノードがダウンしていた場合は、manual repairを実行してください。

一見、ヒンテッド・ハンドオフを使用すれば、手動リペアは必要ないように見えますが、ハードウェア障害は回避できないうえに、以下の悪影響があるため、手動リペアを行う必要があります。
  • どのデータが欠落しているかをクラスターの残りの部分に正確に伝えるための履歴データが失われる。
  • 障害が発生したノードがコーディネーションを行った要求に基づくリプレイされていないヒントが失われる。

ノードの使用を廃止にするか、nodetool removenodeコマンドを使用してクラスターからノードを取り除くと、Cassandraは、存在しなくなったノードを対象とするヒントを自動的に削除します。また、テーブルが削除された場合にも、ヒントを削除します。

ヒントの格納に関する詳しい説明については、「Modern hinted handoff」を参照してください。