Amazon ElastiCache for Redis のスケーリングでダウンタイムを最小限に抑えたいと思っています。
解決策
ダウンタイムを最小限に抑えるには、次のアクションを確認し、セットアップとメンテナンスの手順を確認します。
- 同期中のダウンタイムを最小限に抑えるために、ワークロードが高いときのスケーリングを避けてください。クラスターのワークロードが高く、スケーリングに時間がかかる場合は、同期が失敗しないように Redis への受信リクエストを減らすようにします。同期が発生した場合は、Amazon CloudWatch の SaveInProgress メトリクスを確認して、同期がいつ発生したかを特定します。SaveInProgress メトリクスは 1 分ごとにデータを収集し、1 分未満で終了した同期をキャプチャしない場合があることに注意してください。詳細については、「 Monitoring best practices with Amazon ElastiCache for Redis using Amazon CloudWatch」を参照してください。
- クラスターに接続するときにクライアント側の設定ミスが原因で発生する問題を特定するには、非本番環境でスケーリングをテストします。スケーリングタイプによっては、スケーリング中にノードが追加されたり、削除されたり、ノードの IP アドレスが変更されたりする場合があります。ElastiCache for Redis には、クラスターに接続するためのさまざまなタイプの接続エンドポイントが用意されているため、選択される接続エンドポイントの種類はアプリケーションの要件によって異なります。
- 別のレプリカでクエリを再試行するか、プライマリアプリケーションコードにクエリを送信するように Redis クライアントまたはアプリケーションコードを設定します。クライアントが同期処理中の新しいレプリカに接続している場合は、「LOADING: Redis is loading the dataset in memory 」というエラーが表示されます。データセットのロードにかかる時間は、ノードのデータサイズとパフォーマンスによって異なります。これが問題かどうかを判断するには、非実稼働環境でテストしてください。
- クラスターが自動的にスケーリングされるように設定します。自動スケーリングは、入ってくるワークロードの急激な増加によるパフォーマンスの問題を防ぎます。詳細については、「Auto Scaling ElastiCache for Redis clusters」を参照してください。
クラスターモードがオフになっている Redis クラスターの場合は、以下のアクションを確認し、セットアップとメンテナンスの手順を確認してください。
- スケールインでは、アプリケーションがプライマリエンドポイントのみを使用して接続すると、レプリカノードを削除してもダウンタイムは発生しません。アプリケーションがリーダーまたは個々のエンドポイントを使用してそのレプリカノードに接続すると、元の接続は切断されます。元の接続が切断されたら、新しい TCP 接続を確立する必要があります。また、削除されたレプリカノードに接続しないように、アプリケーションが DNS ルックアップを実行する必要があります。クライアントがリーダーエンドポイントを使用する場合、リーダーエンドポイントの DNS 伝播によりダウンタイムが発生する可能性があります。
- スケールアウトする場合は、同期によるダウンタイムを避けるため、ワークロードが最小の時間帯にスケールアウトするようにしてください。
- ノードタイプを変更する場合、負荷が高いと同期が失敗する可能性があります。また、アプリケーションでプライマリエンドポイントまたはリーダーエンドポイントで DNS ルックアップを実行して、新しいノードへの新しい接続を確立する必要がある場合もあります。DNS の伝達には数秒かかり、クライアントが新しいノードに到達する前にサービスが中断されることがあります。Redis バージョン 5.0.5 以降では、中断は最小限に抑えられます。ElastiCache を最適化するには、新しい Redis バージョンにアップグレードするのがベストプラクティスです。
クラスターモードがオンになっている Redis クラスターの場合は、以下のアクションを確認し、セットアップとメンテナンスの手順を確認してください。
- スケーリング中のダウンタイムを最小化またはゼロにするには、「Redis cluster client discovery and exponential backoff」を参照してください。
- スケールイン時のダウンタイムを最小限に抑えるには、「Online cluster resizing」を参照してください。パフォーマンスの問題を最小限に抑えるには、徐々にスケーリングしてください。最初のスケールイン後のピーク時にクラスターのパフォーマンスを確認してから、さらにスケールインするようにします。
- スケールアウト時のダウンタイムを最小限に抑えるには、「Online cluster resizing」を参照してください。
- 負荷が高いと、ノードタイプの変更の際に同期が失敗することがあります。また、新しいノードの IP アドレスは古いノードと同じではない場合があります。IP アドレスを特定するには、アプリケーションで ** cluster nodes ** コマンドまたは cluster slots コマンドを使用して、クラスターから最新の情報を取得できます。Redis クラスターをサポートする Redis クライアントは、クラスターのトポロジーを更新できます。Redis クライアントを設定するには、特定のクライアントタイプのドキュメントを参照してください。
- レプリカの数を変更する場合は、レプリカノードを追加する前に、まずプライマリノードのパフォーマンスを確認してください。レプリカノードの数が減り、クライアントが削除済みのレプリカノードから読み取る必要がある場合、リクエストは新しいレプリカノードに送信されます。また、削除されたノードへのリクエストを防ぐために、クライアントはクラスタートポロジを更新する必要があります。
関連情報
Replication: Redis (Cluster Mode Disabled) vs.Redis (Cluster Mode Enabled)
Find your node endpoints
Scaling ElastiCache for Redis
Making sure that you have enough memory to create a Redis snapshot
Best practices with Redis clients