How to configure and connect redis cluster correctly?
zhang-haiyang opened this issue · 2 comments
Version information:
django-redis: 5.4.0
redis(py): 5.0.1
redis(server): 7.0
I wrote my own configuration as described in the diango-redis documentation for redis clusters, which is as follows:
Then, I use the following method in the code to get one of the data in the redis cluster:
But an error message appeared:
Error: MOVED 5798 my_ip:my_port
I think this is probably due to not connecting in a cluster mode when the client connects, I know that the redis client's command when connecting to the cluster is: redis-cli -c ....
But in diango-redis, how can I modify my configuration so that I can properly connect to the redis cluster?
Looking forward to your reply, thank you!
@zhang-haiyang As far as I am aware there is no official support for Redis Cluster here in django-redis.
For a time the actual https://github.com/redis/redis-py client had no support for it either. One way to approach it was https://github.com/Grokzen/redis-py-cluster + https://github.com/jazzband/django-redis/ ...
Recently, though, https://github.com/Grokzen/redis-py-cluster became deprecated because most of that functionality landed in https://github.com/redis/redis-py (🎉)
So far, django-redis doesn't support the new cluster functionality of redis-py. There's some chatter about that over in #606 but mostly just snippets and brainstorms.
I've been meaning to push on that a bit more, but haven't had bandwidth. (But I think I need to figure that out before I can get to Django 4+ so probably can't wait toooooo long.)
I think it's doable... probably need to understand how django-redis wants to integrate cluster stuff into its test suite, though, and I think there might be some typing stuff to think about because RedisCluster and Redis client are separate class hierarchies, but I don't think there's any real big barriers.
What are the caveats of using this approach?
from django_redis.client import DefaultClient
from redis.cluster import RedisCluster
class ClusterClient(DefaultClient):
"""Cluster enabled client."""
def connect(self, index=0):
"""Override to connect properly."""
return RedisCluster.from_url(self._server[index])
I guess it should work for commands that behave the same in single instance and cluster mode. Or will it break horribly in some cases?