Redis Sentinel 不支持用户自定义 Pub/Sub,仅允许内部监听 __sentinel__:hello 频道;客户端必须连接实际 Redis 数据节点(非 Sentinel)才能正常使用发布订阅功能。

Redis Sentinel 本身不接管或转发 PUBLISH/SUBSCRIBE 流量,所有发布订阅操作仍走普通 Redis 连接;但 Sentinel 会通过自己的 __sentinel__:hello 频道广播状态变更,这是唯一与 Pub/Sub 直接相关的机制。
为什么不能直接用 Sentinel 地址做 Pub/Sub 客户端?
客户端连接 Sentinel 节点(默认端口 26379)后,执行 SUBSCRIBE 会报错:(error) ERR only the following commands are accepted in sentinel mode: AUTH, HELLO, PING, SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE。也就是说,Sentinel 只允许极少数命令,且其 SUBSCRIBE 仅用于监听自身内部频道(如 __sentinel__:hello),不支持用户自定义频道。
常见错误现象:
- 误把 Sentinel 地址当 Redis 主节点地址传给业务代码的 Pub/Sub 客户端,导致连接成功但
PUBLISH失败或静默丢弃 - 在 Sentinel 连接上调用
SUBSCRIBE mychannel,返回错误而非阻塞等待,且无任何日志提示
如何监听 Sentinel 的故障转移事件?
Sentinel 节点会在所有被监控的主节点上自动发布心跳和状态变更消息到固定频道 __sentinel__:hello。你必须连接到**实际的 Redis 主/从节点**(不是 Sentinel),再订阅该频道才能收到通知。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
实操要点:
- 连接任意一个在线的 Redis 数据节点(
6379等),而非 Sentinel 端口 - 执行
SUBSCRIBE __sentinel__:hello—— 注意是两个下划线开头结尾 - 收到的消息格式为三元组:
["message", "__sentinel__:hello", "s1,192.168.1.100,26379,..."],其中第三个字段是 CSV 格式的哨兵元数据,含 IP、端口、runid、epoch 等 - 当发生 failover 时,新 Master 会收到包含
+"odown"或+"sdown"字段的广播;也可结合PUBSUB NUMSUB __sentinel__:hello查看当前有多少 Sentinel 在广播
业务频道该连谁?主节点还是从节点?
Pub/Sub 是「fire-and-forget」模式,不保证消息持久化或顺序,也不参与复制。因此:
- 所有订阅者必须连接到**同一个数据节点**(通常是当前 Master),否则无法收到彼此发布的消息 —— 因为频道状态不跨节点同步
- 如果连接的是 Slave 节点并启用
replica-read-only yes(默认),PUBLISH会直接报错:(error) READONLY You can't write against a read only replica. - 即使强制开启
replica-read-only no,Slave 上发布的消息也不会同步给 Master 或其他 Slave,相当于创建了一个孤立频道 - 正确做法:业务客户端通过 Sentinel 获取当前 Master 地址(
SENTINEL get-master-addr-by-name mymaster),然后连接该地址进行 Pub/Sub
容易被忽略的兼容性陷阱
Redis 6+ 引入了 ACL,而 Sentinel 广播使用的 __sentinel__:hello 频道对用户不可见 —— 即使你有 +pubsub 权限,也无法手动 PUBLISH 到它,且 ACL 规则不作用于该频道。但如果你在业务频道中使用了带权限的用户:
- 确保该用户有
+publish和+subscribe权限,否则SUBSCRIBE会静默失败(无错误,但收不到消息) - 不要在
redis.conf中设置notify-keyspace-events并期望它影响 Pub/Sub —— 它只触发__keyspace@N__类频道,与业务频道无关 - 集群模式(Redis Cluster)下 Pub/Sub 不可用,但 Sentinel 模式下完全可用 —— 这一点常被混淆
真正要小心的,是把「Sentinel 自动发现」和「Pub/Sub 消息路由」当成一回事。它们共用同一种底层机制(都是 TCP 连接 + 频道匹配),但运行在完全隔离的上下文中:一个是控制平面的协调信道,一个是数据平面的业务信道。

















