Redis集群如何实现读写分离_通过配置从节点读取负载均衡减轻主库压力

千磊君_1749

千磊君_1749

2026-04-09

829人浏览

原创

redis集群默认不支持读写分离,所有请求均被重定向至主节点,从节点仅用于故障转移;如需读写分离,须弃用集群客户端,改用普通主从客户端自行路由。

redis集群如何实现读写分离_通过配置从节点读取负载均衡减轻主库压力

Redis集群默认不支持读写分离

Redis官方集群(Redis Cluster)设计上不提供主从读写分离能力

所有客户端请求(包括 GET、SET)都会被重定向到负责该槽位的主节点,从节点仅用于故障转移和数据冗余。即使你连接的是从节点,READONLY 命令也不能在集群模式下生效——它只在单机主从结构中起作用。

常见错误现象:
• 客户端直连从节点并发送 GET 请求,返回 MOVED 或 ASK 重定向响应
• 使用 redis-cli -c 连集群后执行 READONLY,提示 (error) ERR unknown command `readonly`, with args beginning with:

想让从节点处理读请求,必须绕过集群协议

核心思路:放弃 redis-cli -c 或 JedisCluster / lettuce 的集群模式客户端,改用普通主从客户端分别连接各节点,并自行路由。

适用场景:
• 读多写少、对一致性要求不苛刻(允许短暂从节点延迟)
• 已有稳定主从拓扑(如 1 主 + 3 从),且未启用 Redis Cluster 模式
• 使用哨兵(Sentinel)或纯主从 + 客户端负载均衡

实操建议:
• 配置哨兵时,用 sentinel.getMasterAddressByName() 获取主节点,再通过 sentinel.slaves() 列出从节点列表
• 读请求随机选一个从节点(或加权重轮询),写请求固定发往主节点
• 在客户端代码里显式调用 READONLY(仅对单个从节点连接有效)

示例(Python redis-py):

import redis<br><br># 连主节点(写)<br>master = redis.Redis(host='mymaster', port=6379)<br><br># 连某个从节点(读)<br>slave = redis.Redis(host='slave1', port=6380)<br>slave.execute_command('READONLY')  # 必须显式声明<br>value = slave.get('key')

集群模式下“伪读写分离”的折中方案

如果已上线 Redis Cluster 且无法重构架构,只能做有限优化:

  • 客户端层面识别只读命令(如 GET、LRANGE、SCARD),对 key 做 CRC16 槽计算后,主动向对应主节点发起请求 —— 这不能分担压力,但可避免跨节点重定向开销
  • 部署多个只读代理(如 twemproxy 或自研 proxy),在 proxy 层解析命令类型与 key,将读请求转发给对应主节点的从副本(需手动维护主从映射关系)
  • 使用 Redis 7.0+ 的 REPLICA-OF + CLUSTER REPLICATE 组合,构建“集群内嵌从节点”,但该节点仍无法被集群自动识别为可读节点,需客户端绕过集群逻辑直连

性能影响:代理层增加 0.2–0.5ms RTT;手动维护主从映射易因故障转移失效,需监听 SENTINEL 事件或定期 CLUSTER NODES 扫描更新

最容易被忽略的坑:复制延迟与连接复用

从节点读取的最大风险不是配置失败,而是业务没意识到数据可能滞后。

常见疏漏:
• 用户刚注册(写主库),立刻查个人资料(读从库),查不到或查到旧头像
• 未对关键读路径加 READWRITE 切换逻辑(例如查不到时自动 fallback 到主节点)
• 复用同一连接对象执行读/写混杂操作,READONLY 状态残留导致后续写失败

建议:
• 对强一致性读(如订单详情、账户余额)始终走主节点
• 从节点连接池独立于主节点,禁止共享
• 在连接建立后立即执行 READONLY,并在每次读操作前检查连接状态(部分驱动会自动清除该状态)

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

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

下载

相关标签:

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

相关专题

更多
scripterror怎么解决
scripterror怎么解决

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

2023.10.18

949

5

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

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

2023.10.25

2700

5

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4369

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3875

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7072

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6782

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

热门下载

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

精品课程

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

共6课时 | 54.6万人学习

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

共89课时 | 133.4万人学习