Redis如何通过代理中间件访问集群_使用Twemproxy或Predixy屏蔽底层集群复杂度简化客户端逻辑

小杰酱_8715

小杰酱_8715

2026-03-22

917人浏览

原创

Twemproxy连Redis集群失败主因是未声明redis协议,需在server_stats上方配置protocol: redis;其不支持SCAN等命令,节点名须带端口和权重;已停更,新项目应避免使用。

redis如何通过代理中间件访问集群_使用twemproxy或predixy屏蔽底层集群复杂度简化客户端逻辑

Twemproxy 连不上 Redis 集群:配置里漏了 redis 协议声明

Twemproxy 默认用 memcache 协议,连 Redis 会直接返回 ERROR 或静默断连,不是密码错也不是端口错——是协议没切过去。

  • redis 协议必须在 server_stats 上方显式声明:protocol: redis
  • 不支持 Redis 的 SCAN、PUB/SUB、SCRIPT 等命令,发了会报 NOT_SUPPORTED
  • 集群节点名写法要带端口,比如 127.0.0.1:7001:1,最后的 :1 是权重,不能省
  • Twemproxy 已停止维护,新项目别踩坑;生产环境遇到连接抖动,优先查 stats 接口里的 server_eof 和 server_econnrefused 计数

Predixy 启动报 can't resolve hostname:DNS 解析发生在代理侧而非客户端

Predixy 读取配置时会立即解析所有 host,如果配置里写了 redis-cluster-01.internal 但代理机器没配 DNS 或 /etc/hosts,启动就失败,和客户端完全无关。

  • 要么把所有节点写成 IP(推荐),要么确保 Predixy 所在机器能 nslookup 通那些域名
  • auth 密码必须全局统一,Predixy 不支持 per-node 密码,设成空或错一个节点全挂
  • 它默认开启 redis_cluster_mode,但只识别 CLUSTER NODES 返回中的 master 角色,从节点被忽略——别指望它自动转发 READONLY 请求
  • 配置改完必须 kill -USR2 重载,SIGHUP 不生效

客户端用 redis-cli 直连 Twemproxy/Predixy:别碰 KEYS * 和管道批量命令

代理层对 key 做一致性哈希分片,KEYS * 这种广播型命令会被拆成 N 个请求发给所有后端,响应乱序拼接,结果不可靠;管道命令则可能因 key 落在不同节点而被代理截断或报错。

  • Twemproxy 对 MGET 支持有限:所有 key 必须落在同一分片,否则返回部分结果 + ERROR
  • Predixy 的 pipeline 要求所有命令 key 哈希一致,否则直接拒绝,错误信息是 cross slot
  • 想扫数据?老实用客户端连单个节点,别依赖代理
  • 监控时别只看代理的 uptime,重点盯 client_err 和 forward_err —— 前者是协议错,后者才是后端真实故障

为什么加了代理反而延迟更高:TCP 连接复用没开 + 持久化配置冲突

Twemproxy 默认每个 client 连接对应一个 backend 连接(redis_tcp_nodelay: true),高频小请求下建连开销压倒收益;Predixy 默认禁用 tcp_keepalive,长连接容易被中间设备回收。

  • Twemproxy 必须加 redis_max_connections: 1000 并配 redis_timeout: 400,否则连接池撑不住
  • Predixy 要开 tcp_keepalive: on 和 tcp_keepalive_idle: 60,不然 NAT 网关 5 分钟就断链
  • 两者都不支持 Redis 6+ 的 ACL,如果后端启用了 ACL,代理连上去就是 NOAUTH 错误,不是密码问题
  • 代理本身不存数据,故障时不会丢命令,但会放大后端节点波动——比如某节点卡住,所有发往它的请求都会超时堆积

代理不是银弹。真正难处理的是跨槽操作、事务、Lua 脚本这些,它们在代理层要么被拒,要么行为未定义。上线前拿真实流量跑一周,重点看 client_err 曲线和慢日志里有没有 crossslot 或 not supported 字样。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

2024.05.11

709

5

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

2025.12.18

664

18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

2026.03.31

458

17

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1049

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3400

5

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3228

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5369

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3889

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

506

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习