読み書き比率が非常に高いシナリオでは、Tair (Redis OSS-compatible) を使用して、読み書き分離を動的に有効または無効にできます。この機能は、ホットスポットデータの一元化と高同時実行読み取りを必要とするシナリオに最適な、高可用性、高パフォーマンス、かつ柔軟な読み書き分離サービスを提供します。読み書き分離インスタンスは、Alibaba Cloud Tair チームが開発したプロキシコンポーネントを使用します。このコンポーネントは、読み取りリクエストと書き込みリクエストを自動的に識別してルーティングし、フェールオーバーなどのサービスを処理します。読み書き分離のためのビジネスコードを管理したり、アプリケーション層でフェールオーバーを処理したりする必要はありません。この機能により、統合の複雑さが大幅に軽減されます。
スタンダードアーキテクチャでの読み書き分離の有効化
読み書き分離が有効になっているスタンダードアーキテクチャインスタンスは、プライマリノード、読み取り専用ノード、プロキシノード、および高可用性システムで構成されます。次の図にアーキテクチャを示します。
図 1. クラウドネイティブ版
図 2. クラシック版 (提供終了)
コンポーネント | クラウドネイティブ読み書き分離インスタンス | クラシック読み書き分離インスタンス (提供終了) |
プライマリノード (Master ノード) | 書き込みリクエストを処理します。また、読み取り専用ノードとともに読み取りリクエストも処理します。 | |
読み取り専用ノード (読み取りレプリカ) | 読み取りリクエストを処理します。特徴:
| 読み取りリクエストを処理します。特徴:
|
レプリカノード | どの読み取り専用ノードもレプリカノードとして機能できます。プライマリノードが異常になった場合、高可用性システムは最も完全なデータを持つ読み取り専用ノードを選択して新しいプライマリノードにします。フェールオーバーが完了すると、すぐに新しい読み取り専用ノードが追加されます。 このコンポーネントは不要なため、クラウドネイティブ読み書き分離インスタンスは同じパフォーマンスレベルでより安価です。 | データバックアップに使用されるコールドレプリカノードです。リクエストを処理しません。プライマリノードが異常になった場合、リクエストはこのノードに切り替えられます。 |
プロキシサーバー | クライアントがプロキシサーバーに接続すると、プロキシサーバーはリクエストタイプを自動的に識別します。トラフィックを重みに基づいて分散し、リクエストを異なるデータノードに転送します。すべてのノードは同じ重みを持ち、カスタムの重みはサポートされていません。たとえば、書き込みリクエストはプライマリノードに転送されます。読み取りリクエストはプライマリノードと読み取り専用ノードに転送されます。 説明
| |
高可用性 (HA) システム |
| |
特徴
動的な切り替えと使いやすさ
スタンダードアーキテクチャインスタンスに対して直接読み書き分離を有効にできます。プロキシはクライアントからの読み取りリクエストと書き込みリクエストをインテリジェントに識別して転送します。この機能を有効にすると、Redis 互換のクライアントを使用して読み書き分離インスタンスにアクセスできます。これにより、アプリケーションを変更することなく読み取りパフォーマンスが向上します。読み書き分離インスタンスは Redis プロトコルコマンドと互換性がありますが、一部のコマンドはプロキシノードで制限されます。詳細については、「読み書き分離インスタンスのコマンド制限」をご参照ください。
高可用性
Alibaba Cloud 高可用性 (HA) システムは、すべてのデータノードの正常性を自動的に監視し、インスタンス全体の可用性を確保します。プライマリノードが利用できなくなった場合、新しいプライマリノードが自動的に選択され、レプリケーショントポロジーが再構築されます。読み取り専用ノードに障害が発生した場合、HA システムは問題を自動的に検出し、新しいノードを起動してデータ同期を完了させ、障害が発生したノードをオフラインにします。
プロキシノードは、各読み取り専用ノードのサービスステータスをリアルタイムで監視します。読み取り専用ノードに障害が発生した場合、プロキシノードはそのサービスウェイトを自動的に減らします。プロキシが読み取り専用ノードが一定回数連続して失敗したことを検出すると、失敗したノードへのリクエストの送信を停止します。プロキシはノードの監視を続け、ノードが回復した後にリクエストの送信を再開します。
高パフォーマンス
読み書き分離インスタンスの読み取り専用ノードをスケールアウトして、全体のパフォーマンスを線形に向上させることができます。Redis レプリケーションプロセスはソースコードレベルで最適化されています。これにより、レプリケーションシステムの安定性が大幅に向上し、各読み取り専用ノードの物理リソースを最大限に活用できます。
シナリオ
この機能は、クエリ/秒 (QPS) で測定される高い読み取り負荷のシナリオに最適です。アプリケーションの読み取り/書き込み比率が高い場合、スタンダードアーキテクチャインスタンスでは高い QPS 要件を満たせないことがあります。この場合、複数の読み取り専用ノードをデプロイして、単一ノードのパフォーマンスボトルネックを克服できます。読み書き分離を有効にすると、インスタンスの読み取り QPS は最大 9 倍に増加します。
Redis は非同期同期メカニズムを使用しているため、書き込み量が多い場合にデータ遅延が発生する可能性があります。このアーキテクチャを使用する場合、アプリケーションはある程度のダーティデータを許容できる必要があります。
クラスタアーキテクチャでの読み書き分離の有効化
クラスタアーキテクチャでは、プロキシモードで実行される クラウドネイティブインスタンスに対してのみ読み書き分離を有効にできます。次の図にサービスアーキテクチャの例を示します。
コンポーネントの説明
コンポーネント | 説明 |
プロキシサーバー | クライアントがプロキシサーバーに接続すると、プロキシはクライアントが開始したリクエストを自動的に識別します。その後、リクエストを対応するデータシャードと読み書きノードに転送します。たとえば、書き込みリクエストはプライマリノードに転送され、読み取りリクエストはプライマリノードと読み取り専用ノードの間で分散されます。 |
データシャード | 各データシャードは、1 つのプライマリノード (Master) と最大 4 つの読み取り専用ノード (読み取りレプリカ) で構成されます。
|
高可用性 (HA) サービス |
|
インスタンスがシングルゾーンにデプロイされている場合、すべてのノードはプライマリゾーンにあり、インスタンスはプライマリゾーンのエンドポイントのみを提供します。
インスタンスが 2 つのゾーンにデプロイされている場合、プライマリゾーンとセカンダリゾーンには別々のエンドポイントが提供されます。両方のエンドポイントが読み取りおよび書き込み操作をサポートします。プライマリゾーンへの読み取りリクエストは、プライマリゾーンのプライマリノードまたは読み取り専用ノードにルーティングされます。セカンダリゾーンへの読み取りリクエストは、セカンダリゾーンの読み取り専用ノードにのみルーティングされます。これにより、最寄りのノードへのアクセスが可能になります。すべての書き込みリクエストは、プライマリゾーンのプライマリノードにルーティングされます。セカンダリゾーンのすべての読み取り専用ノードが利用できない極端なケースでは、セカンダリゾーンへの読み取りリクエストはプライマリノードにルーティングされます。これにより、アプリケーションが影響を受けないことが保証されます。
提案と注意点
読み取り専用ノードに障害が発生した場合、リクエストは他のノードに転送されます。すべての読み取り専用ノードが利用できない場合、すべてのリクエストはプライマリノードに転送されます。障害が発生した読み取り専用ノードは、プライマリノードの負荷を増加させ、応答時間を長くする可能性があります。したがって、読み取り負荷が高いシナリオでは、複数の読み取り専用ノードを使用することをお勧めします。
読み取り専用ノードに障害が発生した場合、HA システムは障害が発生したノードのサービスを一時停止し、利用可能な読み取り専用ノードをマウントします。このプロセスには、リソース割り当て、インスタンス作成、データ同期、およびサービス読み込みが含まれます。必要な時間は、サービスペイロードとデータ量によって異なります。Tair (Redis OSS-compatible) は、読み取り専用ノードの回復時間に関するサービスレベル目標 (SLO) を提供しません。
マルチゾーンの読み書き分離では、プライマリゾーンに少なくとも 1 つのプライマリノードと 1 つの読み取り専用ノードが必要です。プライマリゾーンに 1 つのプライマリノード、セカンダリゾーンに 1 つのレプリカノードを持つマルチゾーンスタンダードアーキテクチャインスタンスで読み書き分離を有効にする前に、プライマリゾーンにレプリカノードを追加する必要があります。これにより、プライマリゾーンに 2 つのノードがあることが保証されます。その後、読み書き分離を有効にできます。
一部のシナリオでは、読み取り専用ノードに対して完全なデータ同期がトリガーされます。たとえば、これはプライマリノードで HA フェールオーバーがトリガーされた後に発生する可能性があります。完全なデータ同期中、読み取り専用ノードは利用できず、
-LOADING Redis はデータセットをメモリに読み込んでいます\r\nメッセージを返します。ルーティングと転送ルールについての詳細については、「Tair プロキシの機能」をご参照ください。
前提条件
インスタンスは クラウドネイティブモードでデプロイされています。
インスタンスは Redis Community Edition または Tair (Enterprise Edition) のメモリ最適化インスタンスまたは永続メモリインスタンスです。
インスタンスの容量は 1 GB 以上です。
インスタンスは高可用性 (HA) インスタンスです。
ユーザーガイド
インスタンスを作成していない場合は、インスタンスを作成する際に読み書き分離を有効にできます。
すでに クラウドネイティブインスタンスを作成している場合は、直接読み書き分離を有効にすることができます。
よくある質問
Q: スタンダードアーキテクチャインスタンスで読み書き分離を有効にすると、インスタンスの全体的な帯域幅は増加しますか?
A: はい、増加します。読み書き分離を有効にすると、インスタンスの理論上の全体的な帯域幅はインスタンスタイプの帯域幅 × ノードの総数に達する可能性があります。たとえば、96 MB/s × 3 ノード = 288 MB/s です。追加されたプロキシノードは、ほとんどの読み取りリクエストを読み取り専用ノードに転送するため、プライマリノードの帯域幅の負荷が軽減されます。ただし、実際の帯域幅は、サービスリクエストやクライアントなどの要因に影響されます。実際の帯域幅は、ストレステストの結果によります。
Q: スタンダードアーキテクチャインスタンスで読み書き分離を有効にした後、インスタンスをクラスタアーキテクチャにスペックアップできますか?
A: はい、できます。まず、読み書き分離を無効にし、次にインスタンスアーキテクチャをスペックアップ/スペックダウンする必要があります。
Q: 読み書き分離が有効になっていることを確認するにはどうすればよいですか?
A: インスタンスの [ノード管理] ページに移動し、[読み書き分離] オプションが有効になっているかどうかを確認できます。
Q: 読み取り専用ノードが読み取りリクエストを受信しないのはなぜですか?
A: デュアルゾーンの読み書き分離アーキテクチャでは、プライマリゾーンとセカンダリゾーンに独立したエンドポイントがあります。読み取りリクエストは、同じゾーンのプライマリノードまたは読み取り専用ノードにのみルーティングされます。プライマリゾーンのエンドポイントのみを使用する場合、セカンダリゾーンの読み取り専用ノードには読み取りリクエストがルーティングされません。したがって、アプリケーションコードでプライマリゾーンとセカンダリゾーンのエンドポイントを区別する必要があります。その後、セカンダリゾーンへのリクエストをセカンダリゾーンのエンドポイントに送信します。これにより、最寄りのノードへのアクセスとロードバランシングが可能になります。