ElastiCache for Redisのクラスターモードについて調べてみた

2022.06.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、つくぼし(tsukuboshi0755)です!
最近ElastiCache for Redisを触る機会があったのですが、触っている時にクラスターモードという機能がある事を知りました。
このクラスターモードについて個人的に調べてみたので、共有してみたいと思います。

クラスターモードで登場する単語

クラスターモードを理解する上で、前提となる単語を解説します。

用語 説明
Redisクラスター 単一または複数のシャードで構成されるグループ。
Redisにアクセスする際のエンドポイントを提供する。
シャード プライマリノード(1個) + レプリカノード(0-5個)で構成されるノードグループ。
Redisクラスター内に、最低1つ以上存在する。
プライマリノード 読み取り/書き込み両方可能なノード。
シャード1つにつき、必ず1個作成される。
レプリカノード 読み取りのみ可能なノード。
シャード1つにつき、0-5個のいずれかで作成可能。
マルチAZを有効化する場合、最低1個以上作成する必要がある。

図にするとこんな感じで整理できます。

クラスターモード無効化の場合

クラスターモードを無効化した場合、シャード数は1で固定となります。
またRedisクラスターにアクセスするためのエンドポイントとして、書き込み用途のプライマリエンドポイントと、読み取り用途のリーダーエンドポイントの2種類が提供されます  

クラスターモードを無効化するべき場面としては、主に以下が挙げられます。

1.エンドポイントを書き込み/読み取り用途で使い分けたい場面

クラスターモードを無効化した場合、Redisクラスターのエンドポイントを書き込み用途と読み取り用途で使い分けできます。

例えば、あるアプリケーションでは、Redisに対する読み取り回数が多く、書き込み処理にも影響が生じる恐れがあるとします。

その場合、アプリケーション側でエンドポイントを書き込み用途と読み取り用途で使い分ける事で、Redisクラスター内のノード数を増やさずに、負荷を分散させる事が可能です。

2.Redis3.2より前のバージョンを使用したい場面

クラスターモードは、Redis3.2以降でしかサポートされていません。

そのため、3.2よりも前のバージョンのRedisしか対応していないアプリケーションで使用したい場合は、必然的にクラスターモードを無効にする必要があります。

3.RedisのAOF(Append-Only File)機能を使用したい場面

Redisには、データの耐久性を保証するために"Append-Only File"という機能が存在します。

この機能を有効化する場合は、クラスターモードを無効化し、かつマルチAZを無効化する必要があります。

なお、AOFはRedis2.8.22以降ではサポートされておらず、代わりにマルチAZを有効化する事が推奨されています。

AOFに関する詳細は、以下のAWS公式ドキュメントに記載されています。

クラスターモード有効化の場合

クラスターモードを有効化した場合、シャード数は1-15の間で増減可能となります。
またRedisクラスターにアクセスするためのエンドポイントとして、設定エンドポイントのみが提供されます。
なお、クラスターモードを有効化した場合、マルチAZは強制的に有効化されます。

クラスターモードを有効化するべき場合としては、主に以下が挙げられます。

1.Redisクラスター内のノードをスケールアウトしたい場面

今後Redisへの書き込み/読み取り負荷が増大し、ノードをスケールアウトする可能性がある場合は、シャードの数を増減可能にするためにクラスターモードの有効化を推奨します。

特に書き込み用途のプライマリノードは、シャード内では1つしか作成できないため、シャード数を増やす事でしかスケールアウトできません。

また読み取り用途のレプリカノードも、シャード内では5つしか作成できないため、シャード数を増やす事で6つ以上にスケールアウトする事ができます。

2.プライマリノードのダウンタイムを最小限に抑えたい場面

マルチAZを有効化したRedisクラスターにて、AZ障害が原因でシャード内のプライマリノードがダウンした場合、ElastiCacheが障害を検知し、レプリカノードをプライマリノードに昇格させる事で復旧します。

ただし、シャードが1つの場合、AZ障害が起こってからノード昇格が完了するまではプライマリノードが一時的に0個になってしまうため、その間は書き込み処理が行えなくなります。

書き込み処理が少しでも止まってしまうと困るという場合は、クラスターモードを有効化してシャードを複数個作成し、プライマリノードを別々のAZに配置する事を推奨します。

そのようにする事で、1個のプライマリノードにAZ障害が起きても別のプライマリノードを使用できるため、プライマリノードのダウンタイムを最小限に抑える事が可能です。

最後に

クラスターモードを無効化/有効化した場合の違いについて、ご理解頂けましたでしょうか。

マルチAZとは別のRedis独自の機能なので、初見では理解が難しいですよね。(私も理解に苦戦しました...)
こちらの記事が、誰かのお役に立ちますと幸いです。

以上、つくぼしでした!