ラージキーとホットキーは、サービスのパフォーマンスを低下させ、リクエストのタイムアウトを引き起こし、さらにはシステムの障害につながる可能性があります。このトピックでは、ラージキーとホットキーを迅速に特定して最適化する方法について説明します。また、その原因と影響を分析し、ビジネスへの影響を軽減するための予防策も提供します。
ステップ 1: ラージキーとホットキーを迅速に特定する
Alibaba Cloud コンソールツール
Tair と Redis は、コンソールでトップキー統計とオフラインフルキー分析機能を提供し、ラージキーとホットキーを迅速に特定するのに役立ちます。
メソッド | 制限 | 説明 | 手順 |
トップキー統計 (推奨) | この機能は、Redis Community Edition 5.0 以降、および Tair (Enterprise Edition) のメモリ最適化インスタンスと永続メモリインスタンスでのみサポートされます。 | | コンソールにログインし、[インスタンス] ページに移動します。上部のナビゲーションバーで、管理するインスタンスが存在するリージョンを選択します。次に、インスタンスを見つけてインスタンス ID をクリックします。 左側のナビゲーションウィンドウで、 または [オフラインフルキー分析] をクリックします。
|
オフラインフルキー分析 | この機能は、ディスクベースのインスタンスではサポートされていません。 | |
インスタンスがこれらの機能をサポートしていない場合は、次の方法を使用できます。
ラージキーとホットキーを特定するその他の方法
メソッド | 長所と短所 | 説明 |
redis-cli の bigkeys、memkeys、hotkeys パラメーターを使用する | | redis-cli の bigkeys、memkeys、hotkeys パラメーターは、全体的なキー統計と、各データ構造の上位のラージキーまたはホットキーを取得します。 違いは次のとおりです: サポートされているデータ構造: STRING、LIST、HASH、SET、ZSET、STREAM。 たとえば、bigkeys のコマンドは redis-cli -h r-***************.redis.rds.aliyuncs.com -a <password> --bigkeys です。 |
組み込みコマンドを使用してターゲットキーを分析する | | 異なるデータ構造のキーについては、次の低リスクのコマンドを使用して、それらがラージキーであるかどうかを判断できます。 STRING 型: STRLEN コマンドは、対応するキーの値のバイト数を返します。 LIST 型: LLEN コマンドは、対応するキーのリストの長さを返します。 HASH 型: HLEN コマンドは、対応するキーのメンバー数を返します。 SET 型: SCARD コマンドは、対応するキーのメンバー数を返します。 ZSET 型: ZCARD コマンドは、対応するキーのメンバー数を返します。 STREAM 型: XLEN コマンドは、対応するキーのメンバー数を返します。
説明 DEBUG OBJECT および MEMORY USAGE コマンドはリソースを大量に消費し、時間計算量は O(N) です。これらはインスタンスをブロックする可能性があり、推奨されません。 |
ビジネスレイヤーでホットキーを特定する | | ビジネスレイヤーにコードを追加して、インスタンスアクセスを記録し、非同期分析を実行できます。 |
redis-rdb-tools ツールを使用してラージキーのカスタム分析を行う | | Redis-rdb-tools は Python で書かれたオープンソースツールで、RDB スナップショットファイルのカスタム分析をサポートします。RDB ファイルをダウンロードした後、インスタンス内のすべてのキーのメモリ使用量を分析し、必要に応じて柔軟なクエリを実行できます。 |
MONITOR コマンドを使用してホットキーを検索する | | MONITOR コマンドは、時間、クライアント情報、コマンド、キー情報など、インスタンスに送信されたすべてのリクエストを出力します。 緊急時には、MONITOR コマンドを短時間実行し、出力をファイルに保存できます。MONITOR コマンドを停止した後、ファイル内のリクエストを分析して、その期間中のホットキーを特定できます。
説明 MONITOR コマンドはインスタンスのパフォーマンスを大幅に低下させる可能性があるため、特別な状況を除き、MONITOR コマンドを使用しないでください。 |
ステップ 2: ラージキーとホットキーを最適化する
ラージキー
ソリューション | シナリオ | 推奨される操作 |
期限切れデータのクリーンアップ | HASH 内の未クリーンアップの増分データなど、大量の期限切れデータが蓄積されている。 | HSCAN コマンドと HDEL コマンドを使用して、無効なデータをクリーンアップできます。これにより、一度に大量のデータをクリーンアップするときに発生する可能性のあるインスタンスのブロックを防ぎます。 |
ラージキーの圧縮 | ログや構成など、JSON や XML テキストデータなどの圧縮可能なデータ。 |
説明 圧縮および展開操作は追加の CPU リソースを消費し、処理パフォーマンスに影響を与える可能性があります。 |
ラージキーの分割 | リーダーボードなど、頻繁にアクセスされる HASH、ZSET、およびその他のデータ構造。 | ラージキーを分割すると、データスキューを効果的に防ぐことができます。 |
ラージキーのオフロード | String 型の大きなファイルまたはバイナリラージオブジェクト (BLOB)。 | OSS などの他のストレージシステムに不適切なデータを保存し、インスタンスから削除できます。 Redis Community Edition 4.0 以降の場合: UNLINK コマンドを使用して、ラージキーまたは特大キーを安全に削除できます。このコマンドは、メインスレッドのブロックを回避するために、非同期でキーをクリーンアップします。 Redis Community Edition 4.0 より前のバージョンの場合: SCAN コマンドを使用して、バッチでデータを走査および削除できます。これにより、一度に多くのキーを削除することによって引き起こされる可能性のあるメインスレッドのブロックを回避できます。
|
ホットキー
ソリューション | シナリオ | 推奨される操作 |
クラスタアーキテクチャでホットキーをレプリケートする | ホットキーは単一のシャードに全体として保存され、部分的なデータを移行してもリクエストを分散できません。 | ホットキーをコピーし、レプリカを他のデータシャードに移行します。たとえば、`foo` という名前のホットキーをコピーして、`foo2`、`foo3`、`foo4` という名前の 3 つの同一のキーを作成します。これらの 3 つのキーを他のデータシャードに移行して、ホットキーを持つ単一のデータシャードへの圧力を軽減します。
説明 このソリューションの欠点は、複数のレプリカを維持するためにコードを変更する必要があり、それらの間のデータ整合性を確保するのが難しいことです。たとえば、更新操作はすべてのレプリカで同期する必要があります。このソリューションは、緊急の問題を軽減するための一時的な措置として使用してください。 |
読み書き分離を有効にする | 読み取りヘビーで書き込みライトなワークロード | この機能を有効にしても読み取りリクエストの負荷が高い場合は、読み取り専用ノードを追加して負荷をさらに軽減します。
説明 リクエスト量が非常に多いシナリオでは、プライマリ/セカンダリ同期には必然的に遅延が発生し、ダーティデータを読み取る可能性があります。したがって、読み取りと書き込みの圧力が高く、厳密なデータ整合性が要求されるシナリオでは、読み書き分離を有効にしないでください。 |
ステップ 3: ラージキーとホットキーがビジネスに影響を与えるのを防ぐ
ラージキーとホットキーの原因
Tair と Redis では、データ分布の最小単位はキーです。単一のキーは特定のデータシャードに保存され、分割されません。不十分なビジネス計画、無効なデータの蓄積、アクセス量の急増などの要因がすべて、インスタンス内でのラージキーとホットキーの生成につながる可能性があります。例は次のとおりです:
カテゴリ | 原因 |
ラージキー | 不適切なシナリオで Tair と Redis を使用すると、キー値が過度に大きくなる可能性があります。たとえば、String 型のキーを使用して大きなバイナリファイルデータを保存する場合などです。 ビジネスがオンラインになる前の計画と設計が不十分です。キー内のメンバーが合理的に分割されていないため、一部のキーのメンバー数が過剰になります。 無効なデータを定期的にクリーンアップしないため、HASH 型キーのメンバーが増え続けます。 LIST 型キーを使用するビジネスのコンシューマー側でコード障害が発生し、対応するキーのメンバーが増加するだけになります。
|
ホットキー | |
ラージキーとホットキーの影響
カテゴリ | 影響 |
ラージキー | クライアントでのコマンド実行が遅くなります。 インスタンスメモリが maxmemory 制限に達すると、操作がブロックされたり、重要なキーが削除されたり、さらにはメモリ不足 (OOM) エラーが発生したりする可能性があります。 クラスタアーキテクチャでは、1 つのデータシャードのメモリ使用量が他のシャードをはるかに超え、シャード間でメモリリソースを均等に使用できなくなります。 ラージキーに対して読み取りリクエストを実行すると、インスタンスのネットワーク帯域幅が飽和状態になり、自身のサービスが遅くなったり、関連サービスに影響を与えたりする可能性があります。 ラージキーを削除すると、プライマリデータベースが長時間ブロックされやすくなり、同期の中断やプライマリ/セカンダリフェールオーバーがトリガーされる可能性があります。
|
ホットキー | 大量の CPU リソースを消費し、ネットワーク帯域幅の使用量が増加する可能性があり、他のリクエストに影響を与え、全体的なパフォーマンスを低下させます。 クラスタアーキテクチャでは、アクセススキューが発生し、1 つのデータシャードへのアクセスが集中し、他のシャードはアイドル状態になります。これにより、そのシャードの接続数制限を使い果たし、新しい接続リクエストを拒否するなどの問題が発生する可能性があります。 タイムセールシナリオでは、プロダクトの在庫キーに対するリクエスト量がインスタンスの処理能力を超え、過剰販売につながる可能性があります。 ホットキーへのリクエスト圧力がインスタンスの容量を超えると、キャッシュブレークダウンが容易に発生する可能性があります。これは、多くのリクエストがバックエンドストレージレイヤーに送られ、ストレージアクセスが急増したり、さらにはブレークダウンしたりして、他のサービスに影響を与えることを意味します。
|
予防戦略
戦略 | 説明 |
モニタリングとアラートの設定 | CPU 使用率、メモリ使用量、接続数などのメトリックに合理的なアラートしきい値を設定します。たとえば、メモリ使用量が 70% を超えたとき、またはメモリが 1 時間で 20% 以上増加したときにアラートを設定します。アラートがトリガーされたら、このトピックのステップ 1 とステップ 2 の指示に従って、ラージキーとホットキーを特定して最適化します。これにより、ビジネスに影響が及ぶ前に問題を解決します。 |
無効なデータのクリーンアップを回避するために Tair (Enterprise Edition) を使用する | ハッシュ型のラージキーを含むシナリオの場合、Tair (Enterprise Edition) は拡張データ構造である TairHash を提供します。これは、各フィールドの有効期限とバージョンの設定をサポートします。TairHash を正しく使用すると、O&M ワークロードを大幅に削減し、ビジネスコードの複雑さを簡素化し、ラージキーとホットキーによって引き起こされる問題に効果的に対処できます。 |