イラストで理解するElastiCacheのスケーリング
はじめに
以前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
インスタンスタイプやリージョンなど、色々と制限があるようですがオートスケーリングもサポートしています。
細かい条件は以下をご参照下さい。
オートスケーリングでは、CloudWatchのメトリクスをターゲットにシャードとレプリカの数を自動で増減してくれます。
垂直スケーリング
クラスターモード有効ではシャードを複製できるため、読み書きの処理を止めずに垂直スケーリングができます。
まとめ
MemcachedにRedisのクラスターモードと、用語もたくさん出てきてとても混乱しました。
少しでも理解のお役に立てれば幸いです。
参考資料
Discussion