news 2026/6/22 23:55:39

单机docker部署的redis sentinel,使用python调用redis,报错

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单机docker部署的redis sentinel,使用python调用redis,报错

在使用单机 Docker 部署 Redis Sentinel 后, Python 调用报MasterNotFoundError + TimeoutError,核心原因是Docker 网络配置问题(容器端口未映射/IP 访问不到)或Sentinel 配置错误(监控的主节点是容器内部 IP,Python 无法解析)。以下是针对「单机 Docker 部署」的专属排查和解决方案:

先明确单机 Docker 部署的典型架构

单机部署时,通常会启动 3 个容器:1 个 Redis 主节点、1 个 Redis 从节点、3 个 Sentinel 节点(或至少 1 个),但所有容器都运行在同一台宿主机上,需通过「宿主机 IP + 映射端口」访问,而非容器内部 IP。

步骤1:检查 Docker 容器端口映射(最核心)

1.1 查看容器端口映射情况

执行docker ps,查看 Redis 主/从、Sentinel 容器的端口映射,示例正常输出:

CONTAINER ID IMAGE COMMAND PORTS NAMES xxx redis:sentinel "redis-sentinel /etc/…" 0.0.0.0:26380->26379/tcp sentinel1 xxx redis:sentinel "redis-sentinel /etc/…" 0.0.0.0:26381->26379/tcp sentinel2 xxx redis:sentinel "redis-sentinel /etc/…" 0.0.0.0:26382->26379/tcp sentinel3 xxx redis "docker-entrypoint.s…" 0.0.0.0:6379->6379/tcp redis-master xxx redis "docker-entrypoint.s…" 0.0.0.0:6380->6379/tcp redis-slave

✅ 关键:Sentinel 容器的PORTS列必须是0.0.0.0:宿主机端口->26379/tcp(如26380->26379),Redis 主节点是6379->6379

❌ 常见错误:

  • 容器未映射端口(PORTS列为空):Python 无法访问容器;
  • 映射端口冲突(多个容器映射同一端口):导致端口被占用,连接超时。
1.2 修复端口映射(重新启动容器)

若端口未映射,删除旧容器后重新启动(以 Sentinel 为例):

# 停止并删除旧Sentinel容器docker stop sentinel1 sentinel2 sentinel3 dockerrmsentinel1 sentinel2 sentinel3# 启动Sentinel容器,映射端口到宿主机(26380/26381/26382)# 注意:--network=host 可选(单机推荐,直接使用宿主机网络,无需端口映射)docker run -d --name sentinel1 -p26380:26379 redis:sentinel docker run -d --name sentinel2 -p26381:26379 redis:sentinel docker run -d --name sentinel3 -p26382:26379 redis:sentinel# 启动Redis主节点(映射6379端口)docker run -d --name redis-master -p6379:6379 redis --requirepass"yourpassword"

步骤2:修正 Sentinel 配置(核心坑:监控的主节点是容器 IP)

单机 Docker 部署时,Sentinel 默认会监控「容器内部 IP:6379」,但 Python 运行在宿主机(或另一容器),无法访问容器内部 IP,导致 Sentinel 虽然能识别主节点,但 Python 从 Sentinel 获取到的主节点 IP 不可达。

2.1 进入 Sentinel 容器修改配置
# 进入任意Sentinel容器dockerexec-it sentinel1 /bin/bash# 编辑sentinel.conf(默认路径/etc/redis/sentinel.conf)vi/etc/redis/sentinel.conf
2.2 修改核心配置(关键!)
# 原配置(错误:监控容器内部IP) # sentinel monitor mymaster 172.17.0.2 6379 2 # 新配置(监控宿主机IP + 映射端口) sentinel monitor mymaster 宿主机IP 6379 2 # 若Redis主节点有密码,添加 sentinel auth-pass mymaster yourpassword # 启用hostname解析(可选) sentinel resolve-hostnames yes sentinel announce-ip 宿主机IP # 告诉客户端用宿主机IP连接主节点 sentinel announce-port 6379 # 主节点映射端口

✅ 宿主机 IP 查看:执行ifconfig/ip addr,取非127.0.0.1的内网 IP(如192.168.1.100)。

2.3 重启所有 Sentinel 容器
docker restart sentinel1 sentinel2 sentinel3

步骤3:修正 Python 代码(连接宿主机 IP + 映射端口)

错误代码(连容器内部 IP,必超时):
fromredis.sentinelimportSentinel# 错误:172.24.0.7是容器内部IP,Python访问不到sentinel=Sentinel([("172.24.0.7",26380),("172.24.0.6",26381),("172.24.0.5",26382)],socket_timeout=3)
正确代码(连宿主机 IP + 映射端口):
fromredis.sentinelimportSentinel# 核心:Sentinel地址是「宿主机IP + 容器映射的端口」sentinel=Sentinel([("宿主机IP",26380),# 对应sentinel1的映射端口26380("宿主机IP",26381),# sentinel2("宿主机IP",26382)# sentinel3],socket_timeout=3.0,# 延长超时时间socket_connect_timeout=3.0,retry_on_timeout=True,# 超时重试password="Sentinel密码(若有)"# 若Sentinel配置了requirepass才加)# 获取主节点(注意:主节点密码是Redis的密码,不是Sentinel的)try:master=sentinel.master_for("mymaster",password="yourpassword",# Redis主节点的密码retry_on_timeout=True)print("连接成功:",master.ping())master.set("test","docker redis sentinel")print("取值:",master.get("test"))exceptExceptionase:print("错误详情:",e)

步骤4:验证连通性(单机环境快速测试)

4.1 宿主机测试 Sentinel 连接
# 用redis-cli连接宿主机的Sentinel端口redis-cli -h 宿主机IP -p26380# 执行命令,查看是否能识别主节点127.0.0.1:26380>sentinel master mymaster# 输出中检查:# - "ip":宿主机IP(不是容器IP)# - "port":6379# - "status":ok
4.2 测试 Python 代码

运行修正后的 Python 代码,若输出连接成功:True则正常。

单机 Docker 部署的额外避坑点

  1. 使用 Docker Network 桥接模式
    若不想映射端口,可创建自定义网络,让 Python 容器(若 Python 也在 Docker 中)和 Redis/Sentinel 容器在同一网络:

    # 创建自定义网络docker network create redis-net# 启动容器时指定--network=redis-netdocker run -d --name redis-master --network=redis-net redis docker run -d --name sentinel1 --network=redis-net redis:sentinel# Python容器也加入同一网络,此时可通过容器名访问(如sentinel1:26379)
  2. Redis 保护模式
    若 Redis 主节点未设置密码,需关闭保护模式(否则拒绝外部连接):

    docker run -d --name redis-master -p6379:6379 redis --protected-mode no
  3. 端口冲突
    单机部署时,确保 26380/26381/26382/6379 端口未被其他进程占用:

    # 检查端口占用netstat-tulpn|grep26380netstat-tulpn|grep6379

最终总结(单机 Docker 核心要点)

  1. 所有容器必须映射端口到宿主机,或加入同一 Docker 网络;
  2. Sentinel 配置中监控的主节点必须是「宿主机 IP + 映射端口」,而非容器内部 IP;
  3. Python 代码必须连接「宿主机 IP + 容器映射的 Sentinel 端口」,而非容器内部 IP;
  4. 延长超时时间 + 开启重试,适配单机 Docker 的网络延迟。

按以上步骤操作后,99% 的单机 Docker 环境下MasterNotFoundError + TimeoutError都会解决。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 19:54:15

Langchain-Chatchat能否支持文档标签分类管理?

Langchain-Chatchat能否支持文档标签分类管理? 在企业知识库系统日益复杂的今天,一个核心问题逐渐浮现:当文档数量从几十份增长到成千上万时,仅靠“全文检索”是否还能保证回答的精准性?更进一步地说,不同部…

作者头像 李华
网站建设 2026/6/23 5:13:33

Langchain-Chatchat能否支持文档访问统计?

Langchain-Chatchat能否支持文档访问统计? 在企业知识管理系统日益智能化的今天,一个常见的需求浮出水面:我们能不能知道哪些文档被查得最多?员工最常问的问题背后对应的是哪几份制度文件?有没有长期“躺平”、从未被检…

作者头像 李华
网站建设 2026/6/22 19:58:06

Langchain-Chatchat结合Traefik实现动态路由

Langchain-Chatchat 结合 Traefik 实现动态路由 在企业知识管理日益复杂的今天,如何让员工快速从海量文档中获取准确信息,已成为提升组织效率的关键挑战。尤其在金融、医疗、制造等行业,数据隐私和合规性要求极高,依赖公有云的 AI…

作者头像 李华
网站建设 2026/6/22 21:04:20

【程序源代码】成人用品商城系统源码微信小程序(含源码)

关键字:成人用品商城系统源码微信小程序 前端 后端 小程序 JAVA (一)系统介绍 1.1 系统介绍 成人用品商城系统源码微信小程序(含源码) 原型是[小张送花] ,是一款同城鲜花订购 的小程序,专业提…

作者头像 李华
网站建设 2026/6/18 4:35:39

mybatis sql where a=#{a},如果a为null,会返回什么

在 MyBatis 中,当使用 #{a}占位符且参数 a为 null时,SQL 语句会变成:WHERE a null实际执行结果:不会有任何数据被查询出来,因为 SQL 中 null null的结果是 unknown(相当于 false)。详细说明1.…

作者头像 李华
网站建设 2026/6/23 12:20:48

Langchain-Chatchat能否实现问答结果HTML导出?

Langchain-Chatchat能否实现问答结果HTML导出? 在企业级AI应用日益普及的今天,一个智能问答系统是否“好用”,早已不只取决于它能不能回答问题——更关键的是,答案能不能被有效留存、分享和复用。尤其是在内部知识管理场景中&…

作者头像 李华