メモ > サーバ > サービス: AWS > ElastiCache
ElastiCache
キャッシュに特化したインスタンスを作成できる。
大きく分けて以下3つの使い方がある。
・Redis(クラスターモード無効)
・Redis(クラスターモード有効)
・Memcached
Redisについてはそれぞれ後述の「ElastiCache (Redis)」を、Memcachedについては後述の「ElastiCache (Memcached)」を参照。
以下、Redisを使用する前提でElastiCacheの概要を記載する。
■それぞれの関係性
ElastiCache > クラスター > シャード > ノード
■前提知識
ElastiCacheを設定していると、「レプリケーション」「シャード」といった言葉が出てくる。
データベース(MySQLやPostgreSQLなど)の本番運用でも出てくる言葉ではある。
レプリケーションとは、リアルタイムにデータをコピーする技術のこと。
プライマリノードへの書き込みを、プライマリノードに紐づくすべてのセカンダリノードへ非同期的に反映する。
読み込みの負荷分散や、障害対策のホットスタンバイとして使用される。
書き込みは原則として一ヶ所。
バックアップのための仕組みではなく、可用性向上のための仕組み。
シャーディングとは、データベースの負荷分散を行う手法の一つ。
一つの表(テーブル)を複数の物理コンピュータに分割して記録する方式。
各コンピュータは共有資源を持たずに独立しており、データが増大してもコンピュータの台数を増やしていくことで負荷に対応できる。
どのデータがどのコンピュータに記録されているか把握する必要があるため、システムが複雑になる。
【MySQL】レプリケーションの設定をしろって言われたんです。 #初心者 - Qiita
https://qiita.com/suzuko24/items/ace0a08f2b2aabd95045
データベースシャーディングとは?概要やメリット・デメリットを解説
https://products.sint.co.jp/siob/blog/sharding
なおWebサーバと違い、データベースの負荷分散は書き込みも含めると容易ではない。
自力で設定することはできなくも無いが、設計も設定も障害時の対応も複雑なので、可能な限りマネージドサービスに任せたいところ。
RDSではそれを解消するサービスが発表されているが、以前調べたときは高額だったので見送った。
【新機能】 書き込み性能をスケールできる Amazon Aurora Limitless Database のプレビューが開始されました #AWSreInvent | DevelopersIO
https://dev.classmethod.jp/articles/amazon-aurora-limitless-database-with-automatic-horizontal-scali...
■それぞれの役割
ノードとは、通信の主体となる個々の機器。
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
> クラスターモード無効の場合、パフォーマンスの天井が低いので、本番ワークロードではクラスタモード有効が推奨