RedisのMOVEDエラーとは何か

こんにちは、TRYT開発課の成阪です。

クラスター有効のElastiCache Redisに接続した際に以下のエラーが発生しました。 Redisを利用するのは今回のプロジェクトが初だったので、今後のために調べたことを残しておきます。

発生したエラー

elasticache redis MOVED 11637 192.168.112.18:6379`

エラーの原因

MOVED というエラー自体は Redis Cluster のもので、アクセス対象のデータを持っているノードへのリダイレクトらしい。 https://redis.io/topics/cluster-spec

MOVED Error from Redis Cluster(AWS Elasticache) by redis-go - pospomeのプログラミング日記

上記の記事で言及されている Redis公式ドキュメントは以下のように記載されています。

クラスタノードはリクエストをプロキシできないので、クライアントはリダイレクトエラー -MOVED と -ASK を使用して他のノードにリダイレクトされることがあります。クライアントは理論的には自由にクラスタ内のすべてのノードにリクエストを送ることができ、必要に応じてリダイレクトされるので、クライアントはクラスタの状態を保持する必要はない。しかし、キーとノード間のマップをキャッシュすることができるクライアントは、賢明な方法でパフォーマンスを向上させることができます。
Since cluster nodes are not able to proxy requests, clients may be redirected to other nodes using redirection errors -MOVED and -ASK. The client is in theory free to send requests to all the nodes in the cluster, getting redirected if needed, so the client is not required to hold the state of the cluster. However clients that are able to cache the map between keys and nodes can improve the performance in a sensible way.

「MOVED」でドキュメントを検索するとリダイレクトに関する仕様が記載されているので、詳しくは公式ドキュメントをお読みください。

エラーの解決方法

ElastiCache Redisでクラスター有効にした場合、プライマリエンドポイントとリーダーエンドポイントではなく、「設定エンドポイント」が用意されます。

アプリケーションのRedisクライアントからは「設定エンドポイント」をホストとして設定することで、クラスターに接続できるようになります。

補足

弊社環境では ioredis を利用しているのですが、設定エンドポイントを指定しても ioredis 側でエラーが発生し接続できていないので、利用しているクライアントによっては、また別の対応が必要かもしれないです。

ElastiCache Redis Clusterioredis の接続エラーはまだ解決できていないので、解決でき次第またブログを書きます。
ClusterAllFailedError: Failed to refresh slots cache. · Issue #1003 · luin/ioredis

参考