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

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

cassandra.yaml

cassandra.yamlファイルの場所は、インストールのタイプによって異なります。
パッケージ・インストール /etc/dse/cassandra/cassandra.yaml
tarボール・インストール installation_location/resources/cassandra/conf/cassandra.yaml

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

障害検出によりノードをダウンしているとマークされ、ヒンテッド・ハンドオフがcassandra.yaml ファイルで有効になっている場合は、欠落している書き込みはcoordinator nodeによって一定期間保存されます。DataStax 5.0以降では、リプレイを改善するために、ヒントはローカルのhintsディレクトリーに格納されます。ヒントは、次の情報で構成されます。

  • ダウンしたノードのターゲットID
  • データの時間UUIDであるヒントID
  • DataStax Enterpriseのバージョンを識別するメッセージID
  • データ自体をBlobとして

ヒントは10秒ごとにディスクにフラッシュされるため、ヒントの陳腐化が軽減されます。ノードがオンラインに復旧したことをゴシップが検出すると、コーディネーターは残っているヒントをそれぞれリプレイして、新しく返されたノードにデータを書き込み、その後ヒント・ファイルを削除します。ノードがmax_hint_window_in_msパラメーターで構成されている値(デフォルトでは3時間)よりも長くダウンしている場合、コーディネーターは、新しいヒントの書き込みを停止します。

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

整合性レベルONE

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

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

整合性レベルANY

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

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

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

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

ヒント・ストレージに関する詳しい説明については、「Cassandra 3.0の新機能:ヒントのストレージと配信の改善」ブログを参照してください。基本的な情報については、「最新のヒンテッド・ハンドオフ」ブログを参照してください。