Tair (Redis OSS-compatible) のクラスタアーキテクチャおよび読み書き分離アーキテクチャでは、プロキシサーバー (プロキシ) がリクエスト転送、負荷分散、フェールオーバーを処理し、クライアント側のロジックを簡素化します。プロキシは、複数データベース (DB) やホットスポットデータのキャッシュなどの高度な機能もサポートしています。プロキシサーバーがリクエストをルーティングし、特定のコマンドを処理する方法を深く理解することで、より効率的な業務システムを設計できます。
プロキシの概要
プロキシサーバーは、Tair インスタンス内で単一ノードアーキテクチャを使用するコンポーネントです。データシャードのリソースを消費せず、複数のプロキシノードを通じて負荷分散とフェールオーバーを実現します。
プロキシの機能 | 説明 |
クラスターインスタンスの使用パターンの変換 | プロキシノードを使用すると、標準インスタンスと同じ方法でクラスターインスタンスを使用できます。プロキシは、DEL、EXISTS、MGET、MSET、SDIFF、UNLINK などのコマンドに対して、スロットをまたいだ複数キー操作をサポートします。詳細については、「プロキシモードでサポートされるコマンドのリスト」をご参照ください。 標準アーキテクチャがビジネスの成長をサポートできなくなった場合、コードを変更することなく、標準アーキテクチャからプロキシを備えたクラスタアーキテクチャにデータを移行できます。これにより、ビジネスの変換コストが大幅に削減されます。 |
負荷分散とルーティング | プロキシはバックエンドのデータシャードとの持続的接続を確立し、負荷を分散してリクエストを転送します。転送ルールについての詳細は、「プロキシノードのルーティングメソッド」をご参照ください。 |
読み取り専用ノードのトラフィック管理 | プロキシは読み取り専用ノードの状態をリアルタイムで検出します。以下の状況が発生した場合、プロキシはトラフィック制御アクションを実行します:
|
プロキシクエリキャッシュ (Proxy Query Cache) 機能を有効にすると、プロキシはホットキーのリクエストとその応答をキャッシュします。プロキシがキャッシュ有効期間内に同じリクエストを受信すると、バックエンドのデータシャードとやり取りすることなく、クライアントに直接結果を返します。これにより、ホットキーに対する多数の読み取りリクエストによって引き起こされるアクセススキューを軽減できます。 説明 この機能を有効にするには、query_cache_enabled パラメーターを設定します。この機能は、Tair のメモリ最適化インスタンスおよび永続メモリインスタンスでのみサポートされています。 | |
複数データベース (DB) のサポート | クラスターモードでは、ネイティブ Redis およびクラスタークライアントは複数データベース (DB) をサポートしません。デフォルトのデータベース 説明 StackExchange.Redis クライアントを使用する場合、StackExchange.Redis 2.7.20 以降のバージョンを使用してください。そうしないと、エラーが発生します。詳細については、「StackExchange.Redis アップグレードのお知らせ」をご参照ください。 |
プロキシの進化により、プロキシの数が直接その処理能力を表すわけではありません。Alibaba Cloud は、クラスターインスタンスタイプにおけるプロキシの比率が、インスタンスタイプの説明で指定された要件を満たすことを保証します。
プロキシのルーティングルール
コマンドの詳細については、「コマンドの概要」をご参照ください。
アーキテクチャ | ルーティングルール | 説明 |
クラスタアーキテクチャ | 基本的なルーティングルール |
|
特定のコマンドのルーティングルール |
| |
読み書き分離アーキテクチャ | 基本的なルーティングルール |
|
特定のコマンドのルーティングルール |
|
プロキシクエリキャッシュ
プロキシノードは、ホットキーを含むリクエストとそのクエリ結果をキャッシュできます。プロキシがキャッシュ有効期間内に同じリクエストを受信すると、バックエンドのデータシャードとやり取りすることなく、クライアントに直接結果を返します。この機能は、ホットキーに対する読み取りリクエストによって引き起こされるアクセスパフォーマンスの偏りを軽減または防止できます。
このホットキーは、トップキー統計機能のホットキー (QPS) と同じです。これは、データベースカーネルがソートおよび統計アルゴリズムに基づいて識別します。デフォルトでは、秒間クエリ数 (QPS) が 5,000 を超えるキーがホットキーと見なされます。このしきい値は、
bigkey-thresholdパラメーターを使用してカスタマイズすることもできます。ホットキーがキャッシュ有効期間中に変更された場合、その変更はキャッシュに同期されません。つまり、後続のリクエストはキャッシュが有効期限切れになるまで、キャッシュからダーティデータを読み取る可能性があります。これに対処するには、必要に応じてキャッシュ有効期間を短縮できます。
プロキシノードはホットキー全体をキャッシュするわけではありません。代わりに、ホットキーを含むリクエストとそれに対応するクエリ結果をキャッシュします。
この機能は、クラスタアーキテクチャのプロキシモードまたは読み書き分離アーキテクチャを使用する Tair のメモリ最適化インスタンスおよび永続メモリインスタンスでのみ利用できます。
利用シーン
この機能は、検索ランキング、人気ユーザープロファイル、ゲームのお知らせなど、アプリケーションがわずかに古いデータを許容できるシナリオに適しています。
機能アーキテクチャ
使用方法
この機能はデフォルトで無効になっています。この機能を有効にするには、query_cache_enabled パラメーターを設定します。
詳細な説明の表示
Tair の独自開発コマンドである QUERYCACHE KEYS、QUERYCACHE INFO、QUERYCACHE LISTALL を使用して、プロキシクエリキャッシュの使用状況を表示できます。
使用状況の表示
接続の使用
通常、プロキシはデータシャードとの持続的接続を確立してリクエストを処理します。リクエストに以下のコマンドが含まれる場合、プロキシはコマンドの処理ニーズに基づいて、対応するデータシャード上に追加の接続を作成します。この場合、接続は集約できません。インスタンスの最大接続数は、単一のデータシャードによって制限されます。単一シャードの制限については、特定のインスタンスタイプをご参照ください。接続数上限を超えないように、これらのコマンドを適切に使用してください。
プロキシモードでは、Redis Community Edition インスタンスの接続数上限はデータシャードあたり 10,000 です。(Enterprise Edition) インスタンスの接続数上限はデータシャードあたり 30,000 です。
ブロッキングコマンド:BRPOP、BRPOPLPUSH、BLPOP、BZPOPMAX、BZPOPMIN、BLMOVE、BLMPOP、BZMPOP。
トランザクションコマンド:MULTI、EXEC、WATCH。
MONITOR コマンド:MONITOR、IMONITOR、RIMONITOR。
サブスクリプションコマンド:SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE、SSUBSCRIBE、SUNSUBSCRIBE。
よくある質問
読み取り操作のみを実行する Lua スクリプトを読み取り専用レプリカに転送できますか?
はい、読み取り操作のみを実行する Lua スクリプトを読み取り専用レプリカに転送できます。ただし、以下の要件を満たす必要があります:
読み取り専用アカウントが使用されていること。詳細については、「アカウントの作成と管理」をご参照ください。
Tair インスタンスの readonly_lua_route_ronode_enable パラメーターが 1 に設定されていること。値が 1 の場合、読み取り操作のみを実行する Lua スクリプトが読み取り専用レプリカにルーティングされることを示します。詳細については、「 インスタンスパラメーターの設定」をご参照ください。
Q:プロキシモードと直接接続モードの違いは何ですか。どちらのモードが推奨されますか。
A:プロキシモードを推奨します。各モードの概要と違いは次のとおりです。
プロキシモード:クライアントリクエストはプロキシノードによってデータシャードに転送されます。このモードでは、ロードバランシング、読み書き分離、フェールオーバー、プロキシクエリキャッシュ、持続的接続などの機能を利用できます。
直接接続モード:プロキシをバイパスし、直接接続エンドポイントを使用してバックエンドのデータシャードに直接アクセスできます。これは、ネイティブ Redis クラスターへの接続に似ています。プロキシモードと比較して、直接接続モードはプロキシ経由でリクエストを処理する時間を節約し、Redis サービスの応答速度をある程度向上させることができます。
Q:バックエンドのデータシャードが異常になった場合、データの読み書きにどのような影響がありますか?
A:データシャードはプライマリ/セカンダリ高可用性アーキテクチャを使用しています。プライマリノードに障害が発生した場合、システムは自動的にプライマリ/セカンダリフェールオーバーを実行し、高いサービス可用性を確保します。まれにデータシャードが異常になった場合、データへの影響と最適化ソリューションは以下の通りです。
シナリオ
影響と最適化ソリューション
図 1. 複数キーコマンドのシナリオ

影響:
クライアントは4つの接続を介して4つのリクエストを送信します。データシャード 2 が異常な場合、リクエスト 1 (GET Key1) のみが正常にデータを読み取ることができます。データシャード 2 にアクセスする他のリクエストはタイムアウトします。
最適化ソリューション:
MGET などの複数キーコマンドの使用頻度を減らすか、単一リクエスト内のキーの数を減らします。これにより、単一の異常なデータシャードが原因でリクエスト全体が失敗するのを防ぎます。
トランザクションコマンドの使用頻度を減らすか、トランザクションのサイズを小さくします。これにより、失敗したサブトランザクションが原因でトランザクション全体が失敗するのを防ぎます。
図 2. 単一接続のシナリオ

影響:
クライアントは単一の接続を介して2つの個別のリクエストを送信します。データシャード 2 が異常な場合、リクエスト 2 (GET Key2) はタイムアウトします。リクエスト 1 (GET Key1) とリクエスト 2 は同じ接続を共有しているため、リクエスト 1 も正常に返されません。
最適化ソリューション:
pipeline の使用を避けるか、減らします。
単一接続のクライアントの使用を避け、代わりにクライアントプログラム接続チュートリアルで説明されているように、接続プールを持つクライアントを使用します (適切なタイムアウトと接続プールサイズを設定する必要があります)。