コンテンツにスキップ

ElastiCache@AWSリソース

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. ElastiCacheとは

アプリケーションの代わりに、セッション、クエリキャッシュ、DB排他制御 (分散ロック) などを管理する。

RedisとMemcachedがある。


02. ElastiCache for Redis

ElastiCache for Redisとは

記入中...


02-02. セットアップ

コンソール画面の場合

▼ 設定項目と説明

設定項目 説明 補足
クラスターエンジン 全てのRedisノードのキャッシュエンジンを設定する。Redis通常モード、Redisクラスターモードから選択する。 Redisクラスターモードと同様に、Redis通常モードもクラスター構成になる。ただし、クラスターモードとはクラスターの構成方法が異なる。
ロケーション
エンジンバージョンの互換性 全てのRedisノードのキャッシュエンジンのバージョンを設定する。 マイナーバージョンが自動的に更新されないように、例えば『6.x』は設定しない方が良い。
パラメーターグループ 全てのRedisノードのグローバルオプションを設定する。 デフォルトを使用せずに自前定義する場合、事前に作成しておく必要がある。
ノードのタイプ
レプリケーション数 プライマリーノードとは別に、リードレプリカノードをいくつ作成するかを設定する。 マルチAZにプライマリーノードとリードレプリカノードを 1個ずつ配置させる場合、ここでは『1個』を設定する。
マルチAZ プライマリーノードとリードレプリカを異なるAZに配置するか否かを設定する。合わせて、自動フェイルオーバーを実行できるようになる。
サブネットグループ Redisにリクエストを送信できるサブネットを設定する。
セキュリティ セキュリティグループを設定する。
クラスターへのデータのインポート あらかじめ作成しておいたバックアップをインポートし、これを元にRedisを作成する。 セッションやクエリキャッシュを引き継げる。そのため、新しいRedisへのセッションデータの移行に役立つ。
https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/backups-seeding-redis.html
バックアップ バックアップの有効化、保持期間、時間を設定する。 バックアップを取るほどでもないため、無効化しておいて問題ない。
メンテナンス メンテナンスの時間を設定する。


Redisクラスター

▼ Redisクラスターとは

複数のRedisノードを持つRedisシャードから構成されている。

1個のリクエストを処理するグループ単位である。

redis-cluster

▼ クラスターモード

クラスターモードを有効化すると、Redisクラスター内に複数のRedisシャードを作成する。

反対に無効化すると、シャードは 1個だけ作成される。


Redisシャード

▼ Redisシャードとは

Redisノードのグループであり、処理の実行単位でもある。

同じデータを保管するグループ単位であり、プライマリーノードとレプリカノードが含まれる。

同じRedisシャード内にあるRedisノード間では、セッションやクエリキャッシュが同期される。

一方で、AuroraのDBクラスターはこれに相当する概念である。


Redisノード

▼ Redisノードとは

セッションやクエリキャッシュを保管するインスタンスのこと。


セッション管理機能

▼ セッション管理機能とは

アプリがセッションIDを管理する代わりに、セッションIDを管理する。

冗長化されたそれぞれのアプリケーションは、ユーザーのログイン後に、ElastiCacheから共通のセッションIDを取得する。

ElastiCacheのセッション管理機能

▼ ElastiCacheを使用しない場合

アプリが特にコンテナの場合にアプリでセッションデータを管理してしまうと、該当のセッションを持ったコンテナがセッションデータを他のコンテナに引き継げずに、スケールイン/スケールアウトしてしまう。

一方で、ElastiCacheに管理を切り分けることにより、コンテナがスケールイン/スケールアウトしても、既存のセッションデータをログイン状態を保管できるようになる。


クエリキャッシュ管理機能

▼ クエリキャッシュ管理機能とは

AWS RDSに対するSQLと読み出されたデータを、キャッシュとして管理する。

DB側でのクエリキャッシュはパフォーマンス上の問題から廃止になっており、DBからクエリキャッシュ機能を切り分けたElastiCacheが必要になる。

クエリCache管理機能_1

▼ 仕組み

(1)

アプリケーションは、AWS RDSの前に、Redisに対してSQLを実行する。

SELECT * FROM users;
(2)

始めて実行されたSQLの場合、RedisはSQLをキーとして保管し、キャッシュが無いことがアプリケーションに返却する。

(3)

アプリケーションはAWS RDSに対してSQLを実行する。

(4)

データが読み出される。

(5)

アプリケーションはRedisにデータを登録する。

# ElastiCacheには、SQLの実行結果がまだ保管されていない

*** no cache ***
{"id"=>"1", "name"=>"alice"}
{"id"=>"2", "name"=>"bob"}
{"id"=>"3", "name"=>"charles"}
{"id"=>"4", "name"=>"donny"}
{"id"=>"5", "name"=>"elie"}
{"id"=>"6", "name"=>"fabian"}
{"id"=>"7", "name"=>"gabriel"}
{"id"=>"8", "name"=>"harold"}
{"id"=>"9", "name"=>"Ignatius"}
{"id"=>"10", "name"=>"jonny"}

クエリCache管理機能_2

(6)

次回、アプリケーションは、AWS RDSの前に、Redisに対してSQLを実行する。

SELECT * FROM users;
(7)

Redisは、SQLをキーにしてデータを特定し、アプリケーションに返却する。

# ElastiCacheには、SQLの実行結果が既に保管されている

*** cache hit ***
{"id"=>"1", "name"=>"alice"}
{"id"=>"2", "name"=>"bob"}
{"id"=>"3", "name"=>"charles"}
{"id"=>"4", "name"=>"donny"}
{"id"=>"5", "name"=>"elie"}
{"id"=>"6", "name"=>"fabian"}
{"id"=>"7", "name"=>"gabriel"}
{"id"=>"8", "name"=>"harold"}
{"id"=>"9", "name"=>"Ignatius"}
{"id"=>"10", "name"=>"jonny"}

▼ クエリキャッシュの操作

# Redis接続コマンド
$ /usr/local/sbin/redis-stable/src/redis-cli \
    -c \
    -h <Redisのホスト名> \
    -p 6379
# Redis接続中の状態
# 全てのキーを表示
redis *****:6379> keys *
# Redis接続中の状態
# キーを指定して、対応する値を表示
redis *****:6379> type <キー名>
# Redis接続中の状態
# Redisが受け取ったコマンドをフォアグラウンドで表示
redis *****:6379> monitor


障害対策

▼ Redisのフェイルオーバー

プライマリーノードで障害が起こった場合に、リードレプリカノードをプライマリーノードに自動的に昇格する。

障害の発生したノード 挙動
プライマリーノード リードレプリカの 1個がプライマリーノードに昇格し、障害が起きたプライマリーノードと置き換わる。
リードレプリカノード 障害が起きたリードレプリカノードが、別の新しいものに置き換わる。


Redisクラスターのダウンタイム

▼ ダウンタイムの発生条件

変更する項目 ダウンタイムの有無 ダウンタイム
エンジンバージョン あり 130秒ほどのダウンタイムが発生する。


計画的なダウンタイム

▼ 計画的なダウンタイムとは

Redisクラスターでは、設定値 (例:エンジンバージョン) のアップグレード時に、Redisノードの再起動が必要である。

サイトの利用者に与える影響を小さくできるように、計画的にダウンタイムを発生させる必要がある。

▼ バックアップとインポートによるダウンタイムの最小化

以下の手順で、ダウンタイムを最小限にしてアップグレードできる。

(1)

RedisのセッションやクエリキャッシュをS3にエクスポートする。

(2)

新しいRedisを作成する。この時、インポートを使用して、セッションやクエリキャッシュを引き継いだRedisクラスターを別途作成する。

(3)

新しく作成したRedisクラスターをアップグレードする。

(4)

アプリケーションの接続先を古いRedisクラスターから新しいものに変更する。

(5)

古いRedisクラスターを削除する。