Redis怎样实现集群的在线平滑扩容_利用reshard命令迁移Slot并添加新Master节点

胖宇吖_9359

胖宇吖_9359

2026-03-24

647人浏览

原创

reshard 搬的是 Slot 而非 Key,先重分配 16384 个 Slot,再由集群自动触发 Key 迁移;需待“All keys transferred”提示才完成,且新节点须完成注册、握手、身份确认三步并满足网络与配置要求。

redis怎样实现集群的在线平滑扩容_利用reshard命令迁移slot并添加新master节点

reshard 命令到底在搬什么?

它搬的是 Slot,不是 Key。Redis 集群扩容时,reshard 不会直接移动数据,而是把某个范围的 Slot(共 16384 个)从旧节点重新分配给新节点;Key 的迁移发生在 Slot 分配完成后,由集群自动触发 MOVE 或 ASK 重定向逻辑驱动。

常见错误现象:CLUSTER NODES 显示 Slot 已分配给新节点,但客户端仍报 MOVED 错误、请求被重定向回老节点——说明 Slot 迁移尚未真正完成,只是“计划已提交”,还没执行完数据搬运。

  • 必须等 redis-cli --cluster reshard 输出 “All keys transferred” 才算迁移结束
  • 迁移期间,目标节点必须处于 fail? no 状态,且不能是 myself,master 之外的角色(比如不能是 slave)
  • 源节点和目标节点的 cluster-enabled yes 必须一致,否则 reshard 会静默失败

添加新 Master 节点前必须做的三件事

新节点不是加进集群就自动参与 Slot 分配的。它得先“注册”,再“握手”,最后“确认身份”。漏掉任一环,reshard 会找不到目标节点。

  • 启动新节点时配置文件里必须有 cluster-enabled yes 和唯一 cluster-config-file
  • 用 redis-cli --cluster add-node 完成握手;注意顺序:新节点地址写前面,已有节点写后面
  • 新节点默认是 master,但角色未被集群承认——需用 CLUSTER NODES 检查其状态是否含 master 且无 noaddr 标记

reshard 过程中为什么卡住不动?

最常见原因是网络或权限问题导致 Key 迁移阻塞,而非命令本身出错。此时 redis-cli --cluster reshard 看似在运行,实则停在某 Slot 的搬运上。

典型错误信息:Error moving key xxx: Connection refused 或长时间无输出后超时退出。

  • 检查新老节点之间 6379(服务端口)和 16379(集群总线端口)是否双向互通(很多人只开了 6379)
  • 确认新节点 maxmemory 设置足够,否则迁移 Key 时因内存满而拒绝接收
  • 避免在迁移期间执行 FLUSHALL 或大量写入,会加剧迁移延迟甚至触发超时重试失败

迁移完成后,客户端连接要不要改?

不用改连接串,也不用重启应用。Redis 集群靠客户端自己发现拓扑变更——前提是客户端支持集群协议并开启了自动刷新机制。

但容易被忽略的一点:很多老版本 Jedis、StackExchange.Redis 默认不主动拉取 CLUSTER SLOTS,得手动触发或配置刷新间隔。

  • Java Jedis:需使用 JedisCluster,且构造时传入非零 refreshPeriod(单位 ms),否则拓扑变更后仍发请求到旧节点
  • .NET StackExchange.Redis:设置 ConnectTimeout 和 SyncTimeout 后,它会在收到 MOVED 时自动更新内部 slot map,但首次发现可能慢 1–2 秒
  • Python redis-py-cluster:必须调用 StrictRedisCluster.reset_cache() 强制刷新,否则缓存的 slot 映射不会更新

Slot 数量固定、节点角色可变,这是集群平滑性的基础;但“平滑”不等于“无感”,客户端适配那层,往往才是线上扩容翻车的第一现场。

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

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

下载

相关标签:

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

相关专题

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

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

2023.10.18

1049

5

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

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

2023.10.25

3380

5

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

710

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

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

2025.11.17

553

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

323

6

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

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

2023.11.02

4869

19

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

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

2023.11.14

4435

11

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

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

2024.04.02

8552

6

热门下载

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

精品课程

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

共6课时 | 54.7万人学习

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

共89课时 | 134.1万人学习