必须用redis.newfailoverclient连接哨兵,不能用newclient直连地址;mastername需与sentinel.conf中sentinel monitor名称完全一致(大小写敏感);sentineladdrs填哨兵地址(如127.0.0.1:26379),而非redis实例地址。

Golang微服务里说的“哨兵模式”,不是微服务自身的机制,而是指用 go-redis 或 rueidis 这类客户端连接 Redis 时,启用 Redis 原生的 Sentinel 模式——它不解决微服务节点故障,只解决 Redis 主节点宕机后的自动切换问题。
go-redis 怎么连 Sentinel?关键看 NewFailoverClient
很多开发者误以为只要启动了 Redis Sentinel 就能自动生效,其实客户端必须显式使用哨兵专用初始化方式。用错函数会导致永远连不上主节点,或切换后仍打向旧地址。
-
NewFailoverClient是 go-redis 提供的哨兵入口,不是NewClient或NewClusterClient - 必须传入哨兵节点地址(如
127.0.0.1:26379),而不是 Redis 主节点地址 -
MasterName参数要和sentinel.conf中sentinel monitor那行定义的名称完全一致(比如mymaster) - 客户端内部会定期调用
SENTINEL GET-MASTER-ADDR-BY-NAME获取当前主节点,这个过程默认每 10 秒一次,不可关闭
rueidis 的哨兵支持更轻量,但配置项容易漏
rueidis 的哨兵模式不叫 “failover”,而是通过 NewClient + SentinelOption 启用,行为更底层、更可控,但也更容易配错。
- 必须显式设置
Sentinel: rueidis.SentinelOption{Addr: "127.0.0.1:26379"},否则走的是直连逻辑 - 如果哨兵有多个(比如 3 个),
Addr只填一个即可,rueidis 会自动从该哨兵拉取其他哨兵列表 - 不支持像 go-redis 那样自动 fallback 到其他哨兵——如果填的那个哨兵挂了,整个客户端初始化就会失败
-
InitAddress字段不能指向 Redis 节点,否则会 panic:“dial tcp: lookup 127.0.0.1:6379: no such host”(因为哨兵模式下它只跟哨兵通信)
集群模式和哨兵模式在 Golang 里根本不能混用
有人试图把 sentinel 和 cluster 配置同时塞进同一个客户端,结果要么报错,要么静默降级成直连——这是设计层面的互斥,不是 bug。
-
go-redis:用了NewFailoverClient就不能再用ClusterClientOption;反之亦然 -
rueidis:NewClusterClient和哨兵选项是两个完全独立的构造路径,共用一个 struct 会触发编译错误 - Redis Cluster 自带故障转移能力,不需要额外部署 Sentinel;反过来,Sentinel 管理的是传统主从结构,无法识别 Cluster 的 slot 分片拓扑
- 线上切架构时,必须改代码、改配置、重启服务——没有运行时热切换方案
真正容易被忽略的点是:哨兵模式下,客户端获取主节点地址的过程是异步且有缓存的。如果主从刚完成切换,而客户端还没来得及轮询到新地址,那一小段时间的写请求就会失败。这不是配置问题,而是协议层固有延迟,需要应用层加重试或降级逻辑兜底。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











