如何在Node.js中通过ioredis实现Redis哨兵自动重连

酷宇吖_7299

酷宇吖_7299

2026-09-21

490人浏览

原创

哨兵连接需禁用就绪检查并自定义重试策略,传入正确sentinels数组,监听reconnecting/close事件清理连接,读写分离不复用实例,故障转移须用sentinel failover触发。

如何在node.js中通过ioredis实现redis哨兵自动重连

哨兵连接配置必须显式启用 enableReadyCheckretryStrategy

ioredis 默认在连接哨兵集群后会执行 READY 检查,但若哨兵尚未完成故障转移或主节点不可达,它会直接抛出 Redis is loading the dataset in memoryConnection is closed 并终止重连流程。必须手动关闭就绪检查,并提供自定义重试逻辑:

  • enableReadyCheck: false —— 否则首次连接失败即退订所有重连尝试
  • retryStrategy: (times) => Math.min(times * 100, 3000) —— 避免指数退避过快耗尽重试次数(ioredis 默认只试 20 次,且第 1 次延迟 200ms,对哨兵切换太激进)
  • 不要依赖 connectTimeout 控制重连节奏,它只影响单次 TCP 建连,不影响哨兵发现主节点的周期

哨兵初始化时必须传入 sentinels 数组而非单个地址

ioredis 的哨兵模式不是“连一个哨兵再让它转发”,而是并行向所有哨兵节点发送 SENTINEL GET-MASTER-ADDR-BY-NAME 请求,靠多数派响应来确认当前主节点。传错格式会导致永远无法发现主库:

  • ✅ 正确:sentinels: [{ host: 'sentinel1', port: 26379 }, { host: 'sentinel2', port: 26379 }]
  • ❌ 错误:host: 'sentinel1' + port: 26379(这会被当普通 Redis 实例直连)
  • ❌ 错误:sentinels: 'sentinel1:26379'(字符串不被解析,静默降级为单节点模式)
  • 哨兵列表建议至少 3 个,且与 Redis 实例不在同一物理机——否则网络分区时可能集体失联

主节点变更后,旧连接不会自动关闭,需监听 closereconnecting 事件做清理

ioredis 在检测到主节点变化后,会新建连接并切换内部命令分发目标,但旧连接仍保持 connected 状态(TCP 未断),导致后续写操作发到已下线的节点而报错 READONLY You can't write against a read only replica

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
  • 务必监听 client.on('reconnecting', () => { /* 清空待发队列、拒绝新请求 */ })
  • close 事件中调用 client.quit()(避免连接泄漏)
  • 读写分离场景下,不要复用同一个 Redis 实例做读+写——哨兵模式下 readonly: true 仅控制命令路由,不保证连接对象本身只读
  • 可通过 client.status 判断当前是否处于重连中(值为 reconnecting),用于熔断业务请求

测试故障转移必须触发 SENTINEL FAILOVER 而非直接 kill 进程

本地模拟哨兵切换时,仅 kill -9 主节点进程会导致哨兵状态不同步:从节点可能未完成复制偏移同步,哨兵投票超时,最终 GET-MASTER-ADDR-BY-NAME 返回空。真实故障转移需走哨兵协议:

  • redis-cli -p 26379 SENTINEL FAILOVER mymaster 手动触发,确保哨兵完成选举和配置广播
  • 观察 ioredis 日志是否出现 Connecting to Redis server at xxx:6379(新主地址),而非反复连旧地址
  • 若日志卡在 Connecting to Redis server at <old-master></old-master>,说明哨兵未更新配置或客户端未收到通知——检查 sentinel monitor mymaster 中的 quorum 设置是否满足(需 ≥ 哨兵数/2+1)
  • 生产环境建议开启 sentinel down-after-milliseconds ≤ 5000,避免检测延迟过长

哨兵自动重连真正难的不是配置参数,而是理解 ioredis 如何把“连接管理”、“节点发现”、“命令路由”三件事拆成不同生命周期;很多问题其实发生在主节点切完之后的那几秒——连接还活着、命令还在发、但没人告诉应用层该停手了。

相关文章

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

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

下载

相关标签:

redis js node.js node

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

相关专题

更多
node.js调试
node.js调试

node.js调试可以使用console.log()输出调试信息、断点调试和第三方调试工具。详细介绍:1、console.log()输出调试信息,通过在代码中插入console.log()语句,开发人员可以在控制台输出变量的值、函数的执行结果等信息,以便观察代码的执行流程和状态;2、断点调试,可以在代码中设置断点,以便在特定位置暂停代码的执行,观察变量的值和执行流程等。

2023.09.19

8629

8

JavaScript 全栈开发基础(Node.js + 前端)
JavaScript 全栈开发基础(Node.js + 前端)

本专题系统介绍 JavaScript 在全栈开发中的核心知识结构,涵盖 Node.js 基础、Express/Koa 接口构建、前端交互设计、模块化与包管理、数据库连接、前后端数据通信与部署流程。通过完整项目示例,帮助学习者掌握从浏览器到服务器的一体化开发能力,实现真正意义上的全栈入门。

2025.11.26

354

14

Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

2026.02.10

721

17

JavaScript Node.js流处理与高效数据管道构建实践
JavaScript Node.js流处理与高效数据管道构建实践

本专题聚焦 Node.js 在大规模数据处理场景中的应用,系统讲解 Stream 流机制、背压控制、管道(Pipe)处理以及文件与网络数据流的高效传输方式。内容包括可读流、可写流、双工流与转换流的实现原理,并结合实际案例构建高性能数据处理管道,帮助开发者提升数据处理效率与系统吞吐能力。

2026.04.07

264

13

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

2026.06.16

438

8

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

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

2023.11.02

3989

19

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

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

2023.11.14

3495

11

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

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

2024.04.02

6172

6

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

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

2024.04.07

583

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习