Amazon ElastiCacheの耐障害性を考える

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAmazon ElastiCacheを耐障害性の観点から超詳細解説しています。

具体的には以下流れで説明します。

- Amazon ElastiCacheとは
- Amazon ElastiCacheのスケーラビリティ
- Amazon ElastiCacheのディザスタリカバリ
- Amazon ElastiCache for RedisとAmazon ElastiCache for Memcachedの比較

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- Amazon ElastiCacheを採用するときのベストプラクティスを説明できるようになりたい人
- Amazon ElastiCacheの耐障害性に不安を感じている人
- AWS Certified DevOps Engineer Professionalを目指している人

# Amazon ElastiCacheとは 
Amazon ElastiCacheは、AWSが提供するフルマネージドな分散キャッシュサービスであり、高速で拡張性があり、低レイテンシでアプリケーションのパフォーマンスを向上させるための解決策を提供します。

ElastiCacheは、MemcachedとRedisという主要な分散メモリオブジェクトキャッシュエンジンをサポートしています。
これによりアプリケーションのデータベースやバックエンドからのクエリ負荷を軽減し、アプリケーションの応答時間を向上させることができます。

試験対策だけではなく実務向けでもありますが、注意点が一転あります。
それは一般にAmazon ElastiCacheを利用するためにはアプリケーションのコードに大幅な変更を加える必要があるという点です。

そのため、Amazon ElastiCacheの利用有無はアーキテクチャ検討の初期で見切ることが大切です。

Amazon ElastuCacheの用途は1)DBキャッシュ、2)セッションストアがよく出てきます。

意外とセッションストアとして使った経験のある方が少なく、試験で出てきたときに戸惑ったという声をよく聞くので覚えておきましょう。

# Amazon ElastiCacheのスケーラビリティ
Amazon ElastiCacheでスケーラビリティを考慮したい場合、基本的にはAmazon ElastiCache for Redisの利用がベストプラクティスになります。

Amazon ElastiCache for Memcachedでも水平方向と垂直方向のスケーリングを実現できますが、それぞれあまり実用的ではないため、ここではAmazon ElastiCache for Redisに絞って解説します。

## レプリケーションとシャーディング
Amazon ElastiCache for Redisは、レプリケーションとシャーディングによりスケーラビリティを実現しています。

まずはレプリケーションです。
レプリケーションはクラスターモードを無効化している場合のオプションです。
ElastiCacheはプライマリキャッシュノードに対して複数のリードレプリカを作成できます。

![](https://storage.googleapis.com/zenn-user-upload/464b84a65abb-20231128.png)

これにより、読み取りトラフィックを分散させ、単一のプライマリによる負荷を軽減することができます。
なお、リードレプリカはプライマリに対して非同期で更新され、耐障害性を向上させます。

次にシャーディングです。
シャーディングはクラスターモードを有効化している場合のオプションです。
ElastiCacheは、キャッシュデータを複数のシャードに分割することで、水平方向のスケーリングを可能にします。

![](https://storage.googleapis.com/zenn-user-upload/8e5e5e49b8b4-20231128.png)

各シャードは独自のキャッシュエンジンのインスタンスを持ち、負荷が均等に分散されます。
これにより、大量のデータやトラフィックにも柔軟に対応できます。

## オートスケーリング
Amazon ElastiCache for Redisをクラスターモードで使う場合のみオートスケーリングも利用可能です。

Amazon ElastiCacheでは、オートスケーリング機能が提供されています。オートスケーリングを有効にすると、キャッシュの負荷が増減するに応じて自動的にノードの数を調整できます。

この時、シャードとレプリカの両方が自動でスケールアウト/スケールインします。
これにより、変動するワークロードに柔軟に対応し、コストを最適化することが可能です。

# Amazon ElastiCacheのディザスタリカバリ
Amazon ElastiCacheでディザスタリカバリを考える必要がある場合にはスナップショットの定期取得とマルチ-AZデプロイメントがベストプラクティスです。

ただし、どちらもAmazon ElastiCache for Redisでしか利用できず、Amazon ElastiCache for Memcachedでは使えないことは留意してください。

## スナップショット
Amazon ElastiCacheは定期的にスナップショットを作成し、データをAmazon S3に保存します。これにより、データの永続性を確保し、障害やデータ損失の際にはスナップショットからデータを復元できます。スナップショットは手動で作成することも可能で、必要なときにデータの状態を確実に保存できます。

## マルチ-AZ デプロイメント
ElastiCacheでは、マルチ-AZデプロイメントがサポートされています。これにより、プライマリキャッシュノードとセカンダリキャッシュノードが異なる可用性ゾーンに配置され、プライマリに障害が発生した場合に自動的にセカンダリにフェイルオーバーします。これにより、高い可用性が確保され、ディザスタリカバリの信頼性が向上します。

# Amazon ElastiCache for ReidsとAmazon ElastiCache for Memcachedの比較
最後にAmazon ElastiCache for ReidsとAmazon ElastiCache for Memcachedの比較をまとめます。

|機能/特徴 | ElastiCache for Redis | ElastiCache for Memcached|
|--- | --- | ---|
|エンジン | Redis | Memcached|
|データ構造のサポート | 文字列、ハッシュ、リスト、セットなど | キー/バリューストア|
|複製機能 | マスター・スレーブレプリケーション、クラスタリング | リードレプリカ|
|スケーラビリティ | レプリケーションとシャーディングにより高度なスケーラビリティ | リードレプリカを使用したスケーラビリティ|
|データの永続性 | ディスクへのデータの永続性をサポート | メモリ内のみで動作し、ディスクへの永続化はサポートされていない|
|データの操作 | 複雑なデータ構造をサポートし、高度なデータ操作が可能 | シンプルなキャッシュ操作に特化|
|用途 | 高度なデータ構造や複雑なクエリが必要な場合や、データの永続性が求められる場合 | シンプルで高速なキャッシングが|

基本的にReidsのほうが高性能な分だけ設定項目が多い、Memcachedのほうが設定が簡単な分だけ機能は少ない、と考えていただければ問題ありません。

Amazon ElastiCacheを導入するときには高可用性、永続性、バックアップリストアについての要件を整理するのがベストプラクティスです。
それらが必要であればRedisを、不要であればMemcachedを利用するのがよいでしょう。

# まとめ
この記事ではAmazon ElastiCacheを耐障害性の観点から超詳細解説しました。

- Amazon ElastiCacheとは
- Amazon ElastiCacheのスケーラビリティ
- Amazon ElastiCacheのディザスタリカバリ
- Amazon ElastiCache for ReidsとAmazon ElastiCache for Memcachedの比較

次回はAmazon DynamoDBの耐障害性を考えます。