メモ > サーバ > サービス: AWS > ElastiCache
■ElastiCache
キャッシュに特化したインスタンスを作成できる
大きく分けて以下3つの使い方がある
・Redis(クラスターモード無効)
・Redis(クラスターモード有効)
・Memcached
Redisについてはそれぞれ後述の「ElastiCache (Redis)」を、Memcachedについては後述の「ElastiCache (Memcached)」を参照
以下、Redisを使用する前提でElastiCacheの概要を記載する
■それぞれの関係性
ElastiCache > クラスター > シャード > ノード
■前提知識
レプリケーションとは、リアルタイムにデータをコピーする技術のこと
プライマリノードへの書き込みを、プライマリノードに紐づくすべてのセカンダリノードへ非同期的に反映する
読み込みの負荷分散や、障害対策のホットスタンバイとして使用される
シャーディングとは、データベースの負荷分散を行う手法の一つ
一つの表(テーブル)を複数の物理コンピュータに分割して記録する方式
各コンピュータは共有資源を持たずに独立しており、データが増大してもコンピュータの台数を増やしていくことで負荷に対応できる
どのデータがどのコンピュータに記録されているか把握する必要があるため、システムが複雑になる
■それぞれの役割
ノードとは、通信の主体となる個々の機器
ElastiCacheの最小単位で、データの保存領域(RAM)を持つ
設定したノードタイプによって、CPU性能や保存領域のサイズが異なる
シャードとは、ノードをまとめるグループ
データはノード間で同期され、2つ以上のノードを用いることでレプリケーションできる
1つのシャードの中には、読み書きができるプライマリーノードを1つと、読み込み専用のセカンダリノード(リードレプリカ)を0〜5個持つ
クラスターとは、シャードをまとめる論理グループ
クラスターモードが有効の場合、クラスターの中に複数(最大15個)のシャードを持つことができる
複数のシャードがあると、名前のとおりデータはシャーディングされる。つまりデータはシャード間で分割される
クラスターモードが無効の場合、クラスターの中に1つのシャードを持つ
この場合、データはもちろん分割されない
■障害時の挙動
プライマリノードで障害が発生した場合、
自動で選択されたリードレプリカがプライマリノードに昇格する
アプリケーションで利用しているエンドポイントは、変更する必要が無い
昇格にかかる数分間、プライマリノードへの書き込みの一部は失われる
リードレプリカで障害が発生した場合、
新しいノードと置き換えらえる
置き換えが行われる際、レプリカが本来行う読み込み処理をプライマリノードが引き受けるため、プライマリノードの負荷が上がる
アプリケーションで利用しているリードレプリカエンドポイントは、変更する必要がある
■ノードタイプなどの変更
クラスターモードが有効の場合、ノードタイプ・シャード数・レプリカ数・エンジンのバージョンを変更できない
変更するには、新たなクラスタを作ってデータを移行する必要がある
…だったが、2021年時点でエンジンのバージョン以外は変更できるらしい?
また2023年3月時点で、エンジンのバージョンも互換性があるバージョンに限って変更できるみたい?
クラスターモードが無効の場合、ノードタイプ・エンジンのバージョンを変更できる
ただし変更中は読み書き処理がブロックされ、インスタンスを利用できない(t2.microをt2.smallにする場合でも、10分ほどかかるみたい)
ノードタイプの変更はスケールアップのみに対応している。スケールダウンは、新しくクラスタを作る必要がある
レプリカの追加は、クラスターを停止することなくできるみたい
■メモ
基本的には「シャード1(クラスターモード無効)、ノード2」でいいかもしれない
RDSでもマルチAZは使っているものの、シャーディングするほどの規模になったことは無い
ただしクラスターモード無効の場合、パフォーマンスの天井が低いらしい。本番環境ではクラスターモード有効が推奨されるらしい
ノードタイプなどの変更には制限があるようなので、例えば意図したインスタンスタイプにスケールダウンしたい場合、
1. ElastiCacheで新たにクラスターを、スケールダウンしたい内容で作成する
2. サーバやアプリケーションの設定を変更し、新しく作成したクラスターを参照させる
3. 問題無ければ、以前のクラスターは削除する
という手順で行う必要があるかもしれない
■参考
ElastiCache + Redis に出てくる概念と、クラスタモードごとの違い - nyamadoriの日記
https://nyamadori.hatenablog.com/entry/2017/09/12/103523
ElastiCache for Redisのクラスターモードについて調べてみる | DevelopersIO
https://dev.classmethod.jp/articles/elasticache-cluster-mode/
シャードのレプリカの数を減らす - Amazon ElastiCache for Redis
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/decrease-replica-count.html
「Redis (クラスターモードが有効) のシャード、または Redis (クラスターモードが無効) のレプリケーショングループのレプリカ数を減らすことができます。」
「最小の実行として、レプリカを少なくともシャードあたり2つにすることをお勧めします。」
ElastiCache for Redis クラスターのクラスターモードが有効かどうかを一括で確認するワンライナー | DevelopersIO
https://dev.classmethod.jp/articles/elasticache-for-redis-cluster-enabled-check/
クラスターモード無効/有効の比較表がある
ElastiCache のスケーリングについてまとめてみた - サーバーワークスエンジニアブログ
https://blog.serverworks.co.jp/elasticache-scaling
「クラスターモード無効の場合、パフォーマンスの天井が低いので、本番ワークロードではクラスタモード有効が推奨」