0Pricing
AWS Solutions Architect · レッスン

ElastiCache Redisのレプリケーショングループとクラスター​​モード

読み取りをスケールするRedisレプリケーショングループを構築し、クラスター​​モードを有効にして複数のノードグループにデータをシャーディングします。

「ElastiCache Redisのレプリケーショングループとクラスター​​モード」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。

Redis レプリケーショングループの概要

ElastiCache レプリケーショングループは、1 つの Redis プライマリノードと最大 5 つのリードレプリカを論理的にまとめたものです。プライマリノードはすべての書き込み操作を処理し、レプリカはプライマリから非同期レプリケーションを受けて、読み取りトラフィックを処理します。レプリケーショングループには、読み取りスケーリング(複数のレプリカに読み取りリクエストを分散)と、自動フェイルオーバーによる高可用性(プライマリに障害が発生した場合にレプリカをプライマリへ昇格)という 2 つの重要な機能があります。レプリケーショングループ内のすべてのノードは、同じデータセットを共有します。

# Create a replication group with 1 primary and 2 read replicas
aws elasticache create-replication-group \
  --replication-group-id web-cache \
  --replication-group-description 'Web application cache' \
  --num-cache-clusters 3 \
  --cache-node-type cache.r7g.large \
  --engine redis \
  --engine-version '7.0' \
  --automatic-failover-enabled \
  --multi-az-enabled \
  --cache-subnet-group-name my-multi-az-subnet-group

プライマリエンドポイントとリーダーエンドポイント

ElastiCache は、レプリケーショングループに対して 2 つの DNS エンドポイントを提供します。プライマリエンドポイントは常に現在のプライマリノードを指し、フェイルオーバー中は自動的に更新されます。すべての書き込み操作にはこちらを使用してください。リーダーエンドポイントは、利用可能なすべてのレプリカに読み取りリクエストを負荷分散します。読み取り操作にはこちらを使用して負荷を分散してください。アプリケーションでは、書き込み用のプライマリエンドポイントと読み取り用のリーダーエンドポイントに対して、それぞれ 1 つずつ接続プールを保持する必要があります。これは、ElastiCache Redis レプリケーショングループで推奨される接続パターンです。

# Get primary and reader endpoints
aws elasticache describe-replication-groups \
  --replication-group-id web-cache \
  --query 'ReplicationGroups[].{
    Primary:NodeGroups[].PrimaryEndpoint.Address,
    Reader:ReaderEndpoint.Address
  }'

# Application connection pattern:
# write_client = redis.Redis(host='primary-endpoint', port=6379)
# read_client = redis.Redis(host='reader-endpoint', port=6379)

自動フェイルオーバーのプロセス

プライマリノードに障害が発生すると、ElastiCache はヘルスチェックによって数秒以内に検知し、リードレプリカの 1 つを選択してプライマリへ昇格させます。昇格の手順は次のとおりです。(1) 選択したレプリカをプライマリへ昇格する、(2) プライマリエンドポイントの DNS レコードを新しいプライマリを指すように更新する(TTL は約 1 秒)、(3) 古いプライマリを新しいレプリカに置き換える。フェイルオーバーの合計時間は通常 30~60 秒です。プライマリエンドポイントの DNSを使用しているアプリケーションは、DNS の伝播後に自動的に再接続されるため、IP アドレスをハードコードする必要はありません。

# Test failover manually (triggers primary failover)
aws elasticache test-failover \
  --replication-group-id web-cache \
  --node-group-id 0001

# Monitor failover events
aws elasticache describe-events \
  --source-identifier web-cache \
  --source-type replication-group \
  --duration 60 \
  --query 'Events[].{Time:Date,Message:Message}'

Multi-AZ レプリカ配置

最大限の耐障害性を確保するには、レプリカを複数のアベイラビリティーゾーンに分散してください。レプリケーショングループで Multi-AZ を有効にすると、ElastiCache はプライマリとレプリカを異なる AZ に自動的に配置します。AZ 全体が停止した場合は、稼働している AZ のレプリカがフェイルオーバーによって昇格します。レプリケーショングループの作成時に、--preferred-cache-cluster-a-zsオプションを使用して各ノードの優先 AZ を明示的に指定することもできます。

# Create replication group with explicit AZ placement
aws elasticache create-replication-group \
  --replication-group-id ha-redis \
  --replication-group-description 'Multi-AZ Redis' \
  --num-cache-clusters 3 \
  --cache-node-type cache.r7g.xlarge \
  --engine redis \
  --automatic-failover-enabled \
  --multi-az-enabled \
  --preferred-cache-cluster-a-zs us-east-1a us-east-1b us-east-1c \
  --cache-subnet-group-name multi-az-subnets

Redis Cluster Mode とは

Redis Cluster Mode Enabled(CME)は、データセットを複数のノードグループ(シャード)に分割します。各ノードグループには、プライマリ 1 台と最大 5 台のレプリカが含まれます。これは Redis の水平方向のシャーディングソリューションです。Cluster Mode を使用すると、単一ノードのメモリ容量を超えて拡張できます。最大 500 個のノードグループをそれぞれ 500 GB で構成できるため、1 つの Redis クラスターで最大 500 × 500 GB = 250 TB のデータを保持できます。また、各ノードグループが担当するキー範囲の書き込みを独立して処理するため、書き込みスループットも向上します。

# Create a Redis Cluster Mode Enabled replication group
# with 3 shards, each with 1 primary and 2 replicas
aws elasticache create-replication-group \
  --replication-group-id clustered-redis \
  --replication-group-description 'Cluster mode: 3 shards x 3 nodes' \
  --num-node-groups 3 \
  --replicas-per-node-group 2 \
  --cache-node-type cache.r7g.large \
  --engine redis \
  --automatic-failover-enabled \
  --multi-az-enabled \
  --cache-subnet-group-name multi-az-subnets

ハッシュスロットとキーの分散

Redis Cluster Mode は、キー空間を16,384 個のハッシュスロットに分割します。各ノードグループは、連続した範囲のハッシュスロットを所有します。キーが書き込まれると、Redis はCRC16(key) % 16384を計算してハッシュスロットを決定し、それによって担当するノードグループを特定します。アプリケーションでは、スロットマップを把握し、各コマンドを正しいノードにルーティングできるクラスター対応 Redis クライアント(redis-py-clusterや、クラスター用に設定したJedisなど)を使用する必要があります。標準クライアントが誤ったシャードにキーを送信すると、MOVED リダイレクトエラーが返されます。

# Python cluster-aware client example
# pip install redis[hiredis]

# from redis.cluster import RedisCluster
# cluster_client = RedisCluster(
#   host='clustered-redis.abc123.clustercfg.use1.cache.amazonaws.com',
#   port=6379,
#   decode_responses=True
# )

# The client automatically resolves slot-to-node mapping
# cluster_client.set('user:1', 'Alice')   # routes to correct shard
# cluster_client.get('user:1')            # routes to correct shard

Cluster Mode と非 Cluster Mode

SAA-C03 では、次の場合に非 Cluster Modeを選択します。データが単一ノードに収まる(余裕を考慮して約 400 GB 未満)、シンプルなプライマリ/レプリカ構成が必要、またはアプリケーションで複数キーにまたがる複雑な操作を使用する場合です(複数キーにまたがるトランザクションでは、すべてのキーが同じスロットに存在する必要があります)。次の場合はCluster Modeを選択します。データセットが単一ノードのメモリ容量を超える、書き込みスループットを水平方向にスケーリングする必要がある、または将来的な増加によりオンラインでの再シャーディングが必要になると見込まれる場合です。Cluster Mode では、ダウンタイムなしでシャードを追加できます(オンライン再シャーディング)。

# Scale out a cluster-mode Redis by adding shards
aws elasticache modify-replication-group-shard-configuration \
  --replication-group-id clustered-redis \
  --node-group-count 5 \
  --apply-immediately \
  --resharding-configuration \
    NodeGroupId=0004,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c \
    NodeGroupId=0005,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c

# No downtime — slots are migrated incrementally

リージョン間レプリケーションのためのGlobal Datastore

ElastiCache Global Datastoreは、複数のAWSリージョンにまたがるRedisレプリケーションを実現します。1つのリージョンをプライマリクラスターとして指定し、他のリージョンにセカンダリクラスターを追加します。書き込みはプライマリに送られ、セカンダリには通常1秒未満の遅延で非同期レプリケーションされます。セカンダリクラスターは、非常に低いレイテンシーでローカルの読み取りを処理できます。Global Datastoreを使用すると、異なる大陸のユーザーが最寄りのリージョンから読み取るグローバルアプリケーションや、プライマリリージョンに障害が発生した場合にセカンダリクラスターをプライマリへ昇格できるリージョン間DRを実現できます。

# Create a Global Datastore (adds a secondary region to an existing cluster)
aws elasticache create-global-replication-group \
  --global-replication-group-id-suffix my-global-cache \
  --primary-replication-group-id prod-redis

# Add a secondary cluster in another region
aws elasticache create-replication-group \
  --replication-group-id prod-redis-eu \
  --replication-group-description 'EU secondary' \
  --global-replication-group-id ldgnf-my-global-cache \
  --region eu-west-1

大規模環境でのRedis Pub/Sub

クラスター化されていないRedisレプリケーショングループでは、Pub/Subメッセージがすべてのレプリカに配信されます。つまり、どのノードのサブスクライバーでも、チャネルに発行されたメッセージを受信できます。ただし、Cluster Modeでは、Pub/Subはkeyspace notificationsに制限され、チャネルベースのPub/Subは、Redis 7+ with Pub/Sub sharding(シャード対応Pub/Sub用のSSUBSCRIBE / SPUBLISH)を使用しない限り、単一のシャード内でのみ機能します。これは、Cluster Modeで大規模なPub/Subを設計する際の重要な制約です。

# Keyspace notification (fires when a key expires)
# Enable in parameter group: notify-keyspace-events Ex

# Subscriber in Python:
# pubsub = redis_client.pubsub()
# pubsub.psubscribe('__keyevent@0__:expired')
# for message in pubsub.listen():
#     if message['type'] == 'pmessage':
#         expired_key = message['data']
#         print(f'Key expired: {expired_key}')

レプリケーション遅延の監視

読み取りレプリカ上のReplicationLag CloudWatchメトリクスを監視し、プライマリに追随できていることを確認します。数秒を超える遅延は、レプリカ側のボトルネック(ノードの過負荷、ネットワークの問題、またはレプリカが処理しきれない書き込み量)があることを示します。Global Datastoreのシナリオでは、GlobalDatastoreReplicationLagを監視します。レプリケーション遅延が大きいと、読み取りレプリカが古いデータを返す可能性があります。これは、厳しい範囲内での結果整合性を想定するアプリケーションにとって重要です。

# Monitor replication lag for all replicas
aws cloudwatch get-metric-statistics \
  --namespace AWS/ElastiCache \
  --metric-name ReplicationLag \
  --dimensions Name=ReplicationGroupId,Value=web-cache \
  --statistic Maximum \
  --period 60 \
  --start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ)

# Alert if ReplicationLag > 10 seconds

レプリケーショングループのスケーリング

垂直スケーリング(ノードタイプの変更)または水平スケーリング(レプリカの追加・削除)が可能です。ノードタイプの変更にはmodify-replication-groupの呼び出しが必要で、即時適用すると短時間のフェイルオーバーが発生します。このとき、プライマリは新しいタイプのノードに置き換えられます。レプリカの追加はオンラインで実行でき、ダウンタイムはありません。非クラスターからCluster Modeへ移行する場合は、新しいCluster Modeのグループを作成して移行する必要があります。クラスターと非クラスターのモード間でインプレース変換することはできません。

# Scale up node type with maintenance window
aws elasticache modify-replication-group \
  --replication-group-id web-cache \
  --cache-node-type cache.r7g.xlarge \
  --apply-immediately false

# Add a read replica
aws elasticache increase-replica-count \
  --replication-group-id web-cache \
  --new-replica-count 4 \
  --apply-immediately

クイックチェック

このレッスンで学んだAWS Solutions Architect(SAA-C03)の概念について理解度を確認します。

レッスンのまとめ

このレッスンでは、レプリケーショングループがレプリカによる読み取りスケーリングと、プライマリ/リーダーエンドポイントを使用した自動フェイルオーバーによる高可用性を提供すること、Cluster Modeが16,384個のハッシュスロットを使用して最大500個のノードグループにデータをシャーディングし、単一ノードのメモリを超えて水平スケーリングできること、そしてGlobal Datastoreがリージョン間でデータをレプリケーションし、グローバルで低レイテンシーの読み取りとリージョン間DRを実現することを学びました。次は、遅延読み込みとWrite-Throughというキャッシュ戦略について学びます。

よくある質問

「ElastiCache Redisのレプリケーショングループとクラスター​​モード」レッスンは無料ですか?

はい。「ElastiCache Redisのレプリケーショングループとクラスター​​モード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。

「ElastiCache Redisのレプリケーショングループとクラスター​​モード」で何を学びますか?

読み取りをスケールするRedisレプリケーショングループを構築し、クラスター​​モードを有効にして複数のノードグループにデータをシャーディングします。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AWS Solutions Architectを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ElastiCache Redisのレプリケーショングループとクラスター​​モード」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAWS Solutions Architectレッスンでコードを書いて実行できますか?

はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. RedisとMemcached:適切なエンジンの選択
  2. ElastiCache Redisのレプリケーショングループとクラスター​​モード
  3. キャッシュ戦略:レイジーローディングとライトスルー
  4. セッションストレージとリーダーボードのパターン
← AWS Solutions Architectに戻る