AWS ElastiCache（Redis）に関する考察

## 目的
ElastiCache（Memcached）を使用していたが、ElastiCache（Redis）に切り替えることを検討してみたので、
自身の理解向上のために備忘録として残します。

## What's redis

![スクリーンショット 2021-03-18 14.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247837/43985a8a-dc0a-5326-fba3-1b3c51a62e64.png)

## What's AWS ElastiCache（redis）Extension

![スクリーンショット 2021-03-18 14.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247837/db4e1701-d149-4b90-6c3b-1afaaa8ba7b5.png)

## Cluster Mode Enabled vs Disabled

![スクリーンショット 2021-03-18 14.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247837/2a762453-acc3-fc4a-1b7c-96f48401ab7b.png)

## Memcached vs Redis
![スクリーンショット 2021-03-18 14.38.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247837/63d0e097-16dc-049f-2c05-a34dc7707ce6.png)

引用元 : [Advanced Design Pattern forAmazon ElastiCache](https://pages.awscloud.com/rs/112-TZM-766/images/Session%204%20-%20AdvancedDesignPatternForElastiCache_ver20200824_rev.pdf)


## Memcached,Redis (クラスターモードが無効), および Redis (クラスターモードが有効) の比較の概要

||Memcached|Redis (クラスターモードが無効)|Redis (クラスターモードが有効)|
| --- | --- | --- | --- |
| エンジンバージョン | 1.5.x | 2.8.x 以降 |3.2.x 以降|
| データ型 | シンプル ‡ |2.8.x - 混在  | 3.2.x 以降 - 複雑 |
|データのパーティション化|はい|いいえ|はい|
|クラスターが変更可能|はい|はい|3.2.10 以降 - 限定|
|オンラインリシャーディング|いいえ|いいえ|3.2.10 以降|
|Encryption	|いいえ	|3.2.6、4.0.10 以降|3.2.6、4.0.10 以降|
|マルチスレッド|はい|いいえ|いいえ|
|ノードタイプのアップグレード|いいえ|はい|はい|
|エンジンのアップグレード|はい|はい|はい|
|高可用性 (レプリケーション)	|いいえ|はい|はい|
|自動フェイルオーバー	|いいえ|オプション|必須|
|パブリック/サブ機能	|いいえ|はい|はい|
|ソートされたセット|いいえ|はい|はい|
|バックアップと復元|いいえ|はい|はい|

FYI [Memcached と Redis の比較](https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/SelectEngine.html)
FYI [ElastiCache + Redis に出てくる概念と、クラスタモードごとの違い](https://nyamadori.hatenablog.com/entry/2017/09/12/103523)

## 切り替えた方がいいの？

そもそもキャッシュサーバ用途として利用しているなら揮発性データを扱っているはずなので、
データの永続化やバックアップに重きをおくのはよろしくないのではと思う一方、
後述するRedisのメリットがあるので、memcached から redis へ切り替えをした方が良さそう。

また、ユーザーのログイン情報（セッション）をキャッシュサーバに保持させるケースがわかりやすい例だと思いますが、
その場合、データが消失してしまうと、ユーザーは再ログインをする必要が出てきます。
ユーザーによってはログイン情報を忘れていて、ログインできなくなって不便が生じるケースもあります。
ユーザーへのホスピタリティを考慮すると、キャッシュだから消えても良いか とは一概にいえないと改めて感じました。

- 可用性向上
　ElastiCache（Memcached）だと、サービス更新（RDSでいうメンテナンスウインドウと同じと解釈）ノード故障時データ欠損が発生する（ノード3台構成で1台故障した場合、33%のデータ欠損が発生する）が、ElastiCache（redis）ではレプリケーションされているため、データの欠損は発生しない

- データバックアップ
　redisではS3へのデータバックアップがサポートされる

- Memcached の垂直スケーリングによるデータが空になる
Memcached クラスターをスケールアップ/ダウンするときは、新しいクラスターを作成する必要があります。Memcached クラスターは、アプリケーションによって事前設定されない限り、最初は空の状態になります
FYI : https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/Scaling.html#Scaling.Memcached.Vertically

> Q: Amazon ElastiCache のサービス更新とは何ですか?
> サービス更新は、Amazon ElastiCache の機能であり、特定のホストの更新をご自由に適用できます。これらの更新には、セキュリティパッチまたはマイナーソフトウェア更新タイプがあります。これらの更新によってクラスターのセキュリティ、信頼性、運用パフォーマンスが強化されます。

> Q: Memcached クラスターの ElastiCache に更新を適用する際に関連するダウンタイムはありますか?
> はい、ノードは新しい空のノードに置き換えられます。キャッシュの内容はもう存在せず、新たに始まります。

引用元 : https://aws.amazon.com/jp/elasticache/elasticache-maintenance/

## 2021/11/26追記

Amazon MemoryDB for Redisが登場しました。

- ElastiCached for Redis
  - デメリット プライマリノードが落ちた場合に、フェイルオーバータイミングでのデータロストがある
- MemoryDB
    - メリット ノード障害やフェイルオーバーが発生しても、データロストしない
    - デメリット　データ永続化のトレードオフとして書き込み速度は低下した

https://dev.classmethod.jp/articles/aws-release-durable-redis-amazon-memorydb-for-redis/