読み取り要求はどのように実行されるか

コーディネーター・ノードがレプリカに送信できる読み取り要求には3つの種類があります。

コーディネーターがレプリカに送信できる読み取り要求には3つの種類があります。

  • 直接読み取り要求
  • ダイジェスト要求
  • バックグラウンド読み取りリペア要求

コーディネーター・ノードは、直接読み取り要求を持って1つのレプリカ・ノードにアクセスします。その後、コーディネーターは、クライアントが指定した整合性レベルによって決まる数のレプリカにダイジェスト要求を送信します。ダイジェスト要求は、レプリカ・ノードのデータをチェックして、データが最新であることを確認します。さらに、コーディネーターは、ダイジェスト要求を残りのすべてのレプリカに送信します。レプリカ・ノードに古いデータがある場合は、バックグラウンド読み取りリペア要求が送信されます。読み取りリペア要求は、要求された行がすべてのレプリカの間で整合が取れていることを確認します。

ダイジェスト要求の場合、コーディネーターは整合性レベルに指定されている数のレプリカにまずアクセスします。コーディネーターは、これらの要求を現在最も速く応答しているレプリカに送信します。接続されたノードは、要求されたデータのダイジェストを応答として返します。複数のノードにアクセスしている場合は、各レプリカの行が、メモリー内で比較され、整合性があるかどうかが確認されます。整合性がない場合は、(タイムスタンプに基づいて)最新のデータを持つレプリカがコーディネーターによって使用され、結果がクライアントに転送されます。すべてのレプリカのデータが最新バージョンとなるように、読み取りリペアが実行されて、更新されていないレプリカが更新されます。

読み取り要求の例を図示したものは、「読み取り整合性レベルの例」を参照してください。

speculative_retryを使用した高速読み取り保護

高速読み取り保護を使用すると、当初に選択されたレプリカ・ノードがダウンしていたり、応答に時間がかかりすぎている場合でも、Cassandraで読み取り要求を配信できます。speculative_retryプロパティを使用してテーブルが構成されている場合、読み取り要求のコーディネーター・ノードは、当初のレプリカ・ノードが構成可能なタイムアウト値を超えると、読み取り要求を完了させるために、別のレプリカ・ノードを対象に要求をリトライします。

図: 高速読み取り保護による、レプリカ・ノード障害からの復旧