#背景
springで作成したアプリのセッションをredis-clusterで管理しようとしたらハマってしまいました。
springを起動しようとすると
以下のようなエラーが発生していて、内容的には「redisの情報が取れませんでしたよ」と言うことみたいで、
なぜ情報が取れていないのかがわかりませんでした。
org.springframework.data.redis.ClusterStateFailureException: Could not retrieve cluster information. CLUSTER NODES returned with error.
なので、忘れないようにこちらに残しておきます。
※ あくまでredis-clusterでハマった話なので、今回はspringとどうやって接続したかなどは書きません。ご了承ください。
#環境
redis 6.0.10
#クラスターモードに設定し、接続できるIPを開放
cluster-enabled yes
cluster-node-timeout 8000
bind 0.0.0.0
#原因
dockerのbridgeネットワーク上にあるredisに外部からアクセスした時に、「ここにリダイレクトしろ」とdockerネットワーク内のIPアドレスとポートがクライアントに返ってくるのだけど、返ってきたIPとポートは外部アクセスするときのIPではなく、dockerネットワーク内のIPなので接続ができずエラーが返ってきていました。
引用サイト: A Redis Cluster of any size using Docker Compose and Redis 4.0 port-forwarding
https://get-reddie.com/blog/redis4-cluster-docker-compose/
詳しい内容は上記イメージを引用したサイトをお読みください。
#解決策
簡潔に言うと
redis4.0以降では
下記の設定をredisのconfigファイルに追加すれば良いと言うことに気付きました。
cluster-announce-ip: 制御するredis-cluster のipアドレス
#クラスターモードに設定し、接続できるIPを開放
cluster-enabled yes
cluster-node-timeout 8000
bind 0.0.0.0
#redisクラスターのノードのリダイレクトさせるときのIPアドレス
#今回はローカルとの接続がしたいので127.0.0.1に設定
cluster-announce-ip 127.0.0.1
cluster-announce-ipをconfigに追加することで、返ってくる「ここにリダイレクトしろ」のIPアドレスがcluster-announce-ipの中身に変換されて返ってきます。これで正常にredisの情報の取得」ができました。
#参考、引用情報
以下の記事が参考になりました。
A Redis Cluster of any size using Docker Compose and Redis 4.0 port-forwarding
https://get-reddie.com/blog/redis4-cluster-docker-compose/
日本語訳版
https://qiita.com/Reddie_Japan/items/75d26bfc0dfaeab6a5c3