すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):プロキシクエリキャッシュを使用してホットキーによって引き起こされる問題に対処する

最終更新日:Dec 09, 2024

このトピックでは、プロキシクエリキャッシュ機能の使用方法について説明します。 Tair (Redis OSS-compatible) はプロキシクエリキャッシュ機能を提供し、多数の読み取り要求を受信するホットキーによって引き起こされるアクセススキューの問題に対処します。 この機能を有効にすると、プロキシノードはホットキーのリクエストとレスポンスデータをキャッシュします。 プロキシノードがキャッシュされたデータの有効期間内に重複要求を受信すると、プロキシノードは、バックエンドデータシャードと対話する必要なしに、キャッシュされた結果をクライアントに直接返す。

前提条件

  • 管理するインスタンスは、Tair (Enterprise Edition) DRAMベースまたは永続メモリ最適化インスタンスです。

  • インスタンスは、読み取り /書き込み分割アーキテクチャまたはプロキシモードのクラスターアーキテクチャを使用します。

シナリオ

プロキシクエリキャッシュ機能は、ホットキーによって引き起こされるスキューされた要求に対処または防止するために使用できます。 ホットキーは、多数の読み取り要求を受信するキーである。 ホットキーは、特定のデータシャードのCPU使用率とトラフィック使用率を100% に近いレベルに保つようにします。

重要

プロキシノードにキャッシュされたホットキーのクエリ結果は、キャッシュされたデータの有効期間内に更新されません。 したがって、データが更新されてからキャッシュされたデータが期限切れになるまでの期間に、古いデータを読み取る可能性をビジネスが受け入れることができるようにしてください。 この期間は、プロキシキャッシュの有効期間である。 このトレードオフは、システム性能および安定性の向上のために強い一貫性を犠牲にする。 ビジネスロジックは、データに多少の遅延があっても、コアビジネスプロセスが影響を受けないことを保証するために、この潜在的な短いデータ不整合を処理できる必要があります。

制御ポリシー機能の動作

図 1. プロキシクエリキャッシュ機能の仕組み Proxy Query Cache原理

Tair (Redis OSS-compatible) は、効果的なソートと統計アルゴリズムを使用してホットキーを識別します。 ホットキーは、1秒間に5,000を超えるクエリ (QPS) を受け取るキーです。 プロキシクエリキャッシュ機能を有効にすると、プロキシノードは設定したルールに基づいてホットキーのリクエストとレスポンスデータをキャッシュします。 プロキシノードは、キー全体ではなく、ホットキーの要求および応答データのみをキャッシュします。 プロキシノードがキャッシュされたデータの有効期間内に重複要求を受信した場合、プロキシノードは、バックエンドデータシャードと対話する必要なしに、要求の応答をクライアントに直接返す。 ホットキーのクエリ結果が変更された場合、キャッシュは更新されません。

説明

インスタンス診断機能を使用して、インスタンスがスキューリクエストを受信したかどうかを確認できます。 リアルタイムキー統計機能を使用して、インスタンス上のホットキーに関する統計を照会することもできます。 詳細については、「診断レポートの作成」および「リアルタイムキー統計機能の使用」をご参照ください。

パラメーター設定

この機能を管理するには、次の表に示すインスタンスパラメーターを変更します。 詳細は、「インスタンスパラメーターの設定」をご参照ください。

パラメーター

説明

query_cache_enabled

プロキシクエリのキャッシュ機能を有効にするかどうかを指定します。 有効な値:

  • 0 (デフォルト): プロキシクエリキャッシュ機能を無効にします。

  • 1: プロキシクエリキャッシュ機能を有効にします。

重要

次のシナリオでは、プロキシクエリキャッシュ機能を有効にできます。

  • ホットキーのクエリ結果は、低頻度または安定した頻度で更新されます。 キャッシュの有効期限を指定して、ダーティな読み取りのリスクを最小限に抑えることができます。

  • ビジネスは、キャッシュの有効期間内に発生する可能性のある潜在的なデータの不一致を受け入れることができます。

query_cache_mode

プロキシクエリのキャッシュモード。 有効な値:

  • 0: データシャードによってプッシュされたホットキーのデータのみをキャッシュします。

  • 1: すべてのキーのデータをキャッシュします。 キャッシュされたキーは、LRU (Least Recently Used) アルゴリズムに基づいて削除されます。

重要

プロキシノードの場合、スレッドあたりの最大キャッシュ容量は100 MBです。 このパラメーターを1に設定すると、プロキシノードはLRUアルゴリズムに基づいてデータを削除します。 この場合、キャッシュヒット率が低下し、全体的な性能が損なわれる可能性がある。

query_cache_expire

キャッシュされたデータの有効期間。 単位:ミリ秒。 有効な値: 10060000。 デフォルト値: 1000

例: ホットニュースランキングリスト

ホットニュースランキングリストのデータは読み書き分割インスタンスに保存され、ランキングリストは15分ごとに更新されます。 特定のホットニュース記事では、サービスのQPSが5,000を超えることがあります。 ランキングリストの最大許容データ遅延は30秒です。 プロキシクエリキャッシュ機能を有効にした後、キャッシュの有効期間を30秒に設定します。

重要
  • キャッシュされたデータが有効期間内に変更された場合、変更されたデータはキャッシュに同期されません。 この場合、キャッシュが期限切れになるまで、同じ読み取り要求に対してダーティデータが返されます。

  • このパラメーターの値は、ビジネス要件とダーティデータの許容範囲に基づいて評価する必要があります。 値が必要な値よりも小さい場合、キャッシュヒット率は低下します。 値が必要以上に大きい場合、クライアントはダーティデータを長時間読み取ります。

コマンド

Tair (Redis OSS-compatible) インスタンスに接続し、次のコマンドを実行してクエリキャッシュの使用状況を確認できます。 詳細については、「redis-cliを使用してインスタンスに接続する」「」をご参照ください。

QUERYCACHEキー

コマンド構文: QUERYCACHE KEYS

コマンドの説明: このコマンドは、プロキシノードにキャッシュされたすべてのホットキーを照会するために使用されます。 このコマンドは、関連するデータベースの名前やホットキー自体の名前など、各ホットキーに関する情報を返します。

サンプルコマンド:

QUERYCACHE KEYS

サンプル出力:

1) 1) (integer) 0
   2) "key:000000000003"
2) 1) (integer) 0
   2) "key:000000000001"
3) 1) (integer) 0
   2) "key:000000000002"
4) 1) (integer) 0
   2) "key:000000000000"

QUERYCACHE INFO

コマンド構文: QUERYCACHE INFO

コマンドの説明: このコマンドは、プロキシクエリキャッシュの実行状態を照会するために使用されます。

サンプルコマンド:

QUERYCACHE INFO

サンプル出力:

1) "put_qps:4.00"
2) "get_qps:16570.00"
3) "hit_rate:99.98"
4) "memory_size:180"
5) "query_count:4"
6) "bandwidth_limit_query_cnt:0"
7) "qps_limit_query_cnt:0"

サンプル出力の説明:

  • put_qps: データノードが1秒あたりにキャッシュにデータを書き込む回数。

  • get_qps: クライアントが1秒あたりにキャッシュからデータを読み取る回数。

  • hit_rate: キャッシュヒット率。

  • memory_size: キャッシュされたデータによって消費されるメモリ。 単位はバイトです。

  • query_count: キャッシュされたリクエストの数。

  • bandwidth_limit_query_cnt: 帯域幅制限によりクエリキャッシュへのアクセスが制限された回数。 デフォルトでは、スロットリングは無効になっています。

  • qps_limit_query_cnt: QPS制限によりクエリキャッシュへのアクセスが制限された回数。 デフォルトでは、スロットリングは無効になっています。

QUERYCACHEのリスト

コマンド構文: QUERYCACHE LISTALL

コマンドの説明: このコマンドは、キャッシュされたすべてのリクエストを照会します。

サンプルコマンド:

QUERYCACHE LISTALL

サンプル出力:

1) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000000\r\n"
   3) (integer) 668
2) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000001\r\n"
   3) (integer) 668
3) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000003\r\n"
   3) (integer) 668
4) 1) (integer) 0
   2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000002\r\n"
   3) (integer) 667

サンプル出力の説明: 各リクエストは、データベース名、Redisシリアル化プロトコル仕様に基づいてフォーマットされた完全なリクエストコンテンツ、およびミリ秒単位の残り時間の3行の情報で構成されます。