Amazon ElastiCache for Memcachedのノード管理と自動検出

ElastiCache for Memcachedのクラスターとノード、クライアント側の振り分け、自動検出、スケーリング、障害時のキャッシュ再構築を学びます。

学習順Step 98 / 101サービスデータベース試験ドメイン開発

Amazon ElastiCache for Memcachedは、インメモリーキャッシュのノードをまとめて運用するマネージドサービスです。AWSはクラスター内のノードを監視し、障害が検出されたノードを置き換えます。置き換えには数分かかる場合があり、その間は失敗したノードのエンドポイントが一覧に残ることがあります。一方、キャッシュキーをどのノードに保存し、要求をどのノードへ送るかはMemcachedエンジンやAWS側のロードバランサーが決めるのではなく、アプリケーションのMemcachedクライアントが担います。

クラスターとノードの構造

Memcachedクラスターは、1つ以上のキャッシュノードで構成されます。各ノードは個別のメモリーとエンドポイントを持ち、クライアントはそのノードへMemcachedプロトコルで接続します。複数ノードを使うと、クライアントがキーを分散してキャッシュ容量と処理能力を増やせます。

ElastiCacheはノードのヘルス状態を監視し、障害ノードを検出するとサービス管理下で置き換えます。この管理は、ノードの計算資源を回復させるものです。Memcachedにはノード間レプリケーションがないため、置き換え前のノードに存在したキャッシュ値が復元されるわけではありません。ノードの再作成中に接続や要求が失敗することもあるので、クライアントは再試行や再接続を行います。失われたキーへの要求はミスとして扱い、データベースなどの正本から再取得します。

Memcachedクライアントが複数ノードへキーを分散し、ミス時に正本のデータストアへ戻る流れ

現在のAWSガイドではMemcachedクラスターは1〜60ノードで構成すると説明されています。以前使われていた1〜20ノードという上限を、現在の全クラスターに適用される値として扱わないようにします。実際に作成できる構成はサービスクォータやノードタイプなどの条件も受けるため、設計時にはAWSサービスクォータでElastiCacheの現在の上限を確認してください。

ノードの選択はクライアント側で行う

Memcachedプロトコルの要求にはキーが含まれますが、Memcachedクラスターがキーをノードへ振り分ける機能はありません。クライアントライブラリーがクラスターのノード一覧を持ち、キーをハッシュして接続先を選択します。同じキーに同じルールを適用することで、読み書きのたびに同じノードへ到達できます。

たとえば、音楽配信アプリケーションが人気プレイリストの表示情報をキャッシュする場合、クライアントはプレイリストIDからノードを選び、そのノードへ値を保存・取得します。AWSがアプリケーションの要求をクラスター内の各ノードに自動分散するわけではありません。ノード一覧を手作業で固定する場合は、クラスターの変更に合わせてクライアントの設定も更新する必要があります。

ノードエンドポイントを個別に指定する

クライアント設定に各ノードのエンドポイントを登録し、クライアントライブラリーで分散先を選ぶ方法です。ノードの追加や削除、障害後の置き換えでエンドポイント一覧が変わった場合は、新しい一覧を取得してアプリケーション側の設定へ反映します。

AWS CLIでは、クラスターのノード情報を次のように照会できます。

aws elasticache describe-cache-clusters \
  --cache-cluster-id event-cache-prod \
  --show-cache-node-info

応答に含まれる各ノードのエンドポイントを使ってクライアントを構成します。コマンドによる情報取得は管理操作であり、それ自体がアプリケーションのMemcached要求を振り分けるものではありません。ノード一覧の更新を手動にすると、変更の反映漏れや古い接続先の利用が起こりやすくなります。

Auto Discoveryでノード一覧を更新する

ElastiCache for Memcachedは、クラスターの構成エンドポイントを提供します。Auto Discoveryに対応したMemcachedクライアントを使うと、クライアントはその接続先を通じてノード構成を取得し、ノード一覧を更新できます。ElastiCache Cluster Clientでは標準で1分ごとに一覧を再取得し、この間隔は変更できます。ノードの追加・削除のたびに、アプリケーション設定へすべてのノードエンドポイントを手入力する運用を減らせます。

ここでいうAuto Discoveryは、対応クライアントがキャッシュクラスターのノード情報を取得する機能です。AWS SDKや管理APIはクラスター情報を照会できますが、一般的なAWS SDKがMemcachedのキーをクラスター内へ振り分けるわけではありません。キャッシュデータの読み書きにはMemcachedプロトコルに対応したクライアントが必要です。

Auto Discoveryはノード一覧を追従させるもので、キャッシュデータをノード間で複製する機能ではありません。構成変更後にキーとノードの対応が変わると、以前保存した値を別ノード上で見つけられず、キャッシュミスになる場合があります。クライアントライブラリーが使うハッシュ方式や再接続の動作を理解し、ミス時のフォールバックを設計します。

スケーリングと接続先の更新

ElastiCache for Memcachedでは、ワークロードに応じてノードの計算資源を大きくするスケールアップと、クラスターへノードを追加するスケールアウトを検討できます。大きいノードへ変更すると個々のノードで扱えるメモリーや処理資源を増やせます。ノード追加ではキャッシュ容量と並列処理能力を広げられますが、データを割り当てるノード構成が変わります。

ノード数の変更やノードの入れ替えの後も、アプリケーションが正しい構成を参照できる必要があります。個別のノードエンドポイントを管理しているなら一覧を更新し、構成エンドポイントを利用するならAuto Discovery対応クライアントが変更を認識することを確認します。クライアントや設定を置き換えるために新しいクラスターを作成した場合、クラスター固有のエンドポイントも新しいものに切り替えます。

構成変更でキーの割り当て先が変わると、キャッシュヒット率が一時的に低下し、正本への読み取りが増える可能性があります。スケーリング前後にはデータベースの負荷、キャッシュミス率、ノードごとのメモリー使用量を監視します。負荷が急増したときに正本が耐えられるか、必要であればキャッシュを段階的に温め直せるかも確認します。

障害時に必要なアプリケーション設計

Memcachedはキャッシュの内容を一時データとして扱います。ノード障害やクラスター変更で値が失われても正本から回復できることが重要です。具体的には、キャッシュミス後のデータ取得、正本への同時要求が集中した際の負荷抑制、接続タイムアウトと再試行の上限、値のTTLを設計します。

クライアント側のハッシュ方式も可用性と再配置量に関係します。ノード追加時に多くのキーが別ノードへ移る方式ではキャッシュミスが広範囲に増える可能性があります。コンシステントハッシュを使うクライアントでは、ノード構成の変化による再配置を抑えられることがありますが、同じクライアント設定とノード構成を維持し、実装の挙動を確認する必要があります。

Memcachedクラスター内には、ValkeyやRedis OSSのようなレプリカや自動フェイルオーバーを設けません。ElastiCacheによるノード交換はサービス運用上の復旧を助けますが、値の複製やアプリケーションの読み取り先切り替えとは異なります。可用性の要件を満たすには、キャッシュ停止・欠損時にも正本を使って処理を継続できるようにします。

Memcachedを選ぶときの判断

要件 Memcachedでの考え方
単純なキー・バリュー値を低レイテンシーでキャッシュしたい ノードへキーを分散するクライアントを使う
キャッシュ容量や並列処理量を増やしたい ノードを大きくするか追加し、構成変更時の再配置と負荷を確認する
ノード変更時の手動設定を減らしたい 構成エンドポイントとAuto Discovery対応クライアントを検討する
ノード上のデータを複製して障害時も維持したい Memcachedの設計範囲外。レプリケーションやフェイルオーバーを備える別エンジンを検討する
キャッシュを永続データとして保護したい 正本を別に保ち、復旧元から再生成する。Memcachedをデータベースとして扱わない

公式ドキュメント

重要ポイント

  • ▸Memcachedクラスターは複数のキャッシュノードで構成され、AWSがノードの状態を監視して障害ノードを置き換える
  • ▸Memcachedエンジン自体はキーをノードに振り分けず、クライアントライブラリーがノード一覧とハッシュ方式を使って接続先を決める
  • ▸ノードエンドポイントを個別に管理する方法と、構成エンドポイントとAuto Discovery対応クライアントを使う方法を区別する
  • ▸ノード追加・削除やノード置換でキーの配置が変わるとキャッシュミスが発生するため、正本から再取得する経路を用意する
  • ▸現在のAWSガイドではMemcachedクラスターを1〜60ノードとしている。以前の1〜20ノードという上限は現在の共通仕様ではない

このトピックの学習を完了しますか?

完了状態はいつでも切り替えられます