ElastiCache 可用性・スケーラビリティ機能

詳細技術解説:Redis/Memcachedの高度な機能完全ガイド

🏪
Multi-AZ(複数アベイラビリティゾーン)
たとえ話:複数都市の銀行支店ネットワーク

東京、大阪、福岡に銀行支店があるイメージです。各支店は独立した電力、通信回線を持ち、一つの都市で災害が起きても、他の都市の支店で業務を継続できます。さらに、各支店間でリアルタイムにデータを同期しているため、どの支店でも同じサービスを受けられます。

技術的詳細

レプリケーション仕組み: プライマリノードからレプリカノードへ非同期でデータを複製。RPO(Recovery Point Objective)は通常数秒以内。


ネットワーク分離: 各AZは物理的に分離されたデータセンターで、独立した電力・冷却・ネットワークインフラを持ちます。

実装方法
aws elasticache create-replication-group \ --replication-group-id my-redis-cluster \ --description "Multi-AZ Redis cluster" \ --num-cache-clusters 3 \ --cache-node-type cache.r6g.large \ --engine redis \ --multi-az-enabled \ --automatic-failover-enabled
AZ-A
東京
Primary
AZ-B
大阪
Replica
AZ-C
福岡
Replica
監視メトリクス
  • ReplicationLag: レプリケーションの遅延時間(目標:< 1秒)
  • DatabaseMemoryUsagePercentage: メモリ使用率(推奨:< 80%)
  • NetworkBytesIn/Out: ネットワークトラフィック

メリット

  • 99.99%可用性: 単一AZ障害でもサービス継続
  • 地理的分散: 自然災害リスクの軽減
  • 読み取り性能向上: 複数のレプリカからの並列読み取り
  • バックアップ最適化: レプリカノードからバックアップ実行
コスト考慮

Multi-AZ構成により、インスタンス数が増加(プライマリ + レプリカ)するため、 コストは約2-3倍 になります。しかし、ダウンタイムによる機会損失を考慮すると、多くの場合コスト効果は高いです。

🔄
自動フェイルオーバー
たとえ話:コンビニの高度な自動バックアップシステム

メインのレジが故障したら、AIが即座に故障を検知し、自動的にサブレジに切り替わります。さらに、レジのデータ(商品マスタ、在庫情報)も瞬時に同期され、お客さんは何の違和感もなく、待たされることなく会計できます。店員が手動で切り替える必要もありません。

技術的詳細

障害検知メカニズム: ElastiCacheは30秒間隔でプライマリノードのヘルスチェックを実行。3回連続で応答がない場合、障害と判定。


フェイルオーバー時間: 通常1-6分以内。DNS TTLが60秒の場合、アプリケーションの再接続時間を含めて完了。


データ整合性: 非同期レプリケーションのため、最大数秒のデータロスの可能性あり。

フェイルオーバー詳細シナリオ
⚠️
障害検知
30秒×3回
ヘルスチェック失敗
🔄
レプリカ昇格
1-2分
DNS更新
🔌
アプリ再接続
30-60秒
接続プール更新
復旧完了
3-6分
サービス正常化
アプリケーション側の実装
# Redis接続設定(Python例) import redis from redis.sentinel import Sentinel # Sentinelを使用した自動フェイルオーバー対応 sentinel = Sentinel([ ('elasticache-001.xxx.cache.amazonaws.com', 26379), ('elasticache-002.xxx.cache.amazonaws.com', 26379) ]) # マスター/スレーブの自動発見 master = sentinel.master_for('mymaster', socket_timeout=0.1) slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
プライマリ
(メインレジ)
Active
レプリカ
(サブレジ)
Standby
障害発生時
プライマリ
(故障)
Failed
新プライマリ
(昇格)
Active
ベストプラクティス
  • 接続プールの適切な設定: timeout、retry設定を最適化
  • アプリケーションレベルでの冗長性: Circuit Breaker パターンの実装
  • 監視の強化: カスタムメトリクスでフェイルオーバー時間を追跡
  • テスト自動化: 定期的なフェイルオーバーテストの実施

メリット

  • RTO (Recovery Time Objective): 1-6分 手動復旧なら30分以上
  • 24時間365日の自動監視: 人的ミスの排除
  • 運用コスト削減: 夜間・休日の緊急対応不要
  • ビジネス継続性: 顧客への影響を最小化
👥
クラスタモード(Redis Cluster)
たとえ話:効率的なレストラン分業システム

一つの巨大なレストランではなく、専門店(寿司、焼肉、中華、イタリアン、フレンチ、カフェ)に分けて運営します。お客さんは料理の種類に応じて自動的に適切な専門店に案内され、各店舗が得意分野の注文を並列処理します。新しい専門店の追加も、既存店舗の営業を止めることなく可能です。

技術的詳細

シャーディング方式: CRC16ハッシュアルゴリズムを使用。16,384個のハッシュスロットに分散。


ノード間通信: Gossipプロトコルでクラスタの状態を共有。各ノードが他の全ノードの状態を把握。


スケーリング限界: 最大1,000ノード、合計最大500TBまでサポート。

シャード1 (0-5460)
寿司店
A-H
データ

プライマリ + レプリカ

シャード2 (5461-10922)
焼肉店
I-P
データ

プライマリ + レプリカ

シャード3 (10923-16383)
中華店
Q-Z
データ

プライマリ + レプリカ

クラスタ作成コマンド
aws elasticache create-replication-group \ --replication-group-id my-redis-cluster \ --description "Redis Cluster Mode" \ --cache-node-type cache.r6g.xlarge \ --engine redis \ --engine-version 7.0 \ --num-node-groups 3 \ --replicas-per-node-group 2 \ --cache-parameter-group default.redis7.cluster.on \ --multi-az-enabled
データ分散の仕組み
🔑
キーハッシュ
CRC16(key)
% 16384
🎯
スロット特定
ハッシュスロット
0-16383
📍
ノード特定
スロット範囲
マッピング
💾
データアクセス
対象ノードで
読み書き実行
500TB
最大データ容量
1000
最大ノード数
20M
秒間リクエスト
99.99%
可用性目標
クラスタ設計のベストプラクティス
  • 均等な負荷分散: キー設計でホットスポットを回避
  • 適切なシャード数: 将来の成長を見込んだ容量設計
  • レプリカ配置: 異なるAZに配置して可用性確保
  • クライアント最適化: クラスタ対応ライブラリの使用

メリット

  • 水平スケーリング: ノード追加で線形的な性能向上
  • 大容量対応: 単一ノードの限界を超えたデータ保存
  • 並列処理: 複数ノードでの同時アクセス処理
  • 部分障害対応: 一部ノード障害でもサービス継続
  • コスト効率: 必要な分だけリソースをスケーリング
🔧
オンラインリシャーディング
たとえ話:営業中の大型ショッピングモール改装

お客さんの迷惑をかけずに、営業しながらショッピングモールのテナント配置を最適化します。人気店舗が集中している階の負荷を分散するため、一部の店舗を段階的に他の階に移転させます。移転中も店舗は営業を続け、お客さんは移転先で同じサービスを受けられます。全体の効率が向上し、混雑も解消されます。

技術的詳細

移行方式: ハッシュスロットを段階的に移行。1つずつスロットを移動し、データ整合性を保持。


移行速度制御: 本番環境への影響を最小化するため、移行速度を調整可能。


ダウンタイム: 完全にゼロダウンタイムで実行。クライアントからは透明。

リシャーディング実行プロセス
📊
負荷分析
CPU・メモリ
使用率確認
🎯
計画策定
移行対象
スロット決定
📦
データ移動
段階的
スロット移行
⚖️
負荷分散
最適化
完了
リシャーディング実行例
# ElastiCacheコンソールまたはAPI経由で実行 aws elasticache modify-replication-group \ --replication-group-id my-redis-cluster \ --num-node-groups 5 \ --apply-immediately \ --resharding-configuration \ NodeGroupId=0001,NewReplicaCount=2,PreferredAvailabilityZones=us-east-1a,us-east-1b
スケールアウト例:3シャード → 5シャード

変更前

シャード1
0-5460
シャード2
5461-10922
シャード3
10923-16383

変更後

シャード1
0-3276
シャード2
3277-6553
シャード3
6554-9830
シャード4
9831-13107
シャード5
13108-16383
リシャーディング中の監視項目
  • MigrationProgress: 移行進捗率のリアルタイム監視
  • CacheHitRatio: 移行中のキャッシュ効率
  • CPUUtilization: 各ノードの負荷状況
  • RedirectionLatency: クライアントリダイレクト時間
リシャーディングのベストプラクティス
  • 適切なタイミング: 低負荷時間帯での実行を推奨
  • 段階的実行: 大規模変更は複数回に分けて実行
  • 事前テスト: 開発環境での動作確認必須
  • モニタリング強化: 移行中の詳細監視設定
  • ロールバック計画: 問題発生時の対処法準備

メリット

  • ゼロダウンタイム: サービス停止なしでスケーリング
  • 自動負荷分散: 負荷の偏りを効果的に解消
  • パフォーマンス最適化: 継続的な性能改善
  • 柔軟なキャパシティ管理: 需要に応じた動的調整
  • 運用効率化: 手動での複雑な操作が不要
コスト最適化

リシャーディングにより、 負荷分散で個々のノードサイズを小さくできる 場合があります。例:r6g.2xlarge × 3台 → r6g.xlarge × 5台で、コストを抑えつつ性能向上が可能。

アーキテクチャ設計パターン

基本構成
エンタープライズ
グローバル
基本構成:スタートアップ〜中規模企業

構成: Redis(Non-Cluster)+ Multi-AZ + 自動フェイルオーバー

ノード: cache.r6g.large × 2台(プライマリ + レプリカ)

容量: 〜50GB、〜10,000 RPS

月額コスト: 約$200-300

エンタープライズ構成:大規模企業

構成: Redis Cluster + Multi-AZ + オンラインリシャーディング

ノード: cache.r6g.2xlarge × 6台(3シャード × 2レプリカ)

容量: 〜500GB、〜100,000 RPS

月額コスト: 約$2,000-3,000

グローバル構成:多地域展開

構成: Global Datastore + 複数リージョン

地域: 東京、シンガポール、バージニア

容量: 〜2TB、〜500,000 RPS

月額コスト: 約$8,000-12,000

Redis vs Memcached 詳細機能比較

機能・特徴
Redis
Memcached
Multi-AZ
✅ 対応(自動フェイルオーバー付き)
✅ 対応(手動復旧)
自動フェイルオーバー
✅ 1-6分で自動切替
❌ 手動復旧必要
クラスタモード
✅ 最大500TB、1000ノード
✅ 最大20ノード
オンラインリシャーディング
✅ ゼロダウンタイム
❌ 非対応
データ永続化
✅ RDB + AOF
❌ 再起動でデータ消失
データ構造
String、List、Set、Hash、Sorted Set等
キー・バリューのみ
レプリケーション
✅ 非同期レプリケーション
❌ 非対応
Lua スクリプト
✅ サーバーサイド実行
❌ 非対応
Pub/Sub
✅ リアルタイムメッセージング
❌ 非対応
トランザクション
✅ MULTI/EXEC
❌ 非対応
メモリ効率
良好(オーバーヘッドあり)
✅ 非常に効率的
CPU使用率
中程度(機能豊富のため)
✅ 低い(シンプル設計)
最大ノードサイズ
cache.r6gd.4xlarge(500GB)
cache.r6g.4xlarge(300GB)
暗号化
✅ 保存時・転送時
✅ 保存時・転送時
バックアップ
✅ 自動・手動バックアップ
❌ 非対応

Created by SSuzuki1063

AWS SAP Learning Resources