You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
    }
}

问题根因

报错由两处配置逻辑错误共同导致:

  1. Sentinel节点认证参数配置错误:绝大多数生产部署场景下,Sentinel节点仅做服务发现,本身不会配置密码,仅后端Redis主从数据节点配置访问密码。原有配置在SENTINEL_KWARGS中传入password参数,会导致客户端连接Sentinel时直接发送AUTH命令,Sentinel默认用户未配置密码就会抛出该错误。
  2. 连接池参数透传异常:django-redis 5.2.0版本的Sentinel连接工厂自带连接池加载逻辑,手动指定SentinelConnectionPool会打断参数透传流程,导致Sentinel发现主节点地址后,创建数据节点连接时无法正确读取密码配置,触发提前校验报错。

修复步骤

  1. 先验证Sentinel节点认证配置:在Pod内执行redis-cli -h {任意Sentinel节点IP} -p 26379连接Sentinel,执行ping命令,如果直接返回PONG说明Sentinel本身未配置密码,直接删除SENTINEL_KWARGS配置项即可;如果需要密码认证,再保留该项并填入Sentinel专用密码。
  2. 删除OPTIONS中手动配置的CONNECTION_POOL_CLASS项,使用django-redis默认的Sentinel连接池加载逻辑。
  3. 新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:39:20