在查看redis的源代码时,我发现 sentinelRedisInstance
是 SRI_SENTINEL
, sentinelReconnectInstance
不会初始化其 link->pc
不会订阅频道 "__sentinel__:hello"
,如下代码所示。
void sentinelReconnectInstance(sentinelRedisInstance *ri) {
...
if ((ri->flags & (SRI_MASTER|SRI_SLAVE)) && link->pc == NULL) {
...
retval = redisAsyncCommand(link->pc,
sentinelReceiveHelloMessages, ri, "%s %s",
sentinelInstanceMapCommand(ri,"SUBSCRIBE"),
SENTINEL_HELLO_CHANNEL);
...
因此,我认为哨兵无法从这个频道得到任何信息 "__sentinel__:hello"
.
然而,在redis的文档中,它说
每个哨兵都订阅了发布/子频道sentinel:hello of 每一个大师和复制品,寻找未知的哨兵。当检测到新的哨兵时,它们将被添加为此主机的哨兵。
我想这意味着所有的哨兵都订阅了这个频道 "__sentinel__:hello"
,但我在redis的源代码中看不到任何相应的实现。
1条答案
按热度按时间vcirk6k61#
如果我错了就纠正我。
sentinelRedisInstance
类型SRI_MASTER
连接到这个哨兵监视的主节点,sentinelRedisInstance
类型SRI_SLAVE
连接到从属节点,并且sentinelRedisInstance
类型SRI_SENTINEL
连接到其他哨兵。不需要订阅sentinel的通道,相反,sentinel只需要订阅主节点和从节点的通道。如果有一个新的哨兵,它将发布hello消息到主和从的通道。以便其他哨兵发现他们。