Django使用django-redis连接Redis Sentinel报AUTH配置错误
django-redis连接Redis Sentinel报AUTH配置错误修复方案
问题场景
- 部署环境:服务运行在Kubernetes集群,Redis Sentinel部署在集群外可正常访问的节点
- 版本信息:Redis 6.2.6,django-redis 5.2.0
- 现象:Pod内通过
redis-cli -h {master-ip} -p 6379 -a {password}直连Redis主节点可正常通信,但Django服务启动初始化缓存时抛出异常
报错信息如下:
ERROR - create_cache: AUTH
called without any password configured for the default user. Are you sure your configuration is correct?
- 已尝试操作:移除配置中的
"CONNECTION_POOL_CLASS": "redis.sentinel.SentinelConnectionPool"项,问题未解决
原有配置
# redis connection factory DJANGO_REDIS_CONNECTION_FACTORY = 'django_redis.pool.SentinelConnectionFactory' # These sentinels are shared between all the examples, and are passed # directly to Redis Sentinel. These can also be defined inline. SENTINELS = [ (env('REDIS_SENTINEL_IP_1'), 26379), (env('REDIS_SENTINEL_IP_2'), 26379), (env('REDIS_SENTINEL_IP_3'), 26379) ] CACHES = { "default": { "BACKEND": env('DJANGO_CACHE_BACKEND_REDIS'), # THE HOSTNAME IN LOCATION is the primary (service/master) name # example : redis://dev-redis/db # example : redis://staging-redis/db "LOCATION": env('DJANGO_CACHE_LOCATION_REDIS'), "OPTIONS": { # django_redis.client.SentinelClient "CLIENT_CLASS": env('DJANGO_CACHE_CLIENT_CLASS'), "SENTINELS": SENTINELS, "SENTINEL_KWARGS":{'password':env('REDIS_PASSWORD_VALUE')}, 'PASSWORD': env('REDIS_PASSWORD_VALUE'), "CONNECTION_POOL_CLASS": "redis.sentinel.SentinelConnectionPool", }, "KEY_PREFIX": "mapsvc" } }
问题根因
报错由两处配置逻辑错误共同导致:
- Sentinel节点认证参数配置错误:绝大多数生产部署场景下,Sentinel节点仅做服务发现,本身不会配置密码,仅后端Redis主从数据节点配置访问密码。原有配置在
SENTINEL_KWARGS中传入password参数,会导致客户端连接Sentinel时直接发送AUTH命令,Sentinel默认用户未配置密码就会抛出该错误。 - 连接池参数透传异常:django-redis 5.2.0版本的Sentinel连接工厂自带连接池加载逻辑,手动指定
SentinelConnectionPool会打断参数透传流程,导致Sentinel发现主节点地址后,创建数据节点连接时无法正确读取密码配置,触发提前校验报错。
修复步骤
- 先验证Sentinel节点认证配置:在Pod内执行
redis-cli -h {任意Sentinel节点IP} -p 26379连接Sentinel,执行ping命令,如果直接返回PONG说明Sentinel本身未配置密码,直接删除SENTINEL_KWARGS配置项即可;如果需要密码认证,再保留该项并填入Sentinel专用密码。 - 删除OPTIONS中手动配置的
CONNECTION_POOL_CLASS项,使用django-redis默认的Sentinel连接池加载逻辑。 - 新增
REDIS_CLIENT_KWARGS配置项,明确指定Redis数据节点的连接参数,确保密码在Sentinel切换主节点后仍能正常透传。
修正后的配置参考:
# redis connection factory DJANGO_REDIS_CONNECTION_FACTORY = 'django_redis.pool.SentinelConnectionFactory' SENTINELS = [ (env('REDIS_SENTINEL_IP_1'), 26379), (env('REDIS_SENTINEL_IP_2'), 26379), (env('REDIS_SENTINEL_IP_3'), 26379) ] CACHES = { "default": { "BACKEND": env('DJANGO_CACHE_BACKEND_REDIS'), # LOCATION格式为redis://<Sentinel配置的master服务名>/<数据库编号> "LOCATION": env('DJANGO_CACHE_LOCATION_REDIS'), "OPTIONS": { "CLIENT_CLASS": "django_redis.client.SentinelClient", "SENTINELS": SENTINELS, # 仅当Sentinel节点本身配置了密码时,才添加SENTINEL_KWARGS配置 # "SENTINEL_KWARGS": {"password": env('REDIS_SENTINEL_PASSWORD')}, "PASSWORD": env('REDIS_PASSWORD_VALUE'), # 明确指定数据节点连接参数,避免密码透传失败 "REDIS_CLIENT_KWARGS": { "password": env('REDIS_PASSWORD_VALUE'), "username": "default" } }, "KEY_PREFIX": "mapsvc" } }
连接验证
配置修改后重启Django服务,进入Django shell执行以下命令验证连通性:
from django.core.cache import cache cache.set("sentinel_test", "connect_success", 30) print(cache.get("sentinel_test"))
如果返回connect_success说明连接正常。如果仍存在认证错误,再检查Redis所有节点的配置:确保Sentinel配置文件中masterauth参数值和Redis数据节点的requirepass参数值一致。
内容的提问来源于stack exchange,提问作者Kim Juyeon
相关产品推荐
相关产品推荐

