ElastiCache for Redisをイチから構築

### 経緯

業務でAWSを触る機会が増えてきたので、インプットの備忘録として、
概要と簡単な設計での構築手順を記載します！

##ElastiCacheとは

分散インメモリキャッシュサービスの構築管理及び、
スケーリングを容易に実施することができるサービスです。
AWSが提唱している11のベストプラックティス一つのキャッシュの活用と最適なデータベースの選択に影響します。

1.インメモリとは
データをメモリ上で動作させる仕組みで、ディスク上で動作させる場合と比較して、
高速に処理をすることが可能

2.キャッシュとは
一度アクセスしたデータを保持することで、次回アクセス時に高速にアクセス
できる様にする仕組み

インメモリキャッシュとは
１ + 2 より、メモリを活用して高速にキャシュへのアクセスを可能にした、
データベースの仕組みになります。

下記の様に2回目以降のアクセスをキャッシュからデータを取得することにより
高速にアクセスが可能になる。
またDBのアクセス負荷を軽減することで、可用性を高めることができる。

![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/f13a94de-6258-0b77-ae41-4db5202f5343.png)
## ElastiCacheの特徴

- キャッシュクラスタを数クリックで起動すること
- フルマネージド型でモニタリング、自動障害検出、復旧、拡張
バックアップに対応して、高可用性を実現している。
- スケーラブルで変化するアプリケーションニーズに応じて、スケールイン、スケールアウト、スケールアップできる。
- 高スループットかつ低レイテンシーなインメモリデータストアからデータを取得して、大量のデータを扱うアプリケーションを構築したり、既存のアプリケーションのパフォーマンスを改善したりすることが可能
- 2種類のオープンソースのmemcahed,redisから選択することができる。

## RedisとMemocahedの違い

ざっくり理解するなら、シンプルでスケーラブルなキャッシュレイヤーを構築する場合は、
Memocached を利用する。それ以外はRedisのを利用する。

共通点
・ 高速に値をRead/Writeできるインメモリキャッシュ型のDB

相違点
redis
・ シングルスレッドで動作
・ スナップショット機能がある
・ データを永続化できる。
・ インメモリデータセットのソート、ランク付けが必要
・ pub/sub機能を利用することができる。
・ 位置情報クエリを利用することができる

Memoched
・ マルチスレッドで動作
・ スナップショット機能がない
・ データを永続化できない
・ フェイルオーバーや復元ができない
・ 需要の増減に応じて、スケールアウト、スケールインが可能

## 利用事例
アプリケーションでデータの即時反映が必要なケースなどに活用していく。
具体的な基本的な利用パターンが下記のようになります。

・ よくある利用事例
クライアントからのアクセスに対して、RDSとElasticCacheにアクセスをわけ、DBの負荷軽減と高速アクセスを行う。
また、S3からデータをElasticCacheに取り込むことで、高速な表示を実現することができる。
![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/8c6af02f-37d7-9908-3aa1-5a2d817af156.png)


・ pub/subを利用したイベント処理の利用事例(イベントの処理用として)
RedisのPublish(パブリッシュ)とSubcribe(サブスクライブ)のを利用して、イベント処理を行う。
上記の機能を利用し「イベントを起こす側」と「イベント処理を行う側」を分離することができる。
具体的な利用例としては、JSのイベント処理で、onclickではなく、addEventListenerして複数イベントをセットすることなどが挙げられる。
![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/a77ce4b4-6154-b3b9-6afc-4eedb2aa682b.png)


## 構築手順(ElasticCach for Redis)
ElasticCach簡易的に構築していく。EC2とRDSの説明については割愛

1.ElasticCachのRedisクラスターを作成する
2.EC2インスタンスからRedisに接続してデータ登録

### 1.今すぐ始めるをクリック
![_2020-10-23_10.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/cb2c0fd6-5a2c-0e84-f7e9-e5cea0b9928c.png)

### 2.Redisの設定手順
※利用したことがなければ、無料枠を使用できるので、料金はかからない。
2-1 今回はRedisを選択し、クラスターモード(並列処理を行い高性能にする)を選択する
2-2 エンジンバージョンから、ポート、パラメーターグループはデフォルトを選択
2-3 t2microの最小サイズを選択、アルファベットは世代、数字がメモリサイズを表してる
2-4 シャードの数、シャードないのレプリカ数を決めて、性能を調整する。今回はデフォルト
2-5 複数のAZ（アベイラビリティーゾーン）を設定し、冗長性の確保できる。
    今回はサブネットグループを新規作成して、publicの1aと1cに配置する。
2-6 詳細の設定でより詳細にredisの設定をすることができる。
    今回は設定を変更せず、デフォルトで作成する
　　・ スロット及びキースペース　処理の分散方法を指定。均等分散が通常
　　・ アベイラビリティーゾーンの配置　AZごとにシャードを分散配置できる
　　・ セキュリティ　SG、暗号化の設定
　　・ クラスターへのデータのインポート　S3からのデータインポート　　
2-7 起動をクリックし、redisの構築完了

・クラスタとは
シャードをまとめる論理グループ。クラスターモードを有効にするとクラスタ1つに対し、複数のシャードを持つことができる。
無効の場合はクラスタ1つに対し、シャードが1つ

・シャードとは
ノードをまとめるグループ。2つのノードを使用することで、レプリケーションを作成できる。
シャードはプライマリーノード(read/write)を1つ、セカンダリーノード(read)を5つ持つことができる。

・ノードとは
ElasticCachの最小単位

クラスタが最大単位でその中にシャード、シャードの中にノードがあるイメージ
クラスタ > シャード > ノード

![_2020-10-24_10.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/1a56058f-de53-c004-15f0-9813009876ba.png)

![_2020-10-24_10.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/37581ed8-2413-a37a-3640-6d1fc998dc3b.png)


(参考)Memcachedの方が選択項目が少なく、単純なキャッシングなどシンプルなケーズで利用される。

![_2020-10-23_10.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/bd1c1797-26d5-f928-b7c3-f2586f4ed641.png)

### EC2作成

同じサブネットグループ内に作成する。
今回、EC2の作成は省略します。

### SG(セキュリティグループ)の設定

EC2からredisへエンドポイントを使用してアクセスするため、EC2に割当てられている
セキュリティグループのインバウンドルールにredisのポート番号を追加する。
![_2020-10-24_16.12.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833979/a67f9395-d252-3866-6e43-0128e05285c2.png)


### EC2にログインして、疎通確認
ec2にログインし、redisクライアントをインストール。
エンドポイントからredisにアクセスし、テストデータの登録を行い確認する。

```bash
#ec2にssh接続
ssh -i [pemキー] ec2-user@[publicIP]

#yumのアップデート
yum update

#管理者権限にログイン
sudo su

#Redisクライアントのインストール
amazon-linux-extras install redis5.0

#Redisへの接続
redis-cli -c -h [エンドポイント名をコピー] -p 6379

#データを登録する
set test hogehoge

#データを取得する
get test
```

### 最後に

ElastiCacheを削除し忘れて、無料枠を超えると高額になってしまうので、
勉強用に作成する場合は、疎通確認後削除をした方が良いかと思います。