👾

イラストで理解するElastiCacheのスケーリング

2023/07/13に公開

はじめに

以前ElastiCacheについての記事を書きましたが、今回はもう少し踏み込んで
ElastiCacheのスケーリングについて学習したので記事にします。

クラスターやシャードを理解することで、どのようにスケーリングが行われているかが理解できるようになります。
クラスターとかシャードとかよくわからない!という状態から何となく雰囲気が分かるようになれば幸いです。

躓いたところ

私が学習していて躓いたのは
エンドポイントってどこにあるの?
クラスターとかシャードとかなんのためにあるの?
ElastiCache for MemcachedとElastiCache for Redisでスケーリングに違いがあるの?
しかもRedisではさらに細分化されるの?
わけわからん。。。

という感じでした。
そこで一つずつ、なぜその機能が必要なのかを考えながら紐解いていきます。

ElastiCacheのスケーリング

まず、スケーリングには2つのパターンがあります。

  • 水平スケーリング(スケールイン、アウト)
  • 垂直スケーリング(スケールアップ、ダウン)

水平スケーリングは横方向に数を増減する方法です。

垂直スケーリングは縦方向に性能をアップ、ダウンする方法です。

そして、ElastiCacheはこのどちらにも対応しています。
MemcachedとRedisでそれぞれスケーリングに特徴があります。
ここからはそれぞれの特徴とその構成要素を見ていきます。

ノード

では、構成要素を一つずつ見ていきましょう。
まずはノードです。

ノードはElastiCacheの最小単位です。
データの保存や処理を行っている核となる部分です。

そして、その上に乗っているのがノードのエンドポイントです。
エンドポイントはアプリケーションがノードに対して通信をするときの目印となるものです。

このノードは増やしたり、性能を上げることができます。
例えば、アプリケーションからの読み書きが多くなった場合に、水平または垂直にスケーリングすることができます。

クラスター

では次に、クラスターです。
これはなんのためにあるのでしょうか。

先ほどノードは増やすことができると書きました。
しかし、ノードが増えるとアプリケーションからはどのノードにデータを送ればよいのか分からなくなります。

では、どうすればいいのでしょうか?
ノードをまとめてしまえばいいのです!
ノードを一つにまとめる仕組み、これがクラスターです。

シャード

シャードについてはここで取り上げるよりも、Redisと一緒に説明した方が分かりやすいので、後ほど書きます。

ElastiCache for Memcached

では、ここからElastiCacheの各エンジンについて見ていきます。
まずはMemcachedです。

Memcachedは単純なデータに向いたマルチスレッドのインメモリデータベースです。
どのようにスケーリングするのでしょうか。

Memcachedの水平スケーリング

Memcachedの水平スケーリングは単純にノードの数が増えます。
ただし、全て同じAZです。

Memcachedのノードは水平方向に40個まで増やすことができます。
増やしたノード間でデータを分散して処理速度を上げることがきます。

ここで疑問になるのが、ノードを増やすとエンドポイントが増えますが、アプリケーション側では毎回エンドポイントを追加(or 削除)する必要があるのでしょうか?

これは、「自動検出」という機能で増減したエンドポイントを自動で見つけてくれます。
自動検出は、一つのノードが同じクラスター内の全てのノードに関するメタデータを持っていることで実現します。

このメタデータをアプリケーションが定期的にポーリングすることでアプリケーションはエンドポイントの増減を認識します。

ただし、この自動検出を設定しない場合は、手動でアプリケーション側のエンドポイントを書き換える必要があります。

Memcachedの垂直スケーリング

次に垂直スケーリングです。
垂直スケーリングは単純に性能を上げる(or 下げる)だけです。

注意点は、Memcachedの垂直スケーリング時にはクラスターを新たに作成する必要があり、
ノードのデータを引き継ぐことができません。
そのため、新たにデータを登録する必要があります。

ElastiCache for Redis

次はRedisです。
RedisはMultiAZの対応や、バックアップなど様々な機能を持ったインメモリデータベースです。

Redisでは二つのパターンを考える必要があります。

  • クラスターモード無効
  • クラスターモード有効

RedisではMemcachedとは違った動きをします。
まずは、各クラスターモードの共通部分から見ていきましょう。

Redisの水平スケーリング

まずは水平スケーリングの方法です。
Memcachedと同じように横方向にノードが増えるのですが、ノードには種類があります。

Primaryノードという読み書きができるノードと、
Replicaノードという読み取り専用のノードです。

ReplicaはPrimaryのデータを同期的にコピーします。
さらにReplicaは異なるAZに配置してMultiAZ構成をとることができます。

そして、Primaryの障害時にはReplicaがPrimaryに昇格します。

RDSのリードレプリカのような動きをします。

Primaryに対してReplicaは5つまで増やすことが可能です。
しかし、Primary1つとReplica5つでは処理が追いつかない可能性があります。
そんな時に活躍するのが「シャード」です。

シャード

シャードは1つのPrimaryと5つまでのReplicaで構成されます。
このシャードを増やすことで、データを各シャードで分散して処理することができます。

クラスターモード無効

水平スケーリング

クラスターモード無効の場合は1つのシャード内でスケーリングしますが、シャードの数を増やすことができません。

1クラスター1シャードです。
読み書きの際は、書き込みはPrimaryエンドポイント
読み込みはReaderエンドポイントを使います。

こちらの使用用途があまり思い浮かびませんでしたが、
Redis3.2以前はクラスターモードがサポートされていなかったようなので、古いバージョンのRedisに対応するには、クラスターモード無効を使うしかないようです。

垂直スケーリング

垂直スケーリングは数秒のダウンタイムが発生しますが
図のように、新しいクラスターに変更後のノードが作成されてデータがコピーされます。
そして自動的にエンドポイントが書き換えられます。

クラスターモード有効

水平スケーリング

クラスターモード有効ではシャードも増減することができます。
シャードを増やすことで処理を分散させることができます。

こちらはクラスターごとにConfigurationエンドポイントを持ちます。
クラスター毎にエンドポイントを持つということは、障害時のダウンタイムを減らすことができます。

ReplicaがPrimaryに昇格するには多少のダウンタイムが発生します。
しかし、上図のように複数のシャードでPrimaryノードを持つことで、障害時も別シャードのPrimaryを参照することができます。

AutoScalling

インスタンスタイプやリージョンなど、色々と制限があるようですがオートスケーリングもサポートしています。
細かい条件は以下をご参照下さい。
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/AutoScaling.html

オートスケーリングでは、CloudWatchのメトリクスをターゲットにシャードとレプリカの数を自動で増減してくれます。

垂直スケーリング

クラスターモード有効ではシャードを複製できるため、読み書きの処理を止めずに垂直スケーリングができます。

まとめ

MemcachedにRedisのクラスターモードと、用語もたくさん出てきてとても混乱しました。
少しでも理解のお役に立てれば幸いです。

参考資料
https://dev.classmethod.jp/articles/elasticache-cluster-mode/

GitHubで編集を提案

Discussion